YOLOv5深度解析:从网络结构到训练策略
YOLOv5深度解析:从网络结构到训练策略
YOLOv5是目前最流行的实时目标检测算法之一,具有速度快、精度高、部署方便等特点。本文将从网络结构、输入端处理、Backbone、Neck、Head以及训练策略等多个方面对YOLOv5进行详细解读,帮助读者更好地理解其工作原理和实现方式。
前言
YOLOv5是目前最流行的实时目标检测算法之一,具有速度快、精度高、部署方便等特点。与之前的YOLO版本相比,YOLOv5在多个方面进行了改进和优化,使其在实际应用中表现更佳。值得注意的是,YOLOv5并没有发表正式的论文,这可能是因为其作者Glenn Jocher还在完善和优化算法。
YOLOv5的网络结构
YOLOv5主要有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本,它们的结构基本相同,但深度和宽度不同。YOLOv5s是其中最小的版本,其他版本都是在此基础上不断加深和加宽。YOLOv5的网络结构主要包括以下几个部分:
- 输入端:包括Mosaic数据增强、自适应锚框计算和自适应图片缩放
- Backbone:包括Focus结构和CSP结构
- Neck:采用FPN+PAN结构
- Head:使用CIOU损失函数
输入端处理
Mosaic数据增强
YOLOv5在输入端采用了Mosaic数据增强,这是一种将多张图片按照一定比例组合成一张图片的数据增强方法。Mosaic数据增强的主要步骤包括:
- 随机选取图片拼接基准点坐标(xc,yc),并随机选取四张图片
- 四张图片根据基准点,分别经过尺寸调整和比例缩放后,放置在指定尺寸的大图的左上、右上、左下、右下位置
- 根据每张图片的尺寸变换方式,将映射关系对应到图片标签上
- 依据指定的横纵坐标,对大图进行拼接,并处理超过边界的检测框坐标
采用Mosaic数据增强有以下优点:
- 丰富数据集:随机使用4张图像,随机缩放后随机拼接,增加很多小目标,大大增加了数据多样性
- 增强模型鲁棒性:混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标
- 加强批归一化层(Batch Normalization)的效果:当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好
- 提升小目标检测性能:Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力
自适应锚框计算
YOLOv5将锚框计算功能嵌入到训练代码中,每次训练开始前都会根据数据集自适应计算锚框。具体过程包括:
- 获取数据集中所有目标的宽和高
- 将每张图片按照等比例缩放到指定大小
- 将 bboxes 从相对坐标改成绝对坐标
- 筛选 bboxes,保留宽高都大于等于两个像素的 bboxes
- 使用 k-means 聚类得到n个 anchors
- 使用遗传算法随机对 anchors 的宽高进行变异,变异1000次
自适应图片缩放
YOLOv5采用自适应图片缩放方式,具体步骤如下:
- 根据原始图片大小以及输入到网络的图片大小计算缩放比例
- 根据原始图片大小与缩放比例计算缩放后的图片大小
- 计算黑边填充数值
需要注意的是:
- Yolov5中填充的是灰色,即(114,114,114)
- 训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小
- 为什么np.mod函数的后面用32?因为YOLOv5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题,再进行取余。
Backbone
Focus结构
Focus模块在YOLOv5中是图片进入Backbone前,对图片进行切片操作,具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了四张图片,四张图片互补,长得差不多,但是没有信息丢失,这样一来,将W、H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
以YOLOv5s为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,最终变成320 × 320 × 32的特征图。
切片操作如下:
作用:可以使信息不丢失的情况下提高计算力
不足:Focus 对某些设备不支持且不友好,开销很大,另外切片对不齐的话模型就崩了。
后期改进:在新版中,YOLOv5 将Focus 模块替换成了一个 6 x 6 的卷积层。两者的计算量是等价的,但是对于一些 GPU 设备,使用 6 x 6 的卷积会更加高效。
CSP结构
YOLOv5借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。与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
Bounding box损失函数
YOLO v5采用CIOU_LOSS作为bounding box 的损失函数。(关于IOU_ Loss、GIOU_ Loss、DIOU_ Loss以及CIOU_Loss的介绍,请看YOLOv4那一篇:【YOLO系列】YOLOv4论文超详细解读2(网络详解))
NMS非极大值抑制
NMS 的本质是搜索局部极大值,抑制非极大值元素。非极大值抑制,主要就是用来抑制检测时冗余的框。因为在目标检测中,在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,所以我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。
算法流程:
- 对所有预测框的置信度降序排序
- 选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的 IOU
- 根据步骤2中计算的 IOU 去除重叠度高的,IOU > threshold 阈值就直接删除
- 剩下的预测框返回第1步,直到没有剩下的为止
SoftNMS:
当两个目标靠的非常近时,置信度低的会被置信度高的框所抑制,那么当两个目标靠的十分近的时候就只会识别出一个 BBox。为了解决这个问题,可以使用 softNMS。它的基本思想是用稍低一点的分数来代替原有的分数,而不是像 NMS 一样直接置零。
训练策略
- 多尺度训练(Multi-scale training):如果网络的输入是416 x 416。那么训练的时候就会从 0.5 x 416 到 1.5 x 416 中任意取值,但所取的值都是32的整数倍。
- 训练开始前使用 warmup 进行训练:在模型预训练阶段,先使用较小的学习率训练一些epochs或者steps (如4个 epoch 或10000个 step),再修改为预先设置的学习率进行训练。
- 使用了 cosine 学习率下降策略(Cosine LR scheduler)。
- 采用了 EMA 更新权重(Exponential Moving Average):相当于训练时给参数赋予一个动量,这样更新起来就会更加平滑。
- 使用了 amp 进行混合精度训练(Mixed precision):能够减少显存的占用并且加快训练速度,但是需要 GPU 支持。
总结一下,YOLO v5和前YOLO系列相比的改进:
- (1) 增加了正样本:方法是邻域的正样本anchor匹配策略。
- (2) 通过灵活的配置参数,可以得到不同复杂度的模型
- (3) 通过一些内置的超参优化策略,提升整体性能
- (4) 和yolov4一样,都用了mosaic增强,提升小物体检测性能