赞
踩
数据集的准备包括数据集适配YOLO格式的重新分配以及相应配置文件的书写,此处可查看博主的TT100K2yolo的重新分配博文,该文章包括数据集划分,配置文件书写,以及最终的数据集层级目录组织,可以直接提供给下一步进行训练。
可参见YOLO官方文件里的可参见readme文档。
修改配置文件参数。
官方代码中这块默认yaml文件是coco128.yaml
:
同理,这里直接将上节中的yaml文件rett100k.yaml
替换掉coco128.yaml
即可。
这里是在代码中修改,还有一种方式是在训练的时候输入yaml文件地址,可参见readme文档。
当然首先需要进入YOLOv5目录下,博主是在新建的虚拟环境中配置的yolov5,所以需要先激活pytorch环境:
可以先通过以下命令查看虚拟环境:
conda info -e
博主yolov5的虚拟环境是在jpytorch下的,所以执行:
source activate jpytorch
如此便可以进行训练操作了。
再执行以下语句:
python train.py --data rett100k.yaml --cfg yolov5s.yaml --weights '' --batch-size 64
这里batch_size可根据自身计算机性能选择:
注意:博主用的是3080GPU,选择的64,结果都出现了图里上半部分的错误:RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
,于是重新选择了40便开始正常训练了;另外训练期间不要在终端用键盘,否则会打断训练,只能重新来过。
接下坐等其训练结束就好啦
train.py
)weights:指定预训练权重路径;默认是使用yolov5s.pt
;
cfg:模型配置文件,比如models/yolov5s.yaml。
data:数据集对应的yaml参数文件,里面主要存放数据集的类别和路径信息;
hyp: 训练网络的一些超参数设置,(一般用不到)
epochs: 轮数,默认300,需要指定;
batch-size:每次输出给神经网络的图片数(一般爆显存即cuda out of memory时可以调小此参数解决);
img-size: 训练和测试数据集的图片尺寸(个人理解为分辨率),默认640,640nargs=‘+’ 表示参数可设置一个或多个,两个数字前者为训练集大小,后者为测试集大小;
rect: 只要加上’–rect’程序就会将rect设为true;
所谓矩阵推理就是不再要求你训练的图片是正方形了;矩阵推理会加速模型的推理过程,减少一些冗余信息。下图分别是矩阵推理方式和方形推理方式
resume:断点续训:即是否在之前训练的一个模型基础上继续训练,default 值默认是 false。一种方式是先将train.py中这一行default=False 改为 default=True:
nosave:是否只保存最后一轮的pt文件;默认是保存best.pt和last.pt;
notest:只在最后一次进行测试,正常情况下每个epoch都会计算mAP;如果开启了这个参数,那么就只在最后一轮上进行测试,不建议开启。
noautoanchor:是否禁用自动锚框;默认开启;
yolov5中预先设定了一下锚框,这些锚框是针对coco数据集的,其他目标检测也适用,如下图所示:
如果开启了noautoanchor,在训练开始前,会自动计算数据集标注信息针对默认锚框的最佳召回率,当最佳召回率大于等于0.98时,则不需要更新锚框;如果最佳召回率小于0.98,则需要重新计算符合此数据集的锚框。建议不要改动此选项。
遗传算法是利用种群搜索技术将种群作为一组问题解,通过对当前种群施加类似生物遗传环境因素的选择、交叉、变异等一系列的遗传操作来产生新一代的种群,并逐步使种群优化到包含近似最优解的状态,遗传算法调优能够求出优化问题的全局最优解,优化结果与初始条件无关,算法独立于求解域,具有较强的鲁棒性,适合于求解复杂的优化问题,应用较为广泛。
- 多尺度训练是指设置几种不同的图片输入尺度,训练时每隔一定iterations随机选取一种尺度训练,这样训练出来的模型鲁棒性更强。
- 输入图片的尺寸对检测模型的性能影响很大,在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性。
冻结训练是迁移学习常用的方法。当数据集较小时,我们会选择预训练好的模型进行微调。大型数据集预训练好的权重主干特征提取能力是比较强的,这个时候我们只需要冻结主干网络,fine-tune后面层就可以了,不需要从头开始训练,大大减少了时间而且还提高了性能。
最简单的方式就是将图片放置到如图目录下,
python detect.py --weights runs/train/exp14/weights/best.pt --source test/test --output run/now
注意权重地址按照如图所示给,选择最后一个exp里边的pt文件。
这里--source 0
表示使用电脑摄像头进行检测。
检测结果如下:
detect.py
)NMS步骤:
对 BBox 按置信度排序,选取置信度最高的 BBox(所以一开始置信度最高的 BBox 一定会被留下来);
对剩下的 BBox 和已经选取的 BBox 计算 IOU,淘汰(抑制) IOU 大于设定阈值的 BBox(在图例中这些淘汰的 BBox 的置信度被设定为0)。
重复上述两个步骤,直到所有的 BBox 都被处理完,这时候每一轮选取的 BBox 就是最后结果。
- iou-thres=0.5时,NMS 只运行了两轮就选取出最终结果:第一轮选择了红色 BBox,淘汰了粉色 BBox;第二轮选择了黄色 BBox,淘汰了紫色 BBox 和青色 BBox。
- iou-thres=0.7
- iou-thres分别取“0”,“0.45”,“1”
max-det:每张图最大检测数量,默认是最多检测1000个目标;
view-img:检测的时候是否展示预测之后的图片/视频,默认False
如果输入代码python detect.py --view-img,在检测的时候系统要把我检测的结果实时的显示出来,假如我文件夹有5张图片,那么模型每检测出一张就会显示出一张,直到所有图片检测完成。
save-txt:是否将预测的框坐标以txt文件形式保存,txt默认保存物体的类别索引和预测框坐标(YOLO格式),每张图一个txt,txt中每行表示一个物体;默认False;
save-conf:上面保存的txt中是否包含置信度
save-crop:是否把模型检测的物体裁剪下来;开启了这个参数会在crops文件夹下看到几个以类别命名的文件夹,里面保存的都是裁剪下来的图片。
nosave:不保存预测的结果;但是还会生成exp文件夹,只不过是一个空的exp。这个参数应该是和“–view-img”配合使用的;
classes:指定检测某几种类别,形如0或者0 2 3;比如coco128.yaml中person是第一个类别,classes指定“0”,则表示只检测图片中的person;
agnostic-nms:跨类别nms,进行nms是否也去除不同类别之间的框,默认False;比如待检测图像中有一个长得很像排球的足球,pt文件的分类中有足球和排球两种,那在识别时这个足球可能会被同时框上2个框:一个是足球,一个是排球。开启agnostic-nms后,那只会框出一个框;
augment:推理的时候进行多尺度,翻转等操作(TTA)推理数据增强操作
visualize:是否可视化特征图。
如果开启了这和参数可以看到exp文件夹下又多了一些文件,这里.npy格式的文件就是保存的模型文件,可以使用numpy读写。还有一些png文件。
update:如果指定这个参数,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息
project:预测结果保存的路径
name:预测结果保存文件夹名
exist-ok:每次预测模型的结果是否保存在原来的文件夹;如果指定了这个参数的话,那么本次预测的结果还是保存在上一次保存的文件夹里;如果不指定就是每次预测结果保存一个新的文件夹下
line-thickness:调节预测框线条粗细的,default=3
;有的时候目标重叠太多会产生遮挡,比如python detect.py --line-thickness 10;
hide-labels:隐藏预测图片上的标签(只有预测框)
hide-conf:隐藏置信度(还有预测框和类别信息,但是没有置信度)
half:是否使用 FP16 半精度推理。
在training阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的时候,精度要求没有那么高,一般F16(半精度)就可以,甚至可以用INT8(8位整型),精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在嵌入式模型里面。
dnn:是否使用 OpenCV DNN 进行 ONNX 推理。
补充:验证参数(val.py
)
detect.py
一样。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。