Yolov5技术总结
Backbone:
Focus: 网络第一层进行 pixel un-shuffling而不是stride=2的卷积;该模块的设计主要是减少计算量加快速度;
作者原话:https://github.com/ultralytics/yolov5/issues/847
Focus() module is designed for FLOPS reduction and speed increase, not mAP increase.
Also designed for layer count reduction. 1 Focus module replaces 3 yolov3/4 layers.
SPP: 分别采用5/9/13的最大池化,再进行concat融合,提高感受野;
BottleNeckCSP: Cross Stage Partial Networks,减少计算量,提高卷积神经网络学习能力;
Detection (YOLO) layer:
Anchor: 根据超参数中的hyp[‘anchor_t’]来检查默认anchor与数据集标签的契合度,如果<0.98,则根据数据集标签进行聚类重新获得anchor;
默认anchor如下:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/3
参考:https://github.com/ultralytics/yolov5/issues/471
边框回归: 在进行边框回归 筛选样本对应anchor的时候,就是通过hyp[‘anchor_t’]来筛选,而不是iou;
新的边框回归方式:
损失函数:
边框回归:CIOU loss
Objectness:GIOU
分类:BCE
损失平衡:ciou=0.05,objectness=1, cls=0.5;
三个输出层损失平衡:4.0, 1.0, 0.4分别对应下采样8,16,32的输出层
优化策略:
Warmup热身训练;
Cosine余弦退火;
梯度累积;
EMA;
数据增强:
Mosaic;
仿射变换,随机的旋转,平移,缩放,裁剪,上下左右翻转;
随机hsv;
进行数据增强操作还有一个bbox筛选的过程:
去除被裁剪过小的框(面积小于裁剪前的20%) ,并且还有长和宽必须大于2个像素,且长宽比范围在(1/20, 20)之间的限制;
Yolov5-1.0、2.0、3.0:
1.0->2.0:
yolov5x mAP有提升,但yolov5s mAP却下降了,
训练策略的改变,包括余弦退火的公式更新了,以及类别损失cls_loss的系数gain,对数据进行仿射变换(dataset.py数据增强部分)的超参数进行调整,三个output的损失比重balance的调整。
2.0->3.0:
V3.0据作者所说,大约10%的推理速度为代价提高了所有模型的mAP。尽管CUDA内存需求增加了约10%,但训练速度并未受到明显影响,具体未测试;
最小的模型从Hardswish()**中受益最大,YOLOv5s / m / l / x的增加幅度为+0.9/+0.8/+0.7/[email protected]:0.95。
主要做出的变化是,采用了hardswish**函数替换CONV(下图右下角模块)模块的LeakyReLu,但是注意:BottleneckCSP模块中的LeakyReLu未被替换,采用了CIOU作为损失函数(但这个更新好像是还在v2.0版本过度的时候已经更新),还更改了一个默认超参数:translate=0.5 → 0.1(数据增强的仿射系数)。
由于没有发paper,只有自己看代码学习,有不正确欢迎指正,谢谢!