YOLOV5训练代码train.py训练参数解析

(181) 2024-05-20 20:01:01

一,前言

yolov5项目代码中,train.py是用于模型训练的代码,是yolov5中最为核心的代码之一,而代码中的训练参数则是核心中的核心,只有学会了各种训练参数的真正含义,才能使用yolov5进行最基本的训练。

本文讲解的yolov5版本为目前最新的V7.0
yolov5官方GitHub地址: https://github.com/ultralytics/yolov5

二,训练参数解析

yolov5中train.py采用python内置的命令行选项、参数和子命令解析器模块argparse,对用户自定义的命令行选项,参数和子命令进行解析,然后将解析出来的选项,参数和子命令传给代码中需要用到的地方。

注:关于argparse模块的基本使用,可以看我的另一篇博客:
链接: python基础之命令行参数解析模块:argparse.ArgumentParser(add_argument)
强烈建议先学习一下argparse模块的基本使用,要不然模块中有些参数和用法会看不懂,或者边学边看,边看边学。

1,–weights

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')

解析: 模型预训练权重路径,默认为ROOT / ‘yolov5s.pt’
命令行用法:python train.py --weights yolov5s.pt
注:
1,若在命令行中使用"–weights" 参数,可指定预训练权重文件(路径);
2,若在命令行不使用"–weights" 参数,则预训练权重文件(路径)为自定义的default默认值;
3,若既使用命令行"–weights" 参数,又自定义了default默认值,则模型使用的是命令行"–weights" 参数指定的预训练权重文件(路径)
4,若不进行预训练,可使用"–weights" 参数指定一个空字符串:“”,或者将default默认值设置为空字符串:“”;
5,若使用yolov5s.pt、yolov5m.pt、yolov5l.pt、yolov5x.pt等yolov5官方预训练权重文件,若没有下载,代码会自动帮你下载,放在ROOT路径下,也就是你yolov5工程项目路径下,但是下载速度一般会很慢,建议先去yolov5官方GitHub中下载好。

2,–cfg

parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
python train.py --cfg yolov5s.pt**

解析:模型结构文件路径,默认为空
命令行用法:python train.py --cfg models/yolov5s.yaml
注:
1,在已经使用"–weights" 参数加载了预训练权重的情况下,可以不使用该参数,模型结构直接使用预训练权重中保存的模型结构;
2,不使用"–weights" 参数使用"–cfg" 参数,表示模型从头开始训练,不进行预训练;
3,“–weights” 参数和"–cfg" 参数必须要有一个,不然代码会报错。

3,–data

 parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')

解析:数据集配置文件路径
命令行用法:python train.py --data data/coco128.yaml
注:
1,如果没有检查到数据集,代码会自动下载coco128数据集,也可以自己下载;
2,把yolov5官方的数据集配置文件中的数据集下载部分内容给注释掉,代码则不会自动下载。

4,–hyp

 parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')

解析:训练超参数配置文件路径
命令行用法:python train.py --hyp data/hyps/hyp.scratch-low.yaml

5,–epochs

parser.add_argument('--epochs', type=int, default=100, help='total training epochs')

解析:训练迭代轮数
命令行用法:python train.py --epochs n
注:
1,epochs表示训练整个训练集的次数,epoch为n表示将整个训练集训练n次。

6,–batch-size

parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')

解析:训练批量大小
命令行用法:python train.py --batch-size n
注:
1,训练批量大小表示每个 mini-batch 中的样本数,batch-size设置为n表示一次性从训练集中获取n张图片送入模型进行训练;
2, batch-size大小需要根据自己设备GPU的资源合理设置。

7,–imgsz, --img, --img-size

parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')

解析:模型训练和验证时输入图片的尺寸
命令行用法:python train.py --imgsz/img/–img-size 640

8,–rect

parser.add_argument('--rect', action='store_true', help='rectangular training')

解析:矩形训练,默认关闭
命令行用法:python train.py --rect
注:
1,矩形训练过程中会对输入的矩形图片进行预处理,通过保持原图高宽比进行resize后,对resize后的图片进行填充,填充到32的最小整数倍,然后进行矩形训练,减少训练时间。

9,–resum

parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')

解析:断点续训,默认关闭
命令行用法:python train.py ----weights /path/last.pt --rect
注:
1,断点续训就是从上一个训练任务中断的地方继续训练,直至训练完成;
2,当模型按指定的epoch训练完成后,则无法进行断点续训;
3,需要搭配"–weights" 参数使用,指定训练中断保存的最后一次模型权重文件。

10,–nosave

parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')

解析:只保留最后一次训练的权重,默认关闭
命令行用法:python train.py --nosave

11,–noval

parser.add_argument('--noval', action='store_true', help='only validate final epoch')

解析:只对最后一次训练进行验证,默认关闭
命令行用法:python train.py --noval

12,–noautoanchor

parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')

解析:关闭自动计算锚框功能,默认关闭
命令行用法:python train.py --noautoanchor
注:
1,yolov5采用的是kmeans聚类算法来计算anchor box的大小和比例,最终自动计算出一组最合适训练的锚框。

13,–noplots

parser.add_argument('--noplots', action='store_true', help='save no plot files')

解析:不保存可视化文件
命令行用法:python train.py --noplots

14,–evolve

parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')

解析:使用超参数优化算法进行自动调参,默认关闭
命令行用法:python train.py --evolve n
注:
1,yolov5采用遗传算法对超参数进行优化,寻找一组最优的训练超参数;
2,开启后传入参数n,训练每迭代n次进行一次超参数进化;
3,开启后不传入参数,则默认为const=300。

15,–bucket

parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')

解析:从谷歌云盘下载或上传数据
命令行用法:python train.py --bucket gsutil bucket
注:
1,该参数用于指定 gsutil bucket 的名称,其中 gsutil 是 Google 提供的一个命令行工具,用于访问 Google Cloud Storage(GCS)服务;
2,GCS 是 Google 提供的一种对象存储服务,用户可以将任意数量和类型的数据存储在其中。用户可以通过 gsutil 命令行工具上传、下载、复制、删除等操作 GCS 中的数据。在训练模型时,如果需要使用 GCS 中的数据集,就需要指定 bucket 的名称。

16,–cache

parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/disk')

解析:缓存数据集,默认关闭
命令行用法:python train.py --cache
注:
1,缓存数据集图片到内存中,训练时模型直接从内存中读取,加快数据加载和训练速度
2,若"–cache"参数指定值,可以指定的;值:ram/disk;
3,若"–cache"参数不指定值,则默认为const=‘ram’。

17,–image-weights

parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')

解析:对数据集图片进行加权训练,默认关闭
命令行用法:python train.py --image-weights --rect
注:
1,需要搭配"–rect"参数一起使用。

18,–device

parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

解析:选择训练使用的设备处理器,CPU或者GPU,默认为空
命令行用法:python train.py --device 0/0,1,2,3/cpu
注:
1,默认为空时,代码会进行自动选择,若检查到设备有GPU则优先使用GPU进行训练,若没有则使用CPU进行训练;
2,使用GPU训练时,0,1,2,3分别表示第1,2,3,4张GPU;
3,设备没有GPU,使用CPU训练:
python train.py --device cpu
4,设备有单个GPU,使用单个GPU训练:
python train.py --device 0
5,设备有多个GPU,使用单个GPU训练:
python train.py --device 0 (使用第1张GPU训练);
python train.py --device 2 (使用第3张GPU训练);
6,设备有多个GPU,使用多个GPU训练:
python train.py --device 0,1,2(使用第1,2,3张GPU训练训练)。

19,–multi-scale

parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')

解析:多尺度训练,默认关闭
命令行用法:python train.py --multi-scale
注:
1,开启多尺度训练,训练过程中每次输入图片会放大或缩小50%。

20,–single-cls

parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class'

解析:单类别训练,默认关闭
命令行用法:python train.py --single-cls

21,–optimizer

parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')

解析:选择训练使用的优化器,默认使用SGD
命令行用法:python train.py --optimizer SGD
注:
1,choices=[‘SGD’, ‘Adam’, ‘AdamW’]表示只能选择’SGD’, ‘Adam’, 'AdamW’这三种优化器,当然也可以添加自定义的优化器,但代码中其他地方也要做相应的更改。

22,–sync-bn

parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')

解析:使用SyncBatchNorm(Synchronized Batch Normalization:同步批量归一化),只有在使用DDP模式(分布式训练)时有效,默认关闭
命令行使用方法:python train.py --sync-bn
注:
1,关闭时,训练使用传统的批量归一化;
2,在传统的批归一化(Batch Normalization,简称 BN)中,每个 GPU 会对数据的均值和方差进行单独计算,因此在多 GPU 训练时,每个 GPU 计算的均值和方差可能会不同,导致模型训练不稳定。为了解决这个问题,SyncBN 技术将 BN 的计算放在了整个分布式训练过程中进行,确保所有 GPU 上计算的均值和方差是一致的,从而提高模型训练的稳定性和效果,但同时也会增加训练时间和硬件要求,因此需要根据具体的训练数据和硬件资源来决定是否使用 SyncBN。

23,–workers

parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')

解析:设置Dataloader使用的最大numworkers,默认设置为8
命令行使用方法:python train.py --workers 8
注:
1,Dataloader中numworkers表示加载处理数据使用的线程数,使用多线程加载数据时,每个线程会负责加载和处理一批数据,数据加载处理完成后,会送入相应的队列中,最后主线程会从队列中读取数据,并送入GPU中进行模型计算;
2,numworkers为0表示不使用多线程,仅使用主线程进行数据加载和处理。

24,–project

parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')

解析:设置每次训练结果保存的主路径名称
命令行用法:python train.py --project ‘runs/train’
注:
1,这里主路径的意思是,你每次训练会生成一个单独的子文件夹,主路径就是存放你这些单独子文件夹的地方,可以自己命名,例如’runs/train’。比如说你第一次训练保存结果的文件夹是exp1,第二次是exp2,第三次是exp3,则这些子文件夹都会放在主路径’runs/train’下面。

25,–name

parser.add_argument('--name', default='exp', help='save to project/name')

解析:设置每次训练结果保存的子路径名称
命令行用法:python train.py --name exp
1,这里子路径的意思是就是上面在’–project’中提到的每次训练生成的单独的子文件夹,可以自己命名,例如’exp’。你每次训练生成的模型权重文件、可视化结果以及其它结果文件保存的地方。

26,–exist-ok

parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')

解析:是否覆盖同名的训练结果保存路径,默认关闭,表示不覆盖
命令行用法:python train.py --exist-ok
注:
1,不使用’–exist-ok’参数时,如果’–name’指定的名称不变,比如’exp’,每次训练会按顺序新建文件夹,例如exp1、exp2、exp3、… 、expn;
2,使用’–exist-ok’参数时,如果’–name’指定的名称不变,比如’exp’,每次训练则不会新建文件夹,训练结果会覆盖原先文件夹中保存的所有结果。

27,–quad

parser.add_argument('--quad', action='store_true', help='quad dataloader')

解析:是否使用quad dataloader,默认关闭
命令行用法:python train.py --quad
注:
quad dataloader 是一种数据加载器,它可以并行地从磁盘读取和处理多个图像,并将它们打包成四张图像,从而减少了数据读取和预处理的时间,并提高了数据加载的效率。

28,–cos-lr

parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')

解析:训练学习率衰减策略使用余弦退火策略,默认关闭
命令行用法:python train.py --cos-lr
注:
1,余弦退火策略在训练初期加快学习速度,训练后期减小学习率,从而更好地学习数据的分布,避免模型陷入局部最优。

29,–label-smoothing

parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')

解析:训练使用标签平滑策略,防止过拟合
命令行用法:python train.py --label-smoothing
注:
1,默认为0.0,即标签平滑策略使用的epsilon为0.0;
2,将标签平滑策略使用的epsilon设置为0.1:
python train.py --label-smoothing 0.1
表示在每个标签的真实概率上添加一个 epsilon=0.1的噪声,从而使模型对标签的波动更加鲁棒;
3,–label-smoothing 参数的值应该根据具体的数据集和模型来调整,以达到最优的训练效果。

30,–patience

parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')

解析:训练使用EarlyStopping策略,防止过拟合
命令行用法:python train.py --patience 100
注:
1,‘–patience’参数指定为整数n时,表示模型在训练时,若连续n个epoch验证精度都没有提升,则认为训练已经过拟合,停止训练。’–patience’可根据具体的模型和数据集进行调整。

31,–freeze

parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')

解析:训练使用冻结训练策略,默认关闭
命令行用法:python train.py --freeze
注:
1,冻结训练是指在训练过程中冻结模型中的某些层,冻结的层不进行权重参数更新;
2,指定’0’或’-1’,不冻结任何层,更新所有层的权重参数:
python train.py --freeze 0/-1
3,指定n,冻结前n(0<n<=10)层,即只更新前n层的权重参数:
python train.py --freeze n

32,–save-period

parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')

解析:每训练n个epoch保存一次训练权重,默认关闭
命令行用法:python train.py --save-period n
注:
1,n>0,每训练n个epoch保存一次训练权重;
2,n<=0,关闭save-period,只保存best和last权重。

33,–seed

parser.add_argument('--seed', type=int, default=0, help='Global training seed')

解析:设置训练使用的全局随机种子
命令行用法:python train.py --seed n
注:
1,在训练过程中,有很多地方会使用到随机种子,例如数据加载和处理阶段或模型初始化阶段,随机种子可以保证每次生成的结果都一致,从而有利于代码的可复现性。

34,—local_rank

parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

解析:是否使用分布式训练,默认关闭
命令行用法:python train.py --local_rank 0,1,2,3
注:
1,如果你有 4 个 GPU,想要使用第 2 号和第 3 号 GPU 进行训练,那么可以在启动训练脚本时设置如下参数:
python train.py --local_rank 1,2
这样,第一个进程将使用第 2 号 GPU,第二个进程将使用第 3 号 GPU。注意,如果使用了 --local_rank 参数,那么在启动训练脚本时需要使用 PyTorch 的分布式训练工具,例如 torch.distributed.launch。

35,–entity

parser.add_argument('--entity', default=None, help='Entity')

解析:用于指定模型实体的参数
命令行用法:python train.py --entity None
注:
1,模型实体可以是一个实体名称或实体 ID,通常用于在实体存储库中管理模型的版本控制和记录。
在使用实体存储库时,你需要创建一个实体来存储模型,并在训练时指定该实体,这样训练结果就可以与该实体相关联并保存到实体存储库中。
该参数默认值为 None,如果未指定实体,则训练结果将不会与任何实体相关联。

36,–upload_dataset

parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='Upload data, "val" option')

解析:用于上传数据集,默认关闭
命令行使用方法:python train.py --upload_dataset False
注:
1,如果命令行未使用’–upload_dataset’参数,则默认值为default=False,表示不上传数据集。
2,如果命令行使用’–upload_dataset’参数,但没有传递参数,则默认值为const=True,表示上传数据集。
3,如果命令行使用’–upload_dataset’参数,并且传递了参数’val’,则默认为True,表示要上传val数据集。

37,–bbox_interval

parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval')

解析: 指定在训练过程中每隔多少个epoch记录一次带有边界框的图片,默认关闭
命令行使用方法:python train.py --bbox_interval n
注:
1,n>0,每隔n个epoch记录一次带有边界框的图片;
2,n<=0,关闭–bbox_interval。

38,–artifact_alias

parser.add_argument('--artifact_alias', type=str, default='latest', help='Version of dataset artifact to use')

解析:用于指定要使用的数据集工件的版本别名。
命令行使用方法:python train.py --artifact_alias latest
注:
1,在使用MLFlow等工具跟踪模型训练和数据集版本时,会给每个版本分配唯一的别名。通过指定此参数,可以使用特定版本的数据集工件。默认情况下,使用最新版本的数据集工件。

THE END

发表回复