12. YOLOv4

255 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

YOLOv4的两个bags的优化函数:在训练期间使用的“Bag of Freebies (BoF)”和在推理期间使用的“Bag of Specials (BoS)”

YOLOv4 优化函数.png

今天我们捡着一些经典的trick为大家讲解YOLOv4.

1.YOLOv4网络结构

图片1.png

图1-1 YOLOv4网络结构

1.1 backbone:CSP结构

  • 增强CNN的学习能力
  • 移除计算瓶颈
  • 减少存储使用

图片1.png

图1-2 图1-1中DownSample结构

CSP结构正如YOLOv4中的DownSample结构,对输入的feature map先进行两次1×1卷积生成Part1和Part2,再将Part1输入n个ResBlock结构,最后将提取到的特征图与Part2在通道上拼接在一起,每经过DSPBlock结构,通道数会增加一倍。

1.2 Neck:SPP结构,PAN结构

1.2.1 SPP结构

SPP就是通过池化核为5×5,9×9,13×13,用padding填充的最大池化,最终仍然变成16×16大小,再concatenate起来。

图片1.png

图 1-3 SPP结构

SPPnet特点:

1.通过SPP获取不同感受野大小的三个特征图并拼接在一起,使经过SPP获取得到的特征图具有不同的感受野,特征图包含的信息更全面。

2.不管输入尺寸怎样,SPP最终可以产生固定大小的输出。

1.2.2 PAN结构

如图1-1中,YOLOv4中的PAN(Path Aggregation Network)结构从顶到底,将深层和浅层特征进行拼接,再将三种融合特征层从底到顶,将浅层融合特征层和深层融合特征层进行拼接(concatenate)。

add:直接将两个特征图对应像素相加,是resnet的融合方法,这种残差相加可以有效地减小因网络层数加深而导致的CNN网络退化问题。但是add改变特征图像素值,并没有完全保留原本特征图信息,丢失了更多的细节信息。

concat:将两个特征图在通道数方向叠加在一起,原特征图信息完全保留下来。

图片.png

图1-4 YOLOv4中PAN结构是concatenate

图片.png

图1-5 与FPN结构的对比

1.3 Head:YOLOv3

YOLOv4的检测头与YOLOv3一致。

2.YOLOv4 的其他小tricks

2.1 Mosaic数据增强

从数据集中随机选取4张图片,进行随机裁剪,缩放,色域变换等等,最后将四张图拼接在一起。

图片.png

图2-1 Mosaic数据增强

Mosaic数据增强的优点:

  • 丰富了检测物体的背景和小目标,提升了小目标的检测性能。
  • 在计算Batch Normalization的时候一次会计算四张图片的数据,使得mini-batch大小不需要很大,一个GPU就可以达到比较好的效果。

2.2 Mish激活函数

Mish是光滑的非单调激活函数,可定义为: f(x)=xtanh(ς(x))f(x) = x*tanh(ς(x))

图片.png

图2-2 Mish激活函数

2.3 Eliminate grid sesitivity

这一步通常是前12800次迭代进行Anchor到预测框的位置修正,后面的迭代不再修正,只进行预测框的confidence、类别、位置。(参考YOLOv2的损失函数)

YOLOv2的Direct lacation predict中我们之前讨论过,对Anchor修正到预测框的函数进行了改进,用σ\sigma函数进行约束Anchor中心点(x,y)(x,y)的位置。

在YOLOv4中,作者认为如果目标的中心点位于grid的边角上,那么由于σ\sigma函数在(0,1)之间的,就不能取到0,1这两个数值,从而也无法来预测中心点的边角位置。

YOLOv4对这个函数进行了改进:

bx=(σ(tx)scalexyscalexy12)+cxb_x=(σ(t_x)⋅scale_{xy}−\frac{scale_{xy}−1}{2})+c_x

by=(σ(ty)scalexyscalexy12)+cxb_y=(σ(t_y)⋅scale_{xy}−\frac{scale_{xy}−1}{2})+c_x

比较新的实现方法包括YOLOv5都将scalexyscale_{xy}设置2

图片.png

图 2-3 scale的y值可知范围约束在(-0.5,1.5),sigma的y值可知范围约束在(0,1)

2.4 CIoU LOSS

我们之前对于定位(x,y,w,h)(x,y,w,h)损失,参考YOLOv2l2l2 lossloss

YOLOv4用CIOUCIOU lossloss代替了l2l2 loss。

  • IOUIOU lossloss=lnIOU-lnIOU

  • GIOU=IOUAcuAcGIOU=IOU-\frac{A^c-u}{A^c}

    AcA^c指预测框与GT的最小闭包区域。

    uu指预测框与GT的并集。

    LGIOU=1GIOUL_{GIOU}=1-GIOU

  • DIOU=IOUd2c2DIOU=IOU-\frac{d^2}{c^2}

    dd指GT与预测框之间中心点的距离。

    cc指预测框与GT的最小闭包区域左上角到右下角的距离。

    LDIOUL_{DIOU}=1DIOU1-DIOU

  • CIOU=IOU(d2c2+av)CIOU=IOU-(\frac{d^2}{c^2}+av)

    LCIOU=1CIOUL_{CIOU}=1-CIOU

    v=f(w,h)v=f(w,h)

    a=f(v)a=f(v)

2.5 DIoU NMS

Head输出三个预测层的预测框,再经过NMS筛选。

DIoU NMS的处理步骤:

1.遍历图片中识别出目标的框。

2.按照每种类别对框单独分析:将A类别的框按照分数从大到小排序。

3.设A类最大概率的框为target,依此比较A类其他框与target的DIoU,如果计算结果>DIoU阈值,则框概率归0(被剔除)。直到扫描结束。

4.接着设次大概率的框为target,与3步骤一样(除了不去与3中的target计算DIoU)。

5.假如最终留下了2个框,那么对于计算机来说,这张图片可能出现了2个A物体。

6.接下来我们还要对剩下的79种类别进行上述操作。

7.最后,需要进行纵向跨类比较,因为该物体在A类和B类中可能都是较大的概率。

2.6 DropBlock

DropBlock和DropOut的作用是一样的,都是网络进行正则化,防止过拟合的手段。个人理解就是通过删掉参数来掩盖相应特征,从而防止过拟合。

DropOut:设定某层dropout比率,随机丢弃神经元(参数矩阵上的像素点)。

DropBlock:DropOut用在全连接层上,在卷积层上应用的意义不大,因为每个feature map的位置都有一个感受野范围,仅仅对单个像素位置进行DropOut不能降低feature map学习特征的范围,网络仍然可以通过该位置的相邻元素去学习语义信息。

因此引入DropBlock,对feature map某一连续块进行丢弃。

图片.png

左图为DropOut,右图为DropBlock