来源:投稿 作者:王同学
​​​​​​​编辑:学姐

今天我们继续上次的YOLOv5参数解析,这次主要解析源码中train.py文件中包含的参数。

  • 1.1′–weights’

  • 1.2′–cfg’

  • 1.3′–data’

  • 1.4′–hyp’

  • 1.5′–epochs’

  • 1.6′–batch-size’

  • 1.7′–imgsz’, ‘–img’, ‘–img-size’

  • 1.8′–rect’

  • 1.9′–resume’

  • 1.10′–nosave’

  • 1.11′–noval’

  • 1.12′–noautoanchor’

  • 1.13′–evolve’

  • 1.14′–bucket’

  • 1.15′–cache’

  • 1.16′–image-weights’

  • 1.17′–device’

  • 1.18′–multi-scale’

  • 1.19′–single-cls’

  • 1.20′–optimizer’

  • 1.21′–sync-bn’

  • 1.22′–workers’

  • 1.23′–project’

  • 1.24′–name’

  • 1.25′–exist-ok’

  • 1.26′–quad’

  • 1.27′–cos-lr’

  • 1.28′–label-smoothing’

  • 1.29′–patience’

  • 1.30′–freeze’

  • 1.31′–save-period’

  • 1.32′–local_rank’

  • 1.33′–entity’

  • 1.34′–upload_dataset’

  • 1.35′–bbox_interval’

  • 1.36′–artifact_alias’

0.首次运行常见错误

刚拿到代码可以运行train.py文件看看,一般都会出现这个错误:

OMP:HintThismeansthatmultiplecopiesoftheOpenMPruntimehavebeenlinkedintotheprogram.Thatisdangerous,sinceitcandegradeperformanceorcauseincorrectresults.ThebestthingtodoistoensurethatonlyasingleOpenMPruntimeislinkedintotheprocess,e.g.byavoidingstaticlinkingoftheOpenMPruntimeinanylibrary.Asanunsafe,unsupported,undocumentedworkaroundyoucansettheenvironmentvariableKMP_DUPLICATE_LIB_OK=TRUEtoallowtheprogramtocontinuetoexecute,butthatmaycausecrashesorsilentlyproduceincorrectresults.Formoreinformation,pleaseseehttp://www.intel.com/software/products/support/.

解决方案:在train.py文件里加入以下代码:

importosos.environ['KMP_DUPLICATE_LIB_OK']='TRUE'

1.train.py参数解析

首先还是打开根目录下的train.py,直接看parse_opt()

1.1′–weights’

指定预训练权重路径;如果这里设置为空的话,就是自己从头开始进行训练;下图是官方提供的预训练权重

1.2′–cfg’

指定模型配置文件路径的;源码里面提供了这5个配置文件,配置文件里面指定了一些参数信息和backbone的结构信息。

1.3′–data’

数据集对应的参数文件;里面主要存放数据集的类别和路径信息。

yolo源码里面提供了9种数据集的配置文件

1.4′–hyp’

指定超参数文件的路径;超参数里面包含了大量的参数信息,同样提供了5个

1.5′–epochs’

训练的轮数;默认为300轮,显示效果是0-299

1.6′–batch-size’

每批次的输入数据量;default=-1将时自动调节batchsize大小。

这里说一下epoch、batchsize、iteration三者之间的联系

1、batchsize是批次大小,假如取batchsize=24,则表示每次训练时在训练集中取24个训练样本进行训练。
2、iteration是迭代次数,1个iteration就等于一次使用24(batchsize大小)个样本进行训练。
3、epoch:1个epoch就等于使用训练集中全部样本训练1次。

1.7′–imgsz’, ‘–img’, ‘–img-size’

训练集和测试集图片的像素大小;输入默认640*640,这个参数在你选择yolov5l那些大一点的权重的时候,要进行适当的调整,这样才能达到好的效果。

1.8′–rect’

是否采用矩阵推理的方式去训练模型;

所谓矩阵推理就是不再要求你训练的图片是正方形了;矩阵推理会加速模型的推理过程,减少一些冗余信息。

下图分别是方形推理方式和矩阵推理方式

1.9′–resume’

断点续训:即是否在之前训练的一个模型基础上继续训练,default 值默认是 false;如果想采用断点续训的方式,这里我推荐一种写法,即首先将default=False 改为 default=True 随后在终端中键入如下指令

pythontrain.py--resumeD:\Pycharm_Projects\yolov5-6.1-4_23\runs\train\exp19\weights\last.pt

==D:\Pycharm_Projects\yolov5-6.1-4_23\runs\train\exp19\weights\last.pt==为你上一次中断时保存的pt文件路径

输入指令后就可以看到模型是继续从上次结束时开始训练的

1.10′–nosave’

是否只保存最后一轮的pt文件;我们默认是保存best.pt和last.pt两个的

1.11′–noval’

只在最后一轮测试;正常情况下每个epoch都会计算mAP,但如果开启了这个参数,那么就只在最后一轮上进行测试,不建议开启

1.12′–noautoanchor’

是否禁用自动锚框;默认是开启的,自动锚点的好处是可以简化训练过程;

yolov5中预先设定了一下锚定框,这些锚框是针对coco数据集的,其他目标检测也适用,可以在models/yolov5.文件中查看,例如如图所示,这些框针对的图片大小是640640。这是默认的anchor大小。需要注意的是在目标检测任务中,一般使用大特征图上去检测小目标,因为大特征图含有更多小目标信息,因此大特征图上的anchor数值通常设置为小数值,小特征图检测大目标,因此小特征图上anchor数值设置较大。

在yolov5 中自动锚定框选项,训练开始前,会自动计算数据集标注信息针对默认锚定框的最佳召回率,当最佳召回率大于等于0.98时,则不需要更新锚定框;如果最佳召回率小于0.98,则需要重新计算符合此数据集的锚定框。在parse_opt设置了默认自动计算锚框选项,如果不想自动计算,可以设置这个,建议不要改动。

1.13′–evolve’

遗传超参数进化;yolov5使用遗传超参数进化,提供的默认参数是通过在COCO数据集上使用超参数进化得来的(也就是下图这些参数)。由于超参数进化会耗费大量的资源和时间,所以建议大家不要动这个参数。

遗传算法是利用种群搜索技术将种群作为一组问题解,通过对当前种群施加类似生物遗传环境因素的选择、交叉、变异等一系列的遗传操作来产生新一代的种群,并逐步使种群优化到包含近似最优解的状态,遗传算法调优能够求出优化问题的全局最优解,优化结果与初始条件无关,算法独立于求解域,具有较强的鲁棒性,适合于求解复杂的优化问题,应用较为广泛。

1.14′–bucket’

谷歌云盘;通过这个参数可以下载谷歌云盘上的一些东西,但是现在没必要使用了

1.15′–cache’

是否提前缓存图片到内存,以加快训练速度,默认False;开启这个参数就会对图片进行缓存,从而更好的训练模型。

1.16′–image-weights’

是否启用加权图像策略,默认是不开启的;主要是为了解决样本不平衡问题;开启后会对于上一轮训练效果不好的图片,在下一轮中增加一些权重;

1.17′–device’

设备选择;这个参数就是指定硬件设备的,系统会自己判断的

1.18′–multi-scale’

是否启用多尺度训练,默认是不开启的;多尺度训练是指设置几种不同的图片输入尺度,训练时每隔一定iterations随机选取一种尺度训练,这样训练出来的模型鲁棒性更强。

多尺度训练在比赛中经常可以看到他身影,是被证明了有效提高性能的方式。输入图片的尺寸对检测模型的性能影响很大,在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性。

1.19′–single-cls’

设定训练数据集是单类别还是多类别;默认为 false多类别

1.20′–optimizer’

选择优化器;默认为SGD,可选SGD,Adam,AdamW

1.21′–sync-bn’

是否开启跨卡同步BN;开启参数后即可使用 SyncBatchNorm多 GPU 进行分布式训练

1.22′–workers’

最大worker数量;这里经常出问题,建议设置成0

1.23′–project’

指定训练好的模型的保存路径;默认在runs/train

1.24′–name’

设定保存的模型文件夹名,默认在exp;

1.25′–exist-ok’

每次预测模型的结果是否保存在原来的文件夹;如果指定了这个参数的话,那么本次预测的结果还是保存在上一次保存的文件夹里;如果不指定就是每次预测结果保存一个新的文件夹下。

1.26′–quad’

官方给出的开启这个功能后的实际效果:

  • 好处是在比默认 640 大的数据集上训练效果更好

  • 副作用是在 640 大小的数据集上训练效果可能会差一些

1.27′–cos-lr’

是否开启余弦学习率;

这是我不采用cos-lr时学习率的曲线:

开启后的学习率应该是这样子:

1.28′–label-smoothing’

是否对标签进行平滑处理,默认是不启用的;

在训练样本中,我们并不能保证所有sample都标注正确,如果某个样本标注错误,就可能产生负面印象,如果我们有办法“告诉”模型,样本的标签不一定正确,那么训练出来的模型对于少量的样本错误就会有“免疫力”采用随机化的标签作为训练数据时,损失函数有1-ε的概率与上面的式子相同,比如说告诉模型只有0.95概率是那个标签。

1.29′–patience’

早停;如果模型在default值轮数里没有提升,则停止训练模型

1.30′–freeze’

指定冻结层数量;可以在yolov5s.yaml中查看主干网络层数。

冻结训练是迁移学习常用的方法,当我们在使用数据量不足的情况下,通常我们会选择公共数据集提供权重作为预训练权重,我们知道网络的backbone主要是用来提取特征用的,一般大型数据集训练好的权重主干特征提取能力是比较强的,这个时候我们只需要冻结主干网络,fine-tune后面层就可以了,不需要从头开始训练,大大减少了实践而且还提高了性能。

例如如下指令,代表冻结前8层,因为只有9层,注意不要超过9

pythontrain.py--freeze8

这里分享一个对比冻结效果的项目

这里是项目的部分截图

1.31′–save-period’

用于设置多少个epoch保存一下checkpoint;

1.32′–local_rank’

DistributedDataParallel 单机多卡训练,单GPU设备不需要设置;

1.33′–entity’

在线可视化工具,类似于tensorboard

1.34′–upload_dataset’

是否上传dataset到wandb tabel(将数据集作为交互式 dsviz表 在浏览器中查看、查询、筛选和分析数据集) 默认False

1.35′–bbox_interval’

设置界框图像记录间隔 Set bounding-box image logging interval for W&B 默认-1

1.36′–artifact_alias’

功能作者还未实现

小彩蛋

当我们设置完参数以后,可以通过如下的方式来查看参数具体的值,这里拿detect.py文件举例

第一步:在这个位置打个断点

第二步:点击“debug”

第三步:点击“步过”

最后一步:展开opt就可以看到我们的参数信息啦

有问题欢迎大家指正,如果感觉有帮助的话请点赞支持下

Yolo系列论文+代码数据集

点击下方卡片关注《学姐带你玩AI》回复“YOLO”即可领取

码字不易,欢迎大家点赞评论收藏!