(1)训练参数
opt参数解析:
cfg:模型配置文件,网络结构
data:数据集配置文件,数据集路径,类名等
hyp:超参数文件
epochs:训练总轮次
batch-size:批次大小
img-size:输入图片分辨率大小
rect:是否采用矩形训练,默认False
resume:接着打断训练上次的结果接着训练
nosave:不保存模型,默认False
notest:不进行test,默认False
noautoanchor:不自动调整anchor,默认False
evolve:是否进行超参数进化,默认False
bucket:谷歌云盘bucket,一般不会用到
cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
weights:加载的权重文件
name:数据集名字,如果设置:results.txt to results_name.txt,默认无
device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
multi-scale:是否进行多尺度训练,默认False
single-cls:数据集是否只有一个类别,默认False
adam:是否使用adam优化器
sync-bn:是否使用跨卡同步BN,在DDP模式使用
local_rank:gpu编号
logdir:存放日志的目录
workers:dataloader的最大worker数量
举例使用方式:
原文链接:https://blog.csdn.net/Q1u1NG/article/details/107463417
2021/4/22更新
训练参数:
- — img: 输入图像的大小,建议使用640,因为对于交通场景,输入图片尺寸过小时,会导致部分对象宽高小于3像素,可能会影响训练精度
- — batch-size: 批次大小,对于2080Ti-11GB 或者P100-16GB,输入img-size 640,batch-size 32为上限
- — epochs: 训练迭代数,作者建议训练300个epochs起
- — data: 创建的 YAML 文件uc_data.yaml
- — cfg: 模型文件Custom_yolov5s.yaml,需要自己至少修改类别数量及类别种类
- — weights: 对于本项目不使用预训练权重,如果需要预训练权重,可以访问此地址
- — cache-images: 将预处理后的训练数据全部存储在RAM中,能够加快训练速度
- — hyp: 这个参数是自定义的hyp.yaml地址,对于小尺寸数据,可以更改hyp中optimizer为Adam,并修改配套参数为作者预设的Adam参数
- — rect:输入这个参数,会关闭Mosaic数据增强
- — resume: 从上次训练的结束last.pt继续训练
- — nosave: 输入这个参数将存储最后的checkpoint,可以加快整体训练速度,但是建议关闭这个参数,这样能保留best.pt
- — notest: 只测试最后一个epoch,能加快整体训练速度
- — noautoanchor: 关闭自适应自适应锚定框,YOLO V5会自动分析当前锚定框的 Best Possible Recall (BPR) ,对于img-size 640,最佳BPR为0.9900,随着img-size降低,BPR也随之变差
- — multi-scale: 输入图像多尺度训练,在训练过程中,输入图像会自动resize至 img-size +/- 50%,能一定程度上防止模型过拟合,但是对于GPU显存要求很高,对于640的img-size至少使用16GB显存,才能保证运行不出错
- — single-cls: 模型的输出为单一类别,比如我只需要识别Trunk
- — device: 选择使用CUDA或者CPU
YOLO V5的作者建议至少训练300个回合,每次训练完成后所有的结果及权重会储存在runs
文件夹下。
参考:使用YOLO V5训练自动驾驶目标检测网络 - 知乎
(拓展)
1.超参数进化evolve
今天想试一下,使用的方法是:
--evolve
进化过程中有两个重要的参数:
第一个参数为:
parent, 可选值为single
或者weighted
,这个参数的作用是:决定如何选择上一代。
如果选择single,代表只选择上一代中最好的那个。如果选择weighted,代表选择得分的前10个加权平均的结果作为下一代。
第二个参数为:
method,可选值为1,2,3
, 分别代表使用三种模式来进化。
2.对于Adam
YOLO V5的作者建议是,如果需要训练较小的自定义数据集,Adam是更合适的选择,尽管Adam的学习率通常比SGD低。但是如果训练大型数据集,对于YOLOV5来说SGD效果比Adam好。
实际上学术界上对于SGD和Adam哪个更好,一直没有统一的定论,取决于实际项目情况。
优化函数如果训练比较小的自定义的数据集,adam是比较合适的选择,但是如果训练大型的数据集那么使用sgd优化函数的比较多。
刚刚试了下,adam优化和 cache-images确实会好一点,对了我的机子是 i9-10900k、128g、TRX6000,但是不爽的是bitch_size只能调到16.
(2)超参数文件hyp解析
lr0: 0.00447 # 学习率,,可以理解为模型的学习速度lrf: 0.114 # 余弦退火超参数momentum: 0.873 # 学习率动量,梯度下降法中一种常用的加速技术,加快收敛weight_decay: 0.00047 # 权重衰减系数,防止过拟合。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。giou: 0.0306 # giou损失的系数cls: 0.211 # 分类损失的系数cls_pw: 0.546 # 分类BCELoss中正样本的权重obj: 0.421 # 有无物体损失的系数obj_pw: 0.972 # 有无物体BCELoss中正样本的权重iou_t: 0.2 # 标签与anchors的iou阈值iou training thresholdanchor_t: 2.26 # 标签的长h宽w/anchor的长h_a宽w_a阈值, 即h/h_a, w/w_a都要在(1/2.26, 2.26)之间anchor-multiple threshold
# anchors: 5.07fl_gamma: 0.0 # 设为0则表示不使用focal loss(efficientDet default is gamma=1.5)
# 下面是一些数据增强的系数, 包括颜色空间和图片空间hsv_h: 0.0154 # 色调
hsv_s: 0.9 # 饱和度
hsv_v: 0.619 # 明度
degrees: 0.404 #旋转角度
translate: 0.206 # 水平和垂直平移
scale: 0.86 # 缩放
shear: 0.795 # 剪切
perspective: 0.0 # 透视变换参数
flipud: 0.00756 # 上下翻转
fliplr: 0.5 # 左右翻转
mixup: 0.153 # mixup系数
参考:U版YOLOv5学习笔记之训练参数 | 码农家园
调参经验
-
learning-rate 学习速率:学习速率越小,模型收敛花费的时间就越长,但是可以提高模型精确度。一般初始设置为0.1,然后每次除以0.2或者0.5来改进,得到最终值;
-
batchsize 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小来设置,具体问题具体分析
-
weightdecay 权重衰减:用来在反向传播中更新权重和偏置,一般设置为0.005;
-
epoch-number 训练次数:包括所有训练样本的一个正向传递和一个反向传递,训练至模型收敛即可;(注:和迭代周期iteration不一样)
-
经过交叉验证,dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
参考:YOLO经验总结 | spicyCV
2021/4/22更新
(3)test.py
(4)detect.py
检测参数:
- — weights: 训练权重的路径
- — source:推理目标的路径,可以是图片,视频,网络摄像头等
- — source:推理结果的输出路径
- — img-size:推理图片的大小
- — conf-thres: 对象置信阈值,默认0.4
- — iou-thres: NMS的IOU阈值,可以根据实际对象的重叠度调节,默认0.5
- — device: 选择使用CUDA或者CPU
- — view-img: 显示所有推理结果
- — save-txt:将每一帧的推理结果及边界框的位置,存入*.txt文件
- — classes:类别过滤,意思是只推理目标类别
- — agnostic-nms: 使用agnostic-nms NMS
参考:使用YOLO V5训练自动驾驶目标检测网络 - 知乎
(4)可视化
可视化比较简单直接在环境中输入:
pip install wandb
安装完后,直接训练
Weights & Biases
在这个网站上注册一下
训练的时候他会叫你打开这个网站
复制上面的码
然后就可以看到
下面想讲一下这个参数
这个是标签和结果大家都明白
接下来是 precision、recall、mAP_0.5、mAP_0.5:0.95
(5)测试模型调用相机
python detect.py --source 0 --weights last.pt
(6)过拟合问题
关于过拟合问题最好的方式是增加样本量
下面是我自己的看法
个人认为:
1.有可能是模型比较小
举例在yolov5里面,yolov5x是模型最小速度最快,模型的深度为0.33。如果经常过拟合的话可以尝试使用一下大一点的yolov5x的模型。
2.还有可能是我迭代次数太多了数据集比较小直接就学到头了。