简介

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。

yolov5

对于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大小的卷积层等效。

yolov5_focus

在Neck部分的变化还是相比较大, 首先是将SPP换成了SPPF(Glenn Jocher自己设计的), 二者的作用一样, 但是后者的效率更高。SPP结构如下图所示, 是将输入并行通过多个大小不同的Maxpool, 然后做进一步融合, 能够在一定程度上解决目标多尺度问题。

yolov5_spp

而SPPF结构是将输入串行通过多个5×5大小的MaxPool层, 这里需要注意的是串行两个5x5大小的MaxPool层是和一个9x9大小的MaxPoll层计算结果是一样的, 串行三个5x5大小的MaxPool层是和一个13x13大小的MaxPoll层计算结果是一样的

SPPF

数据增强

YOLOv5中使用了多种数据增强

Mosaic,将四张图片拼成一张图片

Copy paste,将部分目标随机的粘贴到图片中,前提是数据要有segments数据才行,即每个目标的实例分割信息。

Random affine(Rotation, Scale, Translation and Shear),随机进行仿射变换,但根据配置文件里的超参数发现只使用了ScaleTranslation即缩放和平移。

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的计算公式。

image-20231117020720005

其中

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倍之间就算匹配成功。

image-20231117024711216

剩下的步骤和YOLOv4中的一致

将GT投影到对应预测特征层上, 根据GT的中心点定位到对应的cell, 注意图中有三个对应的cell, 因为网络预测中心点的偏移范围已经调整到了(-0.5, 1.5),所以按理说只要Grid Cell左上角点距离GT中心点在(-0.5, 1.5)范围内它们对应的Anchor都能回归到GT的位置处,这样就能让正样本的数量得到大量的扩充。

则这个三个Cell对应的AT2和AT3都为正样本。

image-20231117030514848

还需要注意的是, yolov5源码中扩展Cell时只会往上、下、左、右四个方向扩展, 不会往左上、右下、左下、右下方向扩展。下面又给出了一些根据的位置扩展的一些cell案例,其中%1表示会取余并保留一位小数。

image-20231117030859200