YoloV5
简介
YOLOv5项目的作者是Glenn Jocher
并不是原Darknet
项目的作者Joseph Redmon
。并且这个项目至今都没有发表过正式的论文。YOLOV5仓库早在2020年5月就已创建, 如今已迭代多个版本。本文是针对V6.1版本展开的, 下表是V6.1版本中贴出的关于不同大小模型以及输入尺度对应的mAP、推理速度、参数数量以及理论计算的FLOPs。
Model | size | mAPval | mAPval | Speed | Speed | Speed | params | FLOPs |
---|---|---|---|---|---|---|---|---|
pixels | 0.5:0.95 | 0.5 | CPU b1(ms) | V100 b1(ms) | V100 b32(ms) | (M) | @640 (B) | |
YOLOv5n | 640 | 28 | 45.7 | 45 | 6.3 | 0.6 | 1.9 | 4.5 |
YOLOv5s | 640 | 37.4 | 56.8 | 98 | 6.4 | 0.9 | 7.2 | 16.5 |
YOLOv5m | 640 | 45.4 | 64.1 | 224 | 8.2 | 1.7 | 21.2 | 49 |
YOLOv5l | 640 | 49 | 67.3 | 430 | 10.1 | 2.7 | 46.5 | 109.1 |
YOLOv5x | 640 | 50.7 | 68.9 | 766 | 12.1 | 4.8 | 86.7 | 205.7 |
YOLOv5n6 | 1280 | 36 | 54.4 | 153 | 8.1 | 2.1 | 3.2 | 4.6 |
YOLOv5s6 | 1280 | 44.8 | 63.7 | 385 | 8.2 | 3.6 | 12.6 | 16.8 |
YOLOv5m6 | 1280 | 51.3 | 69.3 | 887 | 11.1 | 6.8 | 35.7 | 50 |
YOLOv5l6 | 1280 | 53.7 | 71.3 | 1784 | 15.8 | 10.5 | 76.8 | 111.4 |
YOLOv5x6 | 1280 | 55 | 72.7 | 3136 | 26.2 | 19.4 | 140.7 | 209.8 |
+TTA | 1536 | 55.8 | 72.7 | - | - | - | - | - |
网络结构
网络结构由以下几个部分组成
Backbone: New CSP-Darknet53
Neck: SPPF, New CSP-PAN
Head; YOLOv3 Head
下面是根据yolov5l.yaml绘制的网络整体结构, YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都一样, 只不过在每个子模块中采用不同的深度和宽度, 分别对应yaml文件中的depth_multiple和width_multiple参数。另外, 官方出了n, s, m, l, x版本外还有n6, s6, l6, x6,区别在于后者是针对更大分辨率的图片比如1280x1280, 当然结构上也有些差异, 后者会下采样64倍, 采用4个预测特征层, 而前者只会下采样到32倍且采用3个预测特征层。本文只讨论前者,下图为yolov5l。
对于YOLOV4, 其实YOLOV5在Backbone部分无太大变化。但YOLOV5在v6.0版本相比之前版本有一个很小的改动, 把网络的第一层(原来是Focus模块)换成了一个6×6大小的卷积层。二者在理论上是等价的,但对于现有的一些GPU设备(以及相应的优化算法)使用6×6大小的卷积才能够比使用Focus模块更加高效。
下图是原来的Focus模块(和之前的Swin Transformer中的Patch Merging类似), 将每个2×2的相邻像素划分为一个patch, 然后将每个patch中相同位置(同一颜色)像素拼接在一起就得到了4个feature map, 然后再接上一个3×3大小的卷积层。这和直接使用一个6×6大小的卷积层等效。
在Neck部分的变化还是相比较大, 首先是将SPP换成了SPPF(Glenn Jocher自己设计的), 二者的作用一样, 但是后者的效率更高。SPP结构如下图所示, 是将输入并行通过多个大小不同的Maxpool, 然后做进一步融合, 能够在一定程度上解决目标多尺度问题。
而SPPF结构是将输入串行通过多个5×5大小的MaxPool层, 这里需要注意的是串行两个5x5大小的MaxPool层是和一个9x9大小的MaxPoll层计算结果是一样的, 串行三个5x5大小的MaxPool层是和一个13x13大小的MaxPoll层计算结果是一样的
数据增强
YOLOv5中使用了多种数据增强
Mosaic,将四张图片拼成一张图片
Copy paste,将部分目标随机的粘贴到图片中,前提是数据要有segments
数据才行,即每个目标的实例分割信息。
Random affine(Rotation, Scale, Translation and Shear),随机进行仿射变换,但根据配置文件里的超参数发现只使用了Scale
和Translation
即缩放和平移。
MixUp,就是将两张图片按照一定的透明度融合在一起,具体有没有用不太清楚,毕竟没有论文,也没有消融实验。代码中只有较大的模型才使用到了MixUp
,而且每次只有10%的概率会使用到。
Albumentations,主要是做些滤波、直方图均衡化以及改变图片质量等等,我看代码里写的只有安装了albumentations
包才会启用,但在项目的requirements.txt
文件中albumentations
包是被注释掉了的,所以默认不启用。
Augment HSV(Hue, Saturation, Value),随机调整色度,饱和度以及明度。
训练策略
yolov5中使用了多种训练策略, 这里简单总结几点
Multi-scale training(0.5~1.5x),多尺度训练,假设设置输入图片的大小为640 × 640 ,训练时采用尺寸是在0.5 × 640 ∼ 1.5 × 640 之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)。
AutoAnchor(For training custom data),训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板。
Warmup and Cosine LR scheduler,训练前先进行Warmup
热身,然后在采用Cosine
学习率下降策略
EMA(Exponential Moving Average),可以理解为给训练的参数加了一个动量,让它更新过程更加平滑
Mixed precision,混合精度训练,能够减少显存的占用并且加快训练速度,前提是GPU硬件支持。
Evolve hyper-parameters,超参数优化,没有炼丹经验的人勿碰,保持默认就好。
损失计算
YOLOv5的损失主要是三部分组成。
Classes loss, 分类损失, 采用的是BCE loss, 注意只计算正样本的分类损失
Objectness loss, obj损失, 采用的是BCE loss, 这里的obj表示网络预测的目标边界框与GT Box的CIoU, 这里计算的是所有样本的obj损失
Location loss: 定位损失, 采用的是CIoU loss, 注意只计算正样本的定位损失
其中lambda为平衡系数
平衡不同尺度的损失
这里是指三个预测特征层(P3,P4,P5)上的obj损失采用不同的权重, 针对预测小目标的预测特征层(P3)采用的权重是4.0, 针对中等目标的预测特征层(P4)采用的权重是1.0, 针对预测大目标的预测特征层(P5)采用的权重是0.4, 这里说的是针对COCO数据集设置的超参数。
消除Grid敏感度
主要是调整目标中心点相对Grid网络的左上角偏移量,下图是YOLOv2, v3的计算公式。
其中
t_x是网络预测的目标中心x坐标偏移量(相对于网格的左上角)
t_y是网络预测的目标中心y坐标偏移量(相对于网格的左上角)
c_x是对应网格左上角的x坐标
c_y是对应网络左上角的y坐标
在YOLOv5中除了调整预测Anchor相对Grid网格左上角(c_x, c_y)偏移量外, 还调整了预测目标高宽的计算公式, 之前是:
在YOLOv5调整为:
原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题。
匹配正样本(Buidl Targets)
yolov5与yolov4类似, 主要区别在于GT Box与Anchor Templates模板的匹配方式,在yolov4中直接将每个GT Box与对应的Anchor Template模板计算IoU, 只要IoU大于设定的阈值就算匹配成功, 但在YOLOv5中, 作者先去计算每个GT Box与对应的Anchor Template目标的高宽比例, 即
然后统计这些比例和它们倒数之间的最大值, 这里可以理解成计算GT Box和Anchor Templates分别在宽高一级高度方向的最大差异(当相等的时候比例为1, 差异最小)
接着统计$$r^{max}_w, r^{max}_h之间的最大值, 即宽度和高度方向差异最大的值:
如果GT Box和对应的Anchor Template的r^{max}小于阈值anchor_t(在源码中默认设置为4.0), 即GT Box和对应的Anchor Template的高,宽比例相差不算太大,则将GT Box分配给该Anchor Template模板。为方便理解,做图如下。假设对某个GT Box而言, 其实只要GT Box满足在某个Anchor Template高和宽的x0.25和x4.0倍之间就算匹配成功。
剩下的步骤和YOLOv4中的一致
将GT投影到对应预测特征层上, 根据GT的中心点定位到对应的cell, 注意图中有三个对应的cell, 因为网络预测中心点的偏移范围已经调整到了(-0.5, 1.5),所以按理说只要Grid Cell左上角点距离GT中心点在(-0.5, 1.5)范围内它们对应的Anchor都能回归到GT的位置处,这样就能让正样本的数量得到大量的扩充。
则这个三个Cell对应的AT2和AT3都为正样本。
还需要注意的是, yolov5源码中扩展Cell时只会往上、下、左、右四个方向扩展, 不会往左上、右下、左下、右下方向扩展。下面又给出了一些根据的位置扩展的一些cell案例,其中%1表示会取余并保留一位小数。