Hao Shan's Studio.

【Tech】yolo训练指导文档

Word count: 2.7kReading time: 12 min
2025/03/03
loading

本文章介绍两个主流yolo版本的训练过程,其余版本大多与二者之一类似,如使用其他版本,本文章也可做以参考

PS:为保证大家有足够的收获,本教程并未详细指出训练过程中易犯错的地方,鼓励大家在遇到问题时自行查阅资料解决,或联系作者解决

1 yolov5训练

1.1 标注

查看数据标注文档

1.2 数据集结构整理

①在项目根目录下,进入”data“文件夹,创建一个文件夹用于存储数据(下以”mydata“为这个文件夹的名字举例)

②在mydata文件夹下,创建以下两个文件夹:”Annotations“、”images“

最终,文件结构应当如下所示

1
2
3
4
5
6
7
8
9
yolov5
|——somefiles
……
|——data
|——somefiles
……
|——mydata
|——images
|——Annotations

1.3 数据集划分

利用现有脚本split_train_val.py,将数据集划分为训练接、验证集、测试集(比例可调整)

脚本链接:数据集划分脚本

(脚本有成的,保存在mydata路径下即可使用,但建议阅读代码,逐行理解,之后需要更改)

该脚本无参数,直接运行即可

运行脚本完毕后,会生成 ImagesSets\Main 文件夹,且在其下生成 测试集、训练集、验证集,存放图片的名字(无后缀.jpg)

1.4 整理数据路径

运行脚本write_img_path.py,将训练接、验证集、测试集的数据路径整合为三个文本文件

脚本链接:整理数据路径

❗️需要保存在mydata路径下并将代码64行按照原格式,修改为你电脑中的对应路径

运行脚本完毕后,会生成dataSet_path文件夹,里面存储这三个txt文件,分别为三部分数据集的路径整合文件

1.5 数据格式转换

这里同样通过脚本实现json_to_yolo.py,目的是将现有标注格式转换为yolov5可读取的格式(txt)

脚本链接:数据格式转换

❗️需要保存在mydata路径下并将代码55行按照原格式,修改为你的模型所要检测的类别

运行脚本完毕后,会生成labels文件夹,里面存储着转换好的标注文件

至此,完成上述所有工作后,我们应当得到一个结构如下的数据集:

(这里数据集名为”data_show“,其实就是上面我们说的”mydata“)

![image-20240919150003641](/Users/shanhao/Library/Application Support/typora-user-images/image-20240919150003641.png)

1.6 数据集配置文件

在”data“文件夹下创建一个.yaml类型的文件(下面以”mydata.yaml”为例)

文件内容按照如下格式撰写

1
2
3
4
5
6
7
8
train: path_to_mydata/dataSet_path/train.txt //修改1:改为训练集整合文件的路径
val: path_to_mydata/dataSet_path/val.txt //修改2:改为验证集整合文件的路径

#number of classes
nc: 2 //修改3:改为类别数

#class names
names: ["weed","people"] //修改4:改为类别名称,用逗号分隔

1.7 修改训练配置文件

需要修改网络加载数据的路径,修改内容如下:

utils/dataloaders.py路径下,修改如下代码的内容

(小技巧:在文件里搜”sb“可以直接查到这一行)

1
sa, sb = 'path_to_mydata/images/', 'path_to_mydata/data_show/labels/' # /images/, /labels/ substrings

需要把后面的两个路径分别更新为你配置好的数据集中的”images“和”labels“的路径

1.8 开始训练

运行train.py就可以了,怎么运行?

train.py中有如下部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')#超参数路径
parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
parser.add_argument('--noplots', action='store_true', help='save no plot files')
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache', type=str, nargs='?',const='ram', help='image --cache ram/disk')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
parser.add_argument('--name', default='exp', help='save to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
parser.add_argument('--seed', type=int, default=0, help='Global training seed')
parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

# Logger arguments
parser.add_argument('--entity', default=None, help='Entity')
parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='Upload data, "val" option')
parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval')
parser.add_argument('--artifact_alias', type=str, default='latest', help='Version of dataset artifact to use')

这些运行train.py时的所有参数

直接python train.py固然可以按照参数的默认值运行训练程序,但为了训练我们自己的数据集,这里我们需要修改一些参数

至于这些参数是什么,需要大家阅读上面这一部分的参数设置代码,自行判断

2 yolov10模型训练指导文档

2.1 标注

查看数据标注文档

2.2 数据集结构整理

①在项目根目录下,创建一个“DateSet”文件夹并进入,创建一个文件夹用于存储数据(下以”mydata“为这个文件夹的名字举例)

②在mydata文件夹下,创建以下两个文件夹:”Annotations“、”images“

最终,文件结构应当如下所示

1
2
3
4
5
6
7
yolov10
|——somefiles
……
|——DataSet
|——mydata
|——images
|——Annotations

2.3 数据集划分

利用现有脚本split_train_val.py,将数据集划分为训练接、验证集、测试集(比例可调整)

脚本链接:数据集划分脚本

(脚本有成的,保存在mydata路径下即可使用,但建议阅读代码,逐行理解,之后需要更改)

该脚本无参数,直接运行即可

运行脚本完毕后,会生成 ImagesSets\Main 文件夹,且在其下生成 测试集、训练集、验证集,存放图片的名字(无后缀.jpg)

2.4 整理数据路径

运行脚本write_img_path.py,将训练接、验证集、测试集的数据路径整合为三个文本文件

脚本链接:整理数据路径

❗️需要保存在mydata路径下并将代码64行按照原格式,修改为你电脑中的对应路径

运行脚本完毕后,会生成dataSet_path文件夹,里面存储这三个txt文件,分别为三部分数据集的路径整合文件

2.5 数据格式转换

这里同样通过脚本实现json_to_yolo.py,目的是将现有标注格式转换为yolov5可读取的格式(txt)

脚本链接:数据格式转换

❗️需要保存在mydata路径下并将代码55行按照原格式,修改为你的模型所要检测的类别

运行脚本完毕后,会生成labels文件夹,里面存储着转换好的标注文件

至此,完成上述所有工作后,我们应当得到一个结构如下的数据集:

(这里数据集名为”data_show“,其实就是上面我们说的”mydata“)

![image-20240919150003641](/Users/shanhao/Library/Application Support/typora-user-images/image-20240919150003641.png)

2.6 数据集配置文件

在”data“文件夹下创建一个.yaml类型的文件(下面以”mydata.yaml”为例)

文件内容按照如下格式撰写

1
2
3
4
5
6
7
8
train: path_to_mydata/dataSet_path/train.txt //修改1:改为训练集整合文件的路径
val: path_to_mydata/dataSet_path/val.txt //修改2:改为验证集整合文件的路径

#number of classes
nc: 2 //修改3:改为类别数

#class names
names: ["weed","people"] //修改4:改为类别名称,用逗号分隔

2.7 开始训练

这里需要自行撰写一个简单的训练脚本

1
2
3
4
5
6
7
8
9
10
from ultralytics import YOLOv10

model = YOLOv10('yolov10n.yaml').load('yolov10n.pt')
# Train the model
results = model.train(data='./DataSet/mydata.yaml',
epochs=200,
imgsz=640,
batch=16,
optimizer='SGD',lr0=0.01,device=0)

这里的model = YOLOv10('yolov10n.yaml').load('yolov10n.pt')是指定预训练模型的语句,可以根据实际情况修改

除此之外,需要修改的还有model.train()方法的参数:

  • data:数据配置文件的路径
  • epochs:训练轮次
  • imgsz:图像尺寸
  • batch:训练的batch-size
  • optimizer:
    • SGD: 随机梯度下降法
    • Adagrad: 自适应学习率梯度下降法
    • RMSprop: Adagrad的改进
    • Adadelta: Adagrad的改进
    • Adam: RMSprop结合Momentum
    • Adamax: Adam增加学习率上限
    • SparseAdam: 稀疏版的Adam
    • ASGD: 随机平均梯度下降
    • Rprop: 弹性反向传播
    • LBFGS: BFGS的改进
  • lr:学习率
  • device:训练所用显卡编号,若为cpu则参数应当为”cpu”
CATALOG
  1. 1. 1 yolov5训练
    1. 1.1. 1.1 标注
    2. 1.2. 1.2 数据集结构整理
    3. 1.3. 1.3 数据集划分
    4. 1.4. 1.4 整理数据路径
    5. 1.5. 1.5 数据格式转换
    6. 1.6. 1.6 数据集配置文件
    7. 1.7. 1.7 修改训练配置文件
    8. 1.8. 1.8 开始训练
  2. 2. 2 yolov10模型训练指导文档
    1. 2.1. 2.1 标注
    2. 2.2. 2.2 数据集结构整理
    3. 2.3. 2.3 数据集划分
    4. 2.4. 2.4 整理数据路径
    5. 2.5. 2.5 数据格式转换
    6. 2.6. 2.6 数据集配置文件
    7. 2.7. 2.7 开始训练