欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

YOLOv5 目标检测模型详情

最编程 2024-07-15 10:25:02
...

YOLO(You Only Look Once!)系列是非常经典的目标检测算法,可以完成多尺度、多目标的检测任务,并且相比于两阶段的检测方法更加的高效。因此,本篇文章对新开源的YOLOv5目标检测模型进行详细的介绍。
1 YOLOv5模型结构
YOLOv5模型结构如下图所示。

从上图可以看出,YOLOv5的模型结构可以分为四个部分:输入端、Backbone、Neck和Prediction。
各部分的关键元素或者功能总结如下:

  1. 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放;
  2. Backbone:Focus结构、CBL结构、CSP结构、SPP结构;
  3. Neck:FPN+PAN结构;
  4. Prediction:CIOU_Loss

此外,YOLOv5模型根据网络宽度和深度的区别,分为依次递增的四个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x。
接下来,详细介绍各个部分的结构或者功能。

2 输入端

2.1 Mosaic数据增强
Mosaic数据增强采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接,主要有以下优点:

  1. 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
  2. 减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。

2.2 自适应锚框计算
在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。

在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭,关闭参数项如下图所示。

2.3 自适应图片缩放
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。但Yolov5代码中对此进行了改进,也是Yolov5推理速度能够很快的一个不错的trick。
作者认为,在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。因此在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。

3 BackBone

3.1 Focus结构
Focus结构的操作示意如下图所示。

Focus是YOLOv5中新加入的结构,以往版本的模型结构中并没有Focus。

比如右图的切片示意图,443的图像切片后变成2212的特征图。以Yolov5s的结构为例,原始6086083的图像输入Focus结构,采用切片操作,先变成30430412的特征图,再经过一次32个卷积核的卷积操作,最终变成30430432的特征图。所以,Focus结构的操作相当于是下采样的过程,可以减小计算量,但是由于下采样的方式比较特别,可以尽可能的保留原始图片的信息,减少信息丢失。

需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加。

3.2 CBL结构
在YOLOv3中就已经使用了该组件,由Conv+BN(Batch Normalization)+Leaky_relu组成

3.3 CSP结构
Yolov4网络结构中,借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。Yolov5与Yolov4不同点在于,Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中,结构图如下图所示。

每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用。

CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。

因此CSP结构主要有三个方面的优点:

  1. 增强CNN的学习能力,使得在轻量化的同时保持准确性。
  2. 降低计算瓶颈
  3. 降低内存成本

关于CSPNet的详细内容可以参考https://zhuanlan.zhihu.com/p/116611721以及CSPNet论文https://arxiv.org/pdf/1911.11929.pdf

3.4 SPP结构
SPP(Spatial Pyramid Pooling)模块,其实在Yolov3中已经存在了,结构及操作如下图所示。

在SPP模块中,使用k={11,55,99,1313}的最大池化的方式,再将不同尺度的特征图进行Concat操作。
研究发现,采用SPP模块的方式,比单纯的使用k*k最大池化的方式,更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。

4 Neck

4.1 FPN+PAN结构
Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,如下图所示。

FPN(Feature Pyramid Network)层自顶向下传达强语义特征,而PAN(Pyramid Attention Network)则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,使得目标的位置信息和类别信息都最大程度的进行了保留。

Yolov4的Neck结构中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。

FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域。

5 Prediction

5.1 Bounding Box损失函数
Yolov5中采用其中的CIOU_Loss做Bounding box的损失函数,但是本节将详细介绍IOU_Loss系列损失函数的变迁。

  • IOU_Loss
    IOU_Loss的计算如下图所示。

    从图中可以看到IOU的loss其实很简单,主要是交集/并集,但其实也存在如下图所示的两个问题。

    问题1:即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
    问题2:即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。

因此,2019年出现了改进方法——GIOU_Loss。

  • GIOU_Loss
    GIOU_Loss的计算如下图所示。

    从图中可以看出右图GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬,但是还存在一种不足:

    问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
    基于这个问题,2020年的AAAI又提出了DIOU_Loss。

  • DIOU_Loss
    好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
    针对IOU和GIOU存在的问题,需要从两个方面进行考虑
    一:如何最小化预测框和目标框之间的归一化距离?
    二:如何在预测框和目标框重叠时,回归的更准确?

针对第一个问题,提出了DIOU_Loss(Distance_IOU_Loss),如下图所示。

DIOU_Loss考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。
但是DIOU_Loss并没有考虑到长宽比,因此会引出如下图所示的问题。

如上图所示的三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用,但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同,导致DIOU_Loss无法起作用。

针对这个问题,又提出了CIOU_Loss,进一步考虑长宽比。

  • CIOU_Loss
    CIOU_Loss在DIOU_Loss的基础上增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去,公式如下图所示。

    其中v是衡量长宽比一致性的参数,可以定义为:

这样CIOU_Loss就将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了。

再来综合的看下各个Loss函数的不同点:
IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

5.2 nms非极大值抑制
在目标检测的后处理过程中,针对很多目标框的筛选,通常需要nms操作。
因为CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。所以Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中采用加权nms的方式。
当然,我们也可以在YOLOv5中采用DIOU_nms,说不定对于遮挡重叠目标的检测会有一些改进。

6 YOLOv5的不同网络结构
Yolov5代码中的四种网络都是以yaml的形式来呈现,而且四个文件的内容基本上都是一样的,只有最上方的depth_multiple和width_multiple两个参数不同。

6.1 Yolov5四种网络的深度
四种网络的深度差别如下图所示。

a.以yolov5s为例,第一个CSP1中,使用了1个残差组件,因此是CSP1_1。而在Yolov5m中,则增加了网络的深度,在第一个CSP1中,使用了2个残差组件,因此是CSP1_2。而Yolov5l中,同样的位置,则使用了3个残差组件,Yolov5x中,使用了4个残差组件。
其余的第二个CSP1和第三个CSP1也是同样的原理。

b.在第二种CSP2结构中也是同样的方式,以第一个CSP2结构为例,Yolov5s组件中使用了2×X=2×1=2个卷积,因为X=1,所以使用了1组卷积,因此是CSP2_1。而Yolov5m中使用了2组,Yolov5l中使用了3组,Yolov5x中使用了4组。
其他的四个CSP2结构,也是同理。

Yolov5中,网络的不断加深,也在不断增加网络特征提取和特征融合的能力。

6.2 Yolov5四种网络的宽度
四种网络的宽度差别如下图所示。

如上图表格中所示,四种yolov5结构在不同阶段的卷积核的数量都是不一样的,因此也直接影响卷积后特征图的第三维度,即厚度,这里表示为网络的宽度。

a.以Yolov5s结构为例,第一个Focus结构中,最后卷积操作时,卷积核的数量是32个,因此经过Focus结构,特征图的大小变成30430432。而yolov5m的Focus结构中的卷积操作使用了48个卷积核,因此Focus结构后的特征图变成30430448。yolov5l,yolov5x也是同样的原理。
b. 第二个卷积操作时,yolov5s使用了64个卷积核,因此得到的特征图是15215264。而yolov5m使用96个特征图,因此得到的特征图是15215296。yolov5l,yolov5x也是同理。

Yolov5中,卷积核的数量越多,特征图的厚度,即宽度越宽,网络提取特征的学习能力也越强。

========================================
本文主要参考了以下两篇文章:
https://zhuanlan.zhihu.com/p/172121380
https://zhuanlan.zhihu.com/p/143747206