前言
近日,本人开始忙于毕设,需要使用yolov5框架,于是着手开始学习本框架。本文章旨在记录对yolov5框架的学习经历与成果,方便本人后续的回顾与进步。
在查阅资料过程中,偶遇站内大佬“路人贾'ω'”文章,遂作为参考学习。
目录
一、YOLOv5的网络结构
YOLOv5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。这几个模型的结构基本一样,不同的是depth_multiple模型深度和width_multiple模型宽度这两个参数。
YOLOv5s的网络结构如下:
(1)输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放。
(2)Backbone:Focus结构、CSP结构。
(3)Neck:FPN+PAN结构。
(4)Head:CIOU__Loss。
基本组件:
-
Focus 模块:
-
通过切片操作将图片的空间维度信息(宽度和高度)转换为通道维度信息。
-
具体操作是从图片中每隔一个像素取一个值,形成四张互补的采样图片,然后将它们合并为一个新的图片。
-
这种方式在不丢失信息的情况下实现了下采样。
-
-
CBL 模块:
-
是标准卷积模块的组合,包括卷积层(Conv)、批量归一化层(Batch Normalization, BN)和激活函数层(通常是 LeakyReLU 或 SiLU)。
-
用于特征提取和非线性变换。
-
-
CSP1_X 模块:
-
是一种带有残差连接的 CSP(Cross Stage Partial)模块。
-
输入被分为两个分支,一个分支通过多个残差单元(ResUnit),另一个分支直接卷积,最后合并。
-
通常用于主干网络(Backbone)部分,适合较深的网络结构。
-
-
CSP2_X 模块:
-
与 CSP1_X 类似,但没有残差连接。
-
主要用于网络的颈部(Neck)部分,适合较浅的网络结构。
-
-
SPP 模块(Spatial Pyramid Pooling):
-
通过多尺度池化操作提取特征,增强了模型对不同尺度目标的感知能力。
-
在 YOLOv5 的早期版本中使用,后来被 SPPF(SPP-Fast)模块替代以提高效率。
-
二、输入端
(1)Moasic数据增强
YOLOv5在输入端采用了 Mosaic 数据增强,Mosaic 数据增强算法将多张图片按照一定比例组合成一张图片,使模型在更小的范围内识别目标。Mosaic 数据增强算法参考 CutMix 数据增强算法。CutMix 数据增强算法使用两张图片进行拼接,而 Mosaic 数据增强算法一般使用四张进行拼接,但两者的算法原理是非常相似的。
Mosaic数据增强的主要步骤为:
(1)随机选取图片拼接基准点坐标(xc,yc),另随机选取四张图片。
(2)四张图片根据基准点,分别经过尺寸调整和比例缩放后,放置在指定尺寸的大图的左上,右上,左下,右下位置。
(3)根据每张图片的尺寸变换方式,将映射关系对应到图片标签上。
(4)依据指定的横纵坐标,对大图进行拼接。处理超过边界的检测框坐标。
采用Mosaic数据增强的方式有几个优点:
(1)丰富数据集: 随机使用4张图像,随机缩放后随机拼接,增加很多小日标,大大增加了数据多样性。
(2)增强模型鲁棒性: 混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
(3)加强批归一化层(Batch Normalization)的效果: 当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
(4)Mosaic 数据增强算法有利于提升小目标检测性能: Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。
(2)自适应锚框计算
YOLOv3、YOLOv4对于不同的数据集,都会计算先验框 anchor。然后在训练时,网络会在 anchor 的基础上进行预测,输出预测框,再和标签框进行对比,最后就进行梯度的反向传播。
在 YOLOv3、YOLOv4 中,训练不同的数据集时,是使用单独的脚本进行初始锚框的计算,在 YOLOv5 中,则是将此功能嵌入到整个训练代码里中。所以在每次训练开始之前,它都会根据不同的数据集来自适应计算 anchor。但,如果觉得计算的锚框效果并不好,那你也可以在代码中将此功能关闭。
自适应的计算具体过程:
①获取数据集中所有目标的宽和高。
②将每张图片中按照等比例缩放的方式到 resize 指定大小,这里保证高和宽中的最大值符合指定大小,
③将 bboxes 从相对坐标改成绝对坐标,这里乘以的是缩放后的宽高。
④筛选 bboxes,保留宽高都大于等于两个像素的 bboxes。
⑤使用 k-means 聚类二方得到n个 anchors。
⑥使用遗传算法随机对 anchors 的高和宽进行变异。倘若变异后的效果好,就将变异后的结果赋值给 anchors;如果变异后效果变差就跳过,默认变异1000次。这里是使用 anchor fitness 方法计算得到的适应度 fitness,然后再进行评估。
(3)自适应图片缩放
步骤:
(1)根据原始图片大小以及输入到网络的图片大小计算缩放比例
原始缩放尺寸是416*416,都除以原始图像的尺寸后,可以得到0.52和0.69两个缩放系数,选择小的缩放系数。
(2)根据原始图片大小与缩放比例计算缩放后的图片大小
原始图片的长宽都乘以最小的缩放系数0.52,宽变成了416,而高变成了312。
(3)计算黑边填充数值
将416-312=104,得到原本需要填充的高度。再采用numpy四中np.mod取余数的方式,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。
注意:
(1)Yolov5 中填充的是灰色,即(114,114,114)。
(2)训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
(3)为什么 np.mod 函数只的后面用32?
因为YOLOv5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题,再进行取余。
三、Backbone
如上图所示,backbone包括Focus、CBL、CSP_1、SPP模块。
(1)Focus模块
Focus模块在YOLOv5中是图片进入Backbone前,对图片进行切片操作,具体操作是在一张图片中每隔一个像素到一个值,类似于邻近下采样,这样就拿到了四张图片,四张图片互补,长得差不多,但是没有信息丢失,这样一来,将W、H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
以YOLOv5s为例,原始的 640x640x3 的图像输入Focus结构,采用切片操作,先变成 320x320x12 的特征图,再经过一次卷积操作最终变成 320x320x32 的特征图。
切片操作如下:
作用: 可以使信息不丢失的情况下提高计算力。
不足:Focus 对某些设备不支持且不友好,开销很大,另外切片对不齐的话模型就崩了。
后期改进: 在新版中,YOLOv5 将Focus 模块替换成了一个6x6的卷积层。两者的计算量是等价的,但是对于一些 GPU 设备,使用 6x6 的卷积会更加高效。
(2)CSP结构
YOLOv5与YOLOv4不同点在于,YOLOv4中只有主干网络使用了CSP结构。而YOLOv5中设计了两种CSP结构,以YOLOv5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中,具体不同请见本文前文。
四、Neck
YOLOv5的NecK和YOLOv4中一样,都采用FPN+PAN的结构,但是在它的基础上做了一些改进操作:YOLOV4的Neck结构中,采用的都是普通的卷积操作,而YOLOV5的Neck中,采用CSPNet设计的CSP2结构,从而加强了网络特征融合能力。
结构如下图所示,FPN层自顶向下传达强语义特征,而PAN塔自底向上传达定位特征:
五、Head
(1)Bounding box损失函数
YOLOv5采用 CIOU LOSS 作为 bounding box 的损失函数。
(2)NMS非极大值抑制
NMS 的本质是搜索局部极大值,抑制非极大值元素。
非极大值抑制,主要就是用来抑制检测时冗余的框。因为在目标检测中,在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,所以我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。
算法流程:
1.对所有预测框的置信度降序排序;
2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的 IOU;
3.根据步骤2中计算的 IOU 去除重叠度高的,IOU>threshold 阈值就直接删除;
4.剩下的预测框返回第1步,直到没有剩下的为止。
六、训练策略
(1)多尺度训练(Multi-scale training)。 如果网络的输入是416x416,那么训练的时候就会从0.5x416 到 1.5x416 中任意取值但所取的值都是32的整数倍。
(2)训练开始前使用 warmup 进行训练。在模型预训练阶段,先使用较小的学习率训练一些epochs或者steps (如4个epoch 或10000个step),再修改为预先设置的学习率进行训练。
(3)使用了 cosine 学习率下降策略(Cosine LR scheduler)。
(4)采用了 EMA 更新权重(Exponential Moving Average),相当于训练时给参数赋予一个动量,这样更新起来就会更加平滑。
(5)使用了 amp 进行混合精度训练(Mixed precision),能够减少显存的占用并且加快训练速度,但是需要 GPU 支持。