模型对比
不同版本的YOLOv5的表现如下,参数量从小到大为n-s-m-l-x,mAP也逐渐升高,不过推理速度也近乎翻了一倍(V100)
表格后一部分带6的模型是针对高分辨率图片的,参数更多,mAP更高,具体差异将在网络结构提及
网络结构
网络主体
- Backbone: New CSP-Darknet53
- Neck: SPPF, New CSP-PAN
- Head: YOLOv3 Head
YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对yaml文件中的depth_multiple和width_multiple参数。
官方除了n, s, m, l, x版本外还有n6, s6, m6, l6, x6,区别在于后者是针对更大分辨率的图片比如1280x1280,当然结构上也有些差异,后者会下采样64倍,采用4个预测特征层,而前者只会下采样到32倍且采用3个预测特征层。
Backbone
YOLOv5在Backbone部分较于v4没太大变化。但是YOLOv5在v6.0版本后相比之前版本有一个很小的改动,把网络的第一层(原来是Focus模块)换成了一个6x6大小的卷积层。两者在理论上其实等价的,但是对于现有的一些GPU设备(以及相应的优化算法)使用6x6大小的卷积层比使用Focus模块更加高效。详情可以参考这个issue #4825。
下图是原来的Focus模块(和之前Swin Transformer中的Patch Merging类似),将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map,然后在接上一个3x3大小的卷积层。这和直接使用一个6x6大小的卷积层等效。
等效这个说法还是需要琢磨一下,形状确实等效。但是能达到同一效果应该是实验出来的?
Neck
Neck部分把SPP换成了SPPF。传统SPP是几个最大池化层(k5,k9,k13)并行计算再将结果concat起来。SPPF则是将最大池化层做串行处理。从数学角度来说,两个k5 maxpool串联等效于一个k9 maxpool,三个k5 maxpool串联等效于一个k13 maxpool。而较小的核可以提高计算量,所以效率提高了~
除了SPP,Neck部分还在PAN结构中加入了CSP,这个以后再好好研究一下~
Head
检测头和v3/v4一样
数据增强
- Mosaic:将四张图片拼成一张图片
- Copy paste:将部分目标随机粘贴到其他图片中,前提是数据要有
segments
数据。这个方法相当于扩充了数据集
- Random affine(Rotation, Scale, Translation and Shear):随机进行仿射变换,但根据配置文件里的超参数发现只使用了
Scale
和Translation
即缩放和平移
- MixUp:就是将两张图片按照一定的透明度融合在一起,之前v4提到过
- 其他还有Albumentations/Augment HSV/Random horizaontal flip等等
训练策略
在YOLOv5源码中使用到了很多训练的策略
- Multi-scale training(0.5~1.5x),多尺度训练,假设设置输入图片的大小为640 × 640 640 \times 640640×640,训练时采用尺寸是在0.5 × 640 ∼ 1.5 × 640 0.5 \times 640 \sim 1.5 \times 6400.5×640∼1.5×640之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)。
- AutoAnchor(For training custom data),训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板。
- Warmup and Cosine LR scheduler,训练前先进行Warmup热身,然后在采用Cosine学习率下降策略。
- EMA(Exponential Moving Average),可以理解为给训练的参数加了一个动量,让它更新过程更加平滑(类似于优化器里的momenten)。
- Mixed precision,混合精度训练,能够减少显存的占用并且加快训练速度,前提是GPU硬件支持。
- Evolve hyper-parameters,超参数优化,没有炼丹经验的人勿碰,保持默认就好。
损失计算
v5的损失计算和之前版本区别不大,都是三部分组成。
- Classes loss || 使用BCE loss || 只计算正样本的分类损失
- Objectness loss || 使用BCE损失 || label值是predict box和GT box的CIoU || 计算所有样本
- Location loss || 定位损失 || 采用CIoU loss || 只计算正样本
权重因子
P3采用的权重是4.0,P4权重为1.0,P5权重为0.4。这是针对coco数据集设置的超参数。
解释性角度来说,小物体更难检测,所以权重自然就大(
$L_{obj}$=4.0⋅$L^{small}_{obj}$+1.0⋅$L^{medium}_{obj}$+0.4⋅$L^{large}_{obj}$
坐标映射
首先是bx/by,即预测框中心离grid cell左上角的偏移,这里给了sigmod函数一个常数2的因子,让bx/by的区间范围从-0.5~1.5,更容易取到1.
其次是bw/bh,即预测的相对于Anchor box的宽高偏移。
原来是直接乘了一个指数函数,当预测值tw/th比较大的时候,容易出现梯度爆炸,所以改成上式,将范围缩减到0-4之间。(这个范围也影响了之后的正样本匹配)
正样本匹配
在v3/v4中的正样本匹配一般只看锚框和GT Box的IoU大小。在v5中还比较了GT Box和Anchor的宽高比例。
统计这些比例和它们倒数之间的最大值,这里可以理解成计算GT Box
和Anchor Templates
分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小)
接着统计$r_w^{max}$ 和$r_h^{max}$ 之间的最大值,即宽度和高度方向差异最大的值
如果GT Box和对应的Anchor的r^{max}小于阈值anchor_t(在源码中默认设置为4.0),即GT Box和对应的Anchor Template的高、宽比例相差不算太大,则将GT Box分配给该Anchor Template模板。
图源CSDN 太阳花的小绿豆
接下来步骤就和v4一样了.需要注意的是由于偏移tx/ty现在的范围是-0.5~1.5,所以可以增加GT Box分配的grid cell,增加一点正样本。
参考博客
[太阳花的小绿豆]((62条消息) YOLOv5网络详解_太阳花的小绿豆的博客-CSDN博客)