YOLOv4

YOLO系列(四)——YOLO v4



前言

该系列为博主自主学习YOLO系列的自我总结。本篇是对YOLOv4进行一个总结和分析。YOLOv4网络结构改动不大,主要添加了很多tricks,达到了速度快,精度高且运算成本低的要求,使得任何人都可以使用一张1080Ti或者2080Ti GPU去训练一个超级快速和精确的目标检测器。本文主要从YOLOv4的网络结构中的四个部分进行总结概括:Input、Backbone、Neck、Head。


一、Input

Mosaic 数据增强

在这里插入图片描述
Mosaic数据增强是将原本数据集中四张图片进行随机缩放,随机分布,然后整合成一张图片。合成之后的图片包含原四张图片的目标。这样做的好处是提高了小目标数据的占比,从而提升了对小目标进行特征提取的能力,达到精度提升的效果。并且在使用Mosaic数据增强后可在训练时降低每个mini-batch中的样本数量,从而提升训练效率。

Cross Mini-Batch Normalization (CMBN)

上述提到,在Mosaic数据增强后可采用较小的mini-batch,但是这样会使得传统的BN层效果不理想。BN层的引入是为了解决内部分布偏移问题,将均值和方差归一化到[0,1]之间。当mini-batch较小时,均值和方差的偏差会很大,针对当前batch的统计值可能包含大量的噪音估计。要解决这个问题,可以利用当前和先前迭代的均值很方差,因此Cross-Iteration Batch Normalization(CBN)油然而生。
那么利用先前迭代的轮数K就是CBM中的关键参数值,通过实验发现,K=8一个不错的选择。而在YOLOv4中采用的是 Cross Mini-Batch Normalization (CMBN),是CBM的简化版。CMBN是在一个batch中的mini-batch之间进行迭代,之前所提到的关键参数K的取值就是一个batch内的mini-batch数量。

Self-Adversarial Training (SAT)

自对抗训练(SAT)代表了一种新的数据增强技术,分为前向和后向操作。在第一阶段(前向操作),神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己进行对抗性攻击,改变原始图像,制造出图像上没有目标物体的假象。在第二阶段(后向操作),训练神经网络以正常的方式检测修改后的图像上的目标。


二、Backbone

YOLOv4网络结构图引用了博主江大白的图。
在这里插入图片描述
上图中的红色框部分就是YOLOv4网络结构中的Backbone部分。可以看出,Backbone的主要组成成分有CBM模块和CSPx模块。其中,CBM = Conv + BN + Mish,CSPx是由一系列的CBM和x个Res unit构成,具体的包含的层可在图中看出。与YOLOv3相比,YOLOv4在Backbone中有以下三个创新点。

(1)CSPDarknet53

其实CSPDarknet和Darknet形式上差不多,都是以残差结构为主构成的backbone。但是CSP在原论文中说到其最大优点是降低运算成本,在不减少精度的前提下,CSP的运算量可降低20%。CSP主要思想是通过分割梯度流,使梯度流通过不同的路径(残差)进行传播,总的来说就是进行跨层局部操作。
【*本人感觉就是在不同路径上对梯度进行单独操作,最后再进行拼接,就像是电路并联一样】

(2)Mish激活函数

在这里插入图片描述

YOLOv4在Backbone中使用的激活函数是Mish而不是Leaky ReLU。Mish具有无边界的特点,可以避免梯度饱和这一问题。比如sigmoid,tanh激活函数通常存在梯度饱和问题,在两边极限情况下,梯度趋近于1,而Mish激活函数则巧妙的避开了这一点。另外Mish函数也保证了每一点的平滑,从而使得梯度下降效果比Relu要好。

(3)Dropblock

Dropout 的主要作用就是随机使一些特征失活,是缓解过拟合的一种正则化手段。一般作用在全连接层。Dropout 在全连接层是可以起到作用的,但在卷积层上作用并不明显。因为卷积层上的特征是空间相关的,并且一般卷积之后都有池化,池化层本身就是对相邻单元起作用,即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。
而在 DropBlock 中,是将特征层中的局部区域丢弃掉,而不是某几个特征。当网络失去了某些相关区域的连续特征后,为了继续拟合,那么网络就不得不往不同的方向进行更新,从而减少过拟合的程度。
所以Dropout主要用于全连接层,而DropBlock主要用于卷积层,因为卷积层一般都包含池化层,池化层后再用Dropout效果不明显。
在这里插入图片描述


三、Neck

SPP(空间金字塔池化)

SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像高宽比和大小任意。在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。如下图所示,就是SPP中经典的空间金字塔池化层。
在这里插入图片描述
下图是引用博主太阳花的小绿豆博文中的图。本人认为这张图很清晰的展示了SPP的具体构造。13×13×512维的feature map分别经过5×59×913×13的最大池化层。经过三种不同池化层的处理后的三个结构再与原输入拼接,最后输出维度是13×13×2048。拼接的前提是feature map的高宽一致,所以在之前的最大池化中包含着padding操作,而每一个最大池化的padding就是池化层的kernel-1。
在这里插入图片描述

FPN + PAN

FPN 是自顶向下的金字塔,将特征层的宽高进行缩减;而 PAN 是自底向上的金字塔,可以恢复特征层的宽高。由于 FPN 只是将高层的语义特征传递下来,并没有传递定位信息,所以针对这一点,连接在后面的PAN就是为了传递定位信息。PAN 来源于 PANet,当时是应用于图像分割领域的,可以进一步提高特征提取的能力。
如下图所示,P5 -> P2是FPN结构,在YOLOv3就被使用过。在YOLOv4中加了后面的PAN结构,也就是N2 -> N5。这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行特征聚合。
在这里插入图片描述
这里需要注意的点有两个:

  1. YOLOv3和YOLOv4的最终输出都有三个不同的维度,分别是19×19、38×38、76×76。但是输出顺序不一样,YOLOv3是y1=19、y2=38、y3=76,anchor box也是由小到大一一对应。而YOLOv4是y1=76、y2=38、y3=19,其中y1对应最小的anchor box,y3对应最大的。
  2. 如下图所示,PANet中的PAN结构在连接各个特征图时采用shorcut操作,而YOLOv4中采用的是拼接操作。
    在这里插入图片描述

四、Head

YOLOv4的Head部分基本上与YOLOv3一致,主要就是改变了两个trick,一是将IOU_Loss替换为CIOU_Loss;第二个就是NMS用的DIOU_NMS。

(1)CIOU_Loss

目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。Bounding Box Regeression的Loss的发展过程是:Smooth L1 Loss-> IoU Loss-> GIoU Loss-> DIoU Loss->CIoU Loss。
Head部分主要的创新点就是IOU被替换成为CIOU。下面来注意对比以下各种IOU的区别,在对比过程中引用了江大白博主的图片(真·业界良心博主
IOU_Loss
在这里插入图片描述

IOU主要考虑检测框和目标框重叠面积。这样会存在两个问题,第一个是当IOU=0时,无法反映两个框之间的距离,如下图的第一幅图。第二个就是当IOU的值相同时,IOU_Loss无法区分具体相交情况,也就是说只要IOU值一样,就默认为效果完全一样。如下图的右边两幅图。
在这里插入图片描述

GIOU_Loss
在这里插入图片描述
在IOU的基础上,解决边界框不重合时的问题。在GIOU_Loss中,增加了一个新概念——差集,在一定程度上优化了两框重叠,且IOU相同的情况。但是这样还存在一种问题。如下图所示,当预测框在目标框内部时,GIOU和IOU的情况就一样了,完全起不到优化作用。

在这里插入图片描述

DIOU_Loss
在这里插入图片描述

在IOU和GIOU的基础上,引入了边界框中心点距离的概念。当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。但也存在一个问题,那就是如下图所示,中心点距离相同,但是预测框的长宽不一样,按理来说效果也不一样,而DIOU无法比较这种情况。
在这里插入图片描述

CIOU_Loss
在DIOU的基础上,加入了边界框宽高比的尺度信息。其余的和DIOU都是一样的,具体公式如下。
在这里插入图片描述
在这里插入图片描述

(2)DIOU_NMS

在YOLOv4种,NMS由一般的传统NMS改为DIOU_NMS。在损失函数中采用的是CIOU_Loss,那为什么在NMS中不采用CIOU_NMS呢?这是因为CIOU_loss,实在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值