Yolo v4的学习

目录

一、Yolo v4的structure

1、Backbone:CSPDarknet53

2、Neck:SPP、PANet

2.1、SPP:

2.2、PANet:

3、Prediction:Yolo v3 Head

二、Yolo v4的训练改进策略

1、数据增强:

2、CmBN

3、改进SAM

4、改进PAN

5、Dropblock

6、其他

7、其他IOU

7.1、GIOU

 7.2、DIOU

7.3、CIOU

三、Bof与Bos

1、Bag of freebies(Bof)

1.1、针对Backbone的Bof策略

1.2、针对检测器的Bof策略

2、Bag of specials(Bos)

2.1、针对Backbone的Bos策略

2.2、针对检测器的Bos策略

四、Loss


一、Yolo v4的structure

1、Backbone:CSPDarknet53

Yolo v4的主干特征提取网络为CSPDarknet53,在Yolo v3的Darknet53基础网络之上做了改进:

(1)激活函数改用了Mish,基本组件由Yolo v3的DBL(卷积+BN+Leaky relu)变为了DBM(卷积+BN+Mish)。

(2)借鉴了CSPNet,对Resblock_body模块做了改进。

Yolo v4的学习_第1张图片

所以Yolo v4的主干特征提取网络才为CSPDarknet53,为了方便理解Resblock_body模块,贴了以下图片。输入进入Resblock_body模块之后会先进行一次卷积核为3×3,步长为2的下采样,然后把输出分为两部分:一部分经过1×1的卷积之后做残差块的堆叠,再经过一次1×1的卷积;另一部分多的输出经过1×1的卷积之后与刚刚得到的输出做concat操作,经过concat之后的输出要再进行一次1×1的卷积才得到最终的输出,至此一个Resblock_body模块就完成了。Resblock_body模块中的残差块也是将输入分为两部分,一部分做1×1和3×3的卷积,另一部分则直接输出,两次的输出做一个add操作得到最终输出。(注:add操作并不改变维度,concat操作才会改变维度)Resblock_body后面跟着的n代表的是内部残差块的数量。

 Yolo v4的学习_第2张图片

参考:

  • https://blog.csdn.net/weixin_44791964/article/details/106214657
  • https://blog.csdn.net/Brillian123/article/details/122259296

2、Neck:SPP、PANet

对于Neck部分,作者引进了SPP和PANet。

2.1、SPP:

SPP能够极大地增加感受野,分离出最显著的上下文特征。在一般的CNN结构中,在卷积层后面通常连接着全连接层。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小,但实际上输入的图像尺寸是不能满足输入时要求的大小的,所以通常的手法就是裁剪(crop)和拉伸(warp)。但是这些方法的弊端就是,图片经过裁剪和拉伸,纵横比和输入尺寸会被改变,从而导致原始图像的扭曲。而何凯明提出的SPP(Spatial Pyramid Pooling空间金字塔池)层能很好的解决这样的问题, SPP通常连接在最后一层卷积层之后。实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛(convergence)。SPP 对于特定的CNN网络设计和结构是独立的(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层)。SPP将图片划分了三种不同尺度大小,分别进行池化之后将输出进行concat,这就是为什么经过SPP之后输出的size是固定的了,得到的结果用作全连接层的输入。

SPP 显著特点:
(1)不管输入尺寸是怎样,SPP 可以产生固定大小的输出
(2)使用多个窗口(pooling window)
(3)SPP 可以使用同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。
(4)由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变(scale-invariance)和降低了过拟合(over-fitting)
(5)不仅可以用于图像分类而且可以用来目标检测

Yolo v4的学习_第3张图片

2.2、PANet:

Yolo v4的Neck部分还采用了PANet结构,其实就是FPN+PAN,能够准确地保存空间信息。当图像经过神经网络的各个层时,特征的复杂度增加,同时图像的空间分辨率降低,PANet是实例分割算法中用于反复提取特征的,在FPN的基础上又添加了一条自底向上的路径,可以将丰富的语义信息和精确的定位信息结合起来,同时也让小目标更加明确,且比传统的FPN经过的特征图的数量大为减少,可以减少计算量。YOLOV4在个有效特征层上使用了PANet结构

在这里插入图片描述

 而Yolo v4还对PANet做了一点改进,在原本的PANet结构中的add操作改为了concatenate,不再将相邻层相加,而是拼接操作,以提高预测的准确性。

Yolo v4的学习_第4张图片

3、Prediction:Yolo v3 Head

检测头部分,Yolo v4和Yolo v3是相同的。在特征利用部分,Yolo v4提取多特征层进行目标检测,一共提取三个特征层,分别位于中间层,中下层,底层,三个特征层的shape分别为(52,52,256)、(26,26,512)、(13,13,1024)。输出层的shape分别为(13,13,75),(26,26,75),(52,52,75),最后一个维度为75是基于voc数据集的,它的类为20种,Yolo v4只有针对每一个特征层存在3个先验框,所以最后维度为3x25;如果使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x85,三个特征层的shape为(13,13,255),(26,26,255),(52,52,255)。

预测结果的解码:

其过程与yolo v3相同,将真实框转化为yolo v4输出的形式(基于网格点和anchor表达真实框的位置),方便计算loss。

解码过程如下:

(1)网格产生4+1+20   
(2)利用步骤1中的4确定预测框位置,通过x_offest,y_offest对网格点进行偏移,得到框的中心点的坐标,再经过图像尺寸(scale = input_shape/13)(以尺寸13为例)的缩放,就可以得到真实图片上预测框的中心点的坐标(x,y)。通过w和h对先验框进行微调,得到框的实际宽高,再根据图像尺寸(scale = input_shape/13)的缩放,就可以得到真实图片上预测框的实际宽和高(w,h)。至此得到了实际预测框的位置信息(x,y,w,h)。 
(3)利用20得到预测框的得分
(4)得到三个特征层上所有的预测框,一共13x13x3+26x26x3+52x52x3个预测框

解码之后还要进行得分排序与非极大抑制筛选,才能得到最终的结果。

参考:

https://blog.csdn.net/weixin_44791964/article/details/106214657

二、Yolo v4的训练改进策略

1、数据增强:

Yolo v4采用了新的数据增强方法:Mosaic、SAT。

  • Mosaic

数据增强的目的是为了增加输入图像的可变性,从而使所设计的目标检测模型对在不同环境下获得的图像具有更高的鲁棒性。在处理光度失真时,会调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,添加了随机缩放、裁剪、翻转和旋转。这些数据增强方法都是像素级调整,并保留调整区域中的所有原始像素信息。此外,一些从事数据增强的研究人员强调了模拟对象遮挡问题。它们在图像分类和目标检测方面取得了良好的效果。mosaic利用了四张图片,参考了CutMix数据增强方式,(CutMix就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配)丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行BN计算的时候会一下子计算四张图片,所以对本身batch_size不是很依赖,那么一个GPU就可以达到比较好的效果。

Yolo v4的学习_第5张图片

Yolo v4的学习_第6张图片

  • SAT(Self-Adversarial Training)

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

2、CmBN

原始的BN(Batch Normalization)操作是针对每一个batch中的数据进行计算均值和方差,但是当batch size设置的很小的时候,预测值中就会存在很多噪声。在CBN(Cross-Iteration Batch Normalization)方法中,通过迭代一定的次数,然后估算出t次迭代中的统计信息。作者提出的CmBN便是对CBN的改进,CmBN(Cross min-batch Normalization)的做法和前面两个都不一样,其把大batch内部的4个mini batch当做一个整体,对外隔离。如果每个Batch被分割为一个mini batch,则其效果与BN一致;若分割为多个mini batch,则与CBN类似,只是把mini batch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿。

参考:

理解BN:https://blog.csdn.net/weixin_44791964/article/details/114998793 

https://blog.csdn.net/qq_46292437/article/details/123059634

https://blog.csdn.net/qq_40716944/article/details/114822515

3、改进SAM

Yolo v4引入了注意力机制SAM,但对SAM做了改进,SAM 模块是空间注意力模块,YOLOv4 将 SAM 的 spatial-wise 注意力改为 point-wise 。并且在SAM中没有使用 pooling ,而是直接用一个卷积进行代替,再使用 sigmoid 进行激活,然后对应点相乘,所以说改进后的模型是 point-wise attention,将SAM从空间级注意修改为点态注意。

Yolo v4的学习_第7张图片

来源:

  • https://zhuanlan.zhihu.com/p/493583015

4、改进PAN

关于在PAN方面的改进,在上面就已经说啦,主要目的就是为了加速训练。

5、Dropblock

Dropblock 是借鉴 Cutout 的,并且对比之后发现 Dropblock 更优。在全连接层上效果很好的Dropout在卷积层上效果并不好,Dropblock的研究者则干脆整个局部区域进行删减丢弃,对网络的正则化过程进行了全面的升级改进。a表示原始输入图像;b图表示了随机dropout激活单元,绿色部分表示激活的特征单元。但是这样dropout后,网络还会从drouout掉的激活单元附近学习到同样的信息;c图表示DropBlock,绿色部分表示激活的特征单元,通过dropout掉一部分相邻的整片的区域(比如头和脚),网络就会去注重学习狗的别的部位的特征,来实现正确分类,从而表现出更好的泛化。

6、其他

对于训练激活函数,由于PReLU和SELU更难训练,而且ReLU6是专门为量化网络设计的,因此不考虑PReLU、SELU、ReLU6。至于归一化方法的选择,由于只使用一个GPU的训练策略,因此不考虑syncBN。 

7、其他IOU

7.1、GIOU

与 IOU 只关注重叠区域不同,GIOU 不仅关注重叠区域,还关注其他的非重合区域,能更好的反映两者的重合度,且不受目标限制大小,具有良好的泛化能力。GIOU先计算两个框的最小闭包区域面积,即同时包含了预测框和真实框的最小框的面积,再计算出 IOU,再计算闭包区域中不属于两个框的区域占闭包区域的比重,最后用 IOU 减去这个比重,最后得到 GIOU。GIOU的计算公式为:GIOU=IOU-\frac{S_{c}-S_{\left ( A\bigcap B \right )}}{S_{c}},GIOU_loss的计算公式为:LOSS_{GIOU}=1-GIOU。GIOU∈[-1,1],GIOU_loss∈[-2,0]。

Yolo v4的学习_第8张图片

 7.2、DIOU

DIOU将目标与anchor之间的距离、重叠率以及尺度都考虑进去了,使得目标框回归变得更加稳定,不会像IOU和GIOU一样出现训练过程中发散等问题。 与GIOU_loss类似,DIOU_loss在与目标框不重叠时,仍然可以为边界框提供移动方向。DIOU_loss可以直接最小化两个目标框的距离,而GIOU_loss优化的是两个目标框之间的面积,因此比GIoU loss收敛快得多。对于包含两个框在水平方向和垂直方向上这种情况,DIOU_loss可以使回归非常快,而 GIOU_loss几乎退化为 IOU_loss。DIOU 还可以替换普通的 IOU 评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。DIOU的计算公式为:DIOU=IOU-\frac{\rho ^{2}\left (b,b^{gt} \right )}{c^{2}},DIOU_loss的计算公式为:LOSS_{DIOU}=1-DIOU。其中bb_{gt}分别代表了预测框和真实框的中心点, \rho ^{2}\left ( b,b^{gt} \right )代表了预测框和真实框的中心点的欧式距离,c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。

Yolo v4的学习_第9张图片

7.3、CIOU

CIOU考虑了回归框三要素中的长宽比,在DIOU的基础上,加入了长宽比进行改进。关注两个框的重叠面积、中心点距离及长宽比,具有更好的性能与更快的收敛速度。关于CIOU的公式为:IOU-\frac{\rho ^{2}\left ( b,b^{gt}\right )}{c^{2}}-\alpha\nu,其中\alpha =\frac{\nu }{1-IOU+\nu}\nu =\frac{4}{\pi ^{2}}\left ( arctan\frac{w^{gt}}{h^{gt}} -arctan\frac{w}{h}\right )。CIOU_loss的公式为:LOSS_{\left ( CIOU \right )}=1-CIOU

Yolo v4的学习_第10张图片

三、Bof与Bos

1、Bag of freebies(Bof)

只会改变培训策略或只增加训练成本使目标检测器在不增加推理成本的情况下获得更好的精度的方法称为Bof。

1.1、针对Backbone的Bof策略

  • CutMix

CutMix就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。

Yolo v4的学习_第11张图片

  • Mosaic
  • DropBlock regularization
  • Class label smoothing

将标签进行一个平滑,原始的标签是0、1,在平滑后变成0.005(如果是二分类)、0.995,让模型不可以分类的太准确,太准确容易过拟合。

1.2、针对检测器的Bof策略

  • CIOU_loss

在YOLO v4中,把位置的损失函数变成了CIOU_loss。

  • CmBN

DropBlock regularization

  • 余弦退火调节

余弦函数的特点是,随着自变量 x 的增大,余弦函数值先缓慢下降,然后加速下降,再减速下降,所以常用余弦函数来降低学习率,称之为余弦退火(Cosine Annealing)。根据余弦函数调整学习率, 它从缓慢降低大的学习率开始。 在中途迅速降低学习率,最终学习率慢慢降至微小值。使得学习率按照周期变化,在一个周期内先下降,之后上升。由于刚开始训练时,模型的权重是随机初始化的,此时若选择一个较大的学习率,模型可能会出现振荡现象。利用训练预热(Warmup)学习率的方法,使得前几个周期内的学习率较小,在较小的学习率的预热下模型将逐步趋于稳定,当模型较为稳定后便使用预先设置的学习率进行训练,这有利于加快模型的收敛速度,模型效果更佳。

  • 最优超参数

使用遗传算法选择超参数。

2、Bag of specials(Bos)

对于那些只增加少量推理成本但又能显著提高目标检测精度的插件模块和后处理方法,称为Bos。

2.1、针对Backbone的Bos策略

  • Mish激活

Mish激活函数公式为:Mish=xtanh\left (ln \left (1+x \right ) \right ),图像为:

Yolo v4的学习_第12张图片

 Mish函数保证了每一点的平滑,从而使得梯度下降效果比Relu要好。

  • CSP
  • MiWRC

MiWRC(Multi-input weighted residual connection),多输入加权残差连接,在BiFPN中,提出了用MiWRC来执行标尺度级重加权,添加不同尺度的特征映射。

2.2、针对检测器的Bos策略

  • Mish激活
  • SPP
  • SAM
  • PAN
  • DIOU-NMS

就是将传统NMS中计算IOU的部分替换成DIOU,不仅考虑了重叠面积,还考虑了中心点距离。相比传统NMS,DIoU-NMS有遮挡的情况效果更好,如果两个框之间IOU比较大,但是两个框的中心距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。

四、Loss

计算的总的loss是三个loss的和,这三个loss分别是:

  • 实际存在的框,CIOU LOSS。
  • 实际存在的框,预测结果中置信度的值与1对比;实际不存在的框,预测结果中置信度的值与0对比,该部分要去除被忽略的不包含目标的框。
  • 实际存在的框,种类预测结果与实际结果的对比。

 参考:

https://blog.csdn.net/weixin_44791964/article/details/106214657

---------------------------------------------------------------------------------------------分界线-----------------------------------------------------------------------------第一次尝试把自己学的整理的放出来,v4的知识点真多啊。。。。还有一些我查阅的文章我都不记得了,没有每篇参考都放链接。

你可能感兴趣的:(学习,深度学习,目标检测)