【目标检测】YOLOV4详解

1、YOLOV4网络结构

前面讲完了V1、V2、V3,其中YOLOV4 和V3的网络区别就是多了CSP和PAN结构,以及一个SSP。贴一下网络结构图。

 首先介绍一下网络结构中出现的各种组件。

CBM:是由Conv+BN+Mish激活函数组成,和V3不同的是这里的激活函数由Leaky_relu换成了Mish。

CBL:这个组件就是YOLOV3中的最小组件,但是在这里V4 将CBL放在了Neck模块里,并没有放在Backbone。

Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。

CSPX:借鉴CSPNet网络结构,由卷积层和X个Res unit模块Concate组成。

SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

在这里需要说的是还是需要将Concate和Add操作分开。

介绍完这些组件之后,可以看到YOLOV4整体的模型被分成了四大块,在每一块都有一些tricks存在。

输入端:这里主要做了一些数据增强方式,比如Mosaic数据增强、cmBN、SAT自对抗训练。

Backbone:换成了CSPDarknet53、Mish激活函数、Dropblock。

Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构.

Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms。

看一下作者的效果图吧。

2、输入端的创新

 在这里主要讲一下Mosaic数据增强方式,这种增强方式其实就是将图片进行随机缩放、随机裁剪以及随机排布的方式进行拼接,在这里是使用四张图片进行拼接的方式,具体的如下图所示:

数据增强是一种很有效的方式,尤其是在数据集很少的情况下。但是在YOLOV4中的Mosaic数据增强的好处主要是:

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

3、Backbone的创新

首先来看一下整体框架,整体的框架就是在YOLOV3的Darknet53基础上,应用了CSPNet的思想,将CSP替换掉了Res unit。

CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。因此Yolov4在主干网络Backbone采用CSPDarknet53网络结构,主要有三个方面的优点:增强CNN的学习能力,使得在轻量化的同时保持准确性、降低计算瓶颈、降低内存成本。

第二个改变就是在backbone中应用了Mish函数,具体和leaky_relu的区别如下图所示:

第三个就是应用了Dropblock,具体作用就是随机丢弃一些神经元,使网络变得更简单,这里和 Dropout的区别是,Dropout会随机丢弃一些神经元,但是在卷积层中这种方式并不是很敏感的,因为卷积层可以从相邻的激活单元中学到相同的信息,因此在全连接层上面的Dropout在卷积层并不适用。具体如下图所示:

4、Neck的创新

首先第一个就是SPP组件的加入,SPP的主要原理就是使用K={1*1,5*5,9*9,13*13}的最大池化,将不同尺度的特征图进行Concat操作。这里对相同大小的特征图采用了padding的方式,以保证池化之后的特征图和之前一样大小。

这种方式可以更加有效地增加主干网络的特征范围。

第二点改变就是使用了FPN+PAN ,这里也是和YOLOV3 最大不同的地方。先来看一下具体结构图:

 每个CSP模块前面的卷积核都是3*3大小,步长为2,相当于下采样操作。因此在三个紫色箭头处的特征图是76*76、38*38、19*19。可以看到和YOLOV3的区别就是不仅仅有了FPN结构,还包括了大的特征图下采样到小特征图结合的方式,这也就是PAN,具体的图如下所示:

这样做的好处是,大的特征图包含更强的定位特征,能够更好地对物体进行回归框的标注,而更为深层次的特征图会传递语音信息,两两结合更为有效。

 5、Prediction

目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)。我们从最常用的IOU_Loss开始,进行对比拆解分析,看下Yolov4为啥要选择CIOU_Loss。

a.IOU_Loss

在第一张图可以看到IOU很简单,其实就是交集/并集,但是就会存在下图中的两个问题。

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

问题2:即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。

因此出现了GIOU_Loss来进行改进。

b.GIOU_Loss

可以看到右图GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬。但为什么仅仅说缓解呢?因为还存在一种不足:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
基于这个问题,又提出了DIOU_Loss

c.DIOU_Loss

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

DIOU_Loss考虑了重叠面积中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。但就像前面好的目标框回归函数所说的,没有考虑到长宽比。比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。针对这个问题,又提出了CIOU_Loss。

d.CIOU_Loss

CIOU_Loss和DIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。

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

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

再来综合的看下各个Loss函数的不同点:

IOU_Loss:主要考虑检测框和目标框重叠面积。

GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。

DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。

CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些。

参考:深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎

猜你喜欢

转载自blog.csdn.net/qq_38375203/article/details/125535444