DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解

文章目录

  • 一、结构
    • 1.1 网络结构图
    • 1.2 YOLOv4的PAN结构
    • 1.3 激活函数的思考
      • 1.3.1 Mish激活函数
      • 1.3.2 Swish激活函数
  • 二、损失
    • 2.1 L1、L2、SMOPTH_L1
    • 2.2 IOU_LOSS的问题
    • 2.3 GIOU_Loss
    • 2.4 DIOU_Loss
    • 2.5 CIOU_Loss
    • 2.6 DIOU_nms
  • 三、训练
    • 3.1 Dropblock
    • 3.2 Mosaic数据增强
    • 3.3 SAT自对抗训练(Self-adversarial-training)
    • 3.4 CmBN
    • 3.5 modified SAM
    • 3.6 modified PAN
  • 四、效果

YOLOv4论文链接:YOLOv4: Optimal Speed and Accuracy of Object Detection
先放上思维导图,需要原图的可以留言~
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第1张图片

一、结构

1.1 网络结构图

YOLOv4 包含以下三部分:
backbone网络:CSPDarknet53
Neck:SPP、PAN
Head:YOLOv3
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第2张图片
Yolov4的五个基本组件:
1)CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
2)CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
3)Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
4)CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。(尺寸转换可以用这个思想)
5)SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
个人认为:CSPX结构里下面的CBM应该改为卷积,这点在YOLOv5里面有体现,因为有激活会产生非线性,有可能会梯度弥散,我会在下一篇博文介绍。
设计组件:不同大小的卷积核卷积、空洞卷积、池化等,最后用Maxout(像素选最大的)、Concate、Add
其他基础操作:
1)Concat:张量拼接,维度会扩充,和Yolov3中的解释一样,对应于cfg文件中的route操作。
2)add:张量相加,不会扩充维度,对应于cfg文件中的shortcut操作。

1.2 YOLOv4的PAN结构

FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。
原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat操作,特征图融合后的尺寸发生了变化。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第3张图片

1.3 激活函数的思考

激活函数的表达能力与级数有关,sigmoid表达能力很强,因为它求导还是它本身,二阶导还是它本身,可以无限导下去。
Sigmoid的缺点:容易饱和,就容易梯度弥散,不好训练,但sigmoid训练出来的网络能力一定很强。

Relu的表达能力很弱,一阶导为1。但不容易梯度弥散。
网络结构大的原因:Relu很弱,需要设计很多网络增强其非线性。所以需要设计其表达能力变强。

AI的本质:把低维度非线性不可分问题转为高维度线性可分问题,所以要用激活函数,维度越高,越容易线性可分。
重要!!!!!!:激活函数可以拼凑出来,相乘得到新激活函数
关于激活函数,大家可以看这篇文章:激活函数(ReLU, Swish, Maxout)

1.3.1 Mish激活函数

Yolov4的Backbone中都使用了Mish激活函数,而后面的网络则还是使用leaky_relu函数。
在这里插入图片描述
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第4张图片
橙色曲线为:ln(1+e^(x))
蓝色曲线为:Mish函数
mish函数的Pytorch实现:

import numpy as np
from matplotlib import pyplot as plt


def mish(x):
    return x * np.tanh(np.log(1 + np.exp(x)))

x = np.linspace(-10, 10, 1000)
y = []
z = []
for i in x:
    y.append(mish(i))
plt.plot(x, y)
plt.grid()
plt.show()

1.3.2 Swish激活函数

在这里插入图片描述
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第5张图片

二、损失

2.1 L1、L2、SMOPTH_L1

DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第6张图片
L1损失:不重要的权重被压成0,重要的权重保存下来,导致网络退化;经常用L1损失做剪枝。梯度不变,开始收敛还可以,学习率一样的话在下面容易震荡

L2损失:不重要的权重被压小到0附近,重要的权重被保留或放大。训练时,远的点先收敛较快,再收敛稳定。远的点梯度太大,容易崩掉;且对噪音比较敏感,噪音的点往往比较远,导致训练不稳定。

SMOPTH_L1损失:远处用L1,近处用L2

2.2 IOU_LOSS的问题

DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第7张图片
问题1:即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。

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

损失是需要找到一个方向,不断靠近,AI要选择一个方向进行靠近。

2.3 GIOU_Loss

1)GIOU的公式:
在这里插入图片描述
先计算两个框的最小闭包区域面积 [公式] (通俗理解:同时包含了预测框和真实框的最小框的面积),再计算出IoU,再计算闭包区域中不属于两个框的区域占闭包区域的比重,最后用IoU减去这个比重得到GIoU。
2)GIOU的不足:
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第8张图片
问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。 基于这个问题,2020年的AAAI又提出了DIOU_Loss。(框的损失没有方向了

3)GIOU_LOSS:
在这里插入图片描述

2.4 DIOU_Loss

好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比
针对IOU和GIOU存在的问题,作者从两个方面进行考虑

一:如何最小化预测框和目标框之间的归一化距离?
二:如何在预测框和目标框重叠时,回归的更准确?

针对第一个问题,提出了DIOU_Loss

1)DIOU的公式:
在这里插入图片描述
其中, [b] , [b^gt] 分别代表了预测框和真实框的中心点,且 [ρ] 代表的是计算两个中心点间的欧式距离。 [c] 代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第9张图片
2)DIOU的不足:
DIOU_Loss考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第10张图片
但就像前面好的目标框回归函数所说的,没有考虑到长宽比。
比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。

但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。针对这个问题,又提出了CIOU_Loss

3)GIOU_LOSS
在这里插入图片描述

2.5 CIOU_Loss

1)CIOU的公式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中 α 是用于做trade-off的参数,v是用来衡量长宽比一致性的参数。
2)GIOU_LOSS
在这里插入图片描述
关于IOU_LOSS的详细介绍可以转到这篇文章查看IoU、GIoU、DIoU、CIoU损失函数的那点事儿

2.6 DIOU_nms

Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,Yolov4将其中计算IOU的部分替换成DIOU的方式:
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第11张图片
这里为什么不用CIOU_nms,而用DIOU_nms?

因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。

三、训练

3.1 Dropblock

Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式。统的Dropout很简单,一句话就可以说的清:随机删除减少神经元的数量,使网络变得更简单。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第12张图片
Dropblock在2018年提出,论文地址:https://arxiv.org/pdf/1810.12890.pdf
传统的Dropout很简单,一句话就可以说的清:随机删除减少神经元的数量,使网络变得更简单。而Dropblock和Dropout相似,比如下图:
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第13张图片
中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息
因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。

这种方式其实是借鉴2017年的Cutout数据增强的方式,cutout是将输入图像的部分区域清零,而Dropblock则是将Cutout应用到每一个特征图。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第14张图片
Dropblock的研究者与Cutout进行对比验证时,发现有几个特点:

优点一:Dropblock的效果优于Cutout
优点二:Cutout只能作用于输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上
优点三:Dropblock可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和Cutout相比都有更精细的改进。

Yolov4中直接采用了更优的Dropblock,对网络的正则化过程进行了全面的升级改进。

3.2 Mosaic数据增强

Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片随机缩放、随机裁剪、随机排布的方式进行拼接。

为什么要进行Mosaic数据增强?
在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。
首先看下小、中、大目标的定义: 2019年发布的论文《Augmentation for small object detection》对此进行了区分:
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第15张图片
可以看到小目标的定义是目标框的长宽0×0~32×32之间的物体。但在整体的数据集中,小、中、大目标的占比并不均衡。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第16张图片
如上表所示,Coco数据集中小目标占比达到41.4%,数量比中目标和大目标都要多。
但在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。针对这种状况,Yolov4的作者采用了Mosaic数据增强的方式。

主要有几个优点:

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

此外,发现另一研究者的训练方式也值得借鉴,采用的数据增强和Mosaic比较类似,也是使用4张图片(不是随机分布),但训练计算loss时,采用“缺啥补啥”的思路:
如果上一个iteration中,小物体产生的loss不足(比如小于某一个阈值),则下一个iteration就用拼接图;否则就用正常图片训练,也很有意思。

3.3 SAT自对抗训练(Self-adversarial-training)

第一个阶段中,神经网络更改原始图像;第二阶段中,训练神经网络以正常方式在修改后的图像上执行目标检测任务。
安全相关:攻击网络;前向计算得到结果,反向传播时:图片当变量,用梯度反算回去加噪声。

什么是对抗样本
简单的说,就是会使得机器学习的算法产生误判的样本。比如下图
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第17张图片
2014年,Anh Nguyen,Jason Yosinki,Jeff Clune发表论文Deep Neural Networks are Easily Fooled,构造了一类“对抗样本”。机器视觉在这些样本上会产生戏剧性的错误。如图,深度神经网络把左图看成狗,右图看成鸵鸟。

为什么会产生对抗样本
训练样本集不可能覆盖所有的可能性,并且很可能只能覆盖一小部分,所以不可能从中训练出一个覆盖所有样本特征的模型
用模型训练分类问题的时候,目标是如何更好的分类,所以模型会尽量扩大样本和boundary之间的距离,扩大每一个class区域的空间。这样做的好处是让分类更容易,但坏处是也在每一个区域里包括了很多并不属于这个class的空间。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第18张图片
如上图,蓝色为数据的真实决策边界(real decision boundary),红色为模型的决策边界(model decision boundary)。可以发现,基于图中已有的数据集,红线已经是一条最后的决策边界了,但是离真实的决策边界依然有很多差别的地方,当维数增加,这样的差别会变得更加的大,也就是说会有许多的对抗样本存在。

模型的鲁棒性
因为对抗样本的存在,我们有必要对机器模型的评判提供一个新的评判标准,用于分析模型对于微小扰动的抵抗能力。使得模型误判需要的扰动幅度越大,那么说明模型的鲁棒性越好。

生成对抗样本的方法简介
在一个黑盒攻击中,我们能够得知模型对应的输入输出,由于对抗样本存在的必然性,理论上,我们只需要在原样本中随机的添加扰动,然后不断暴力尝试,测试是否攻击成功即可。

但是实际上,这样的搜索是及其耗时的,并且随着特征纬度增加,几乎是不可实现的,想要通过随机的干扰构造出对抗样本的可行性是很小的。

基于此,现在已有很多生成对抗样本相关的算法出现,下面仅做一些简单的介绍:

Fast Gradient Sign Method(FGSM)
这个算法在Good Fellow的论文EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES中提出,主要是基于对抗样本的线性解释。之前很多人认为是由于模型非线性的特征导致了对抗样本的产生,而论文提出恰恰是模型本身的线性(或者说是通过点乘得到score的方式)引发了对抗样本。一个形象的解释如下图:
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第19张图片
Targeted FGSM
与FGSM主要的区别是,FGSM将样本沿着梯度下降的反方向构造样本,而targeted FGSM沿着希望模型误判的class的方向构造。

Iterative FGSM(I-FGSM)
上面两个FGSM的算法在构造对抗样本的时候都只进行了一部构造,也就是沿着特定的方向在一定阈值的限制下,移动一步。而I-FGSM则通过多步更小的移动,使得能够构造出更加精准的对抗样本,但同时也提升了构造的计算量,减慢了构造的速度。

RAND-FGSM
该算法在论文Ensemble Adversarial Training Attacks and Defenses中提出,提出的原因主要是认为:在数据点附近的损失函数会有很大的曲率,也就是不够平滑,从而导致生成的对抗样本会对自身的模型有特异性,这也解释了为什么经过对抗训练的模型对于白盒攻击的鲁棒性比黑盒攻击的鲁棒性更好这个奇怪的现象。

JSMA
算法提出自论文The Limitations of Deep Learning in Adversarial Settings

对抗训练
通过在原有的模型训练过程中注入对抗样本,从而提升模型对于微小扰动的鲁棒性。如FGSM的做法就是直接修改损失函数如下:
在这里插入图片描述
黑盒攻击和白盒攻击
很容易理解,黑盒攻击就是已知输入输出的对应关系,攻击者去寻找对抗样本来实现对模型的攻击。而白盒攻击就是已知模型的所有结构和知识,来实现对模型的攻击。在论文Practical Black-Box Attacks against Machine Learning中,提出对于模型的黑盒攻击可以通过观察其输入输出的对应关系,构造一个相似的机器学习模型,然后对其进行白盒攻击,得到的对抗样本通常也具有迁移性,能够对需要攻击的黑盒达到很高的成功率。

3.4 CmBN

BN是对当前mini-batch进行归一化,CBN是对当前以及当前往前数3个mini-batch的结果进行归一化,而CmBN则是仅仅在这个Batch中进行累积。
CmBN 是 CBN 的改进版,它仅收集单个批次内 mini-batch 之间的统计数据。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第20张图片

3.5 modified SAM

modified SAM中没有使用pooling,而是直接用一个卷积得到的特征图直接使用Sigmoid进行激活,然后对应点相乘,所以说改进后的模型是Point-wise Attention。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第21张图片

3.6 modified PAN

将 PAN 中的捷径连接替换为级联。
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第22张图片

四、效果

作者对比了 YOLOv4 和当前最优目标检测器,发现 YOLOv4 在取得与 EfficientDet 同等性能的情况下,速度是 EfficientDet 的二倍!此外,与 YOLOv3 相比,新版本的 AP 和 FPS 分别提高了 10% 和 12%。
AP(average precision):平均精度
AP50:50个以内的精度
DeepLearing—CV系列(十三)——YOLOv4完整核心理论详解_第23张图片
参考:
1.目标检测算法-YOLO算法纵向对比理解
2.深入浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解
3.目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

你可能感兴趣的:(深度学习,AI,yolo,网络,算法,python,计算机视觉,神经网络)