论文地址:https://arxiv.org/abs/2004.10934v1
YOLOv4 对深度学习中一些常用 tricks 进行了大量的测试,最终选择了这些有用的 tricks:CSP、CmBN、SAT、MiWRC、SPP、PANet、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization、Class Label Smoothing、CIoU loss、DIoU-NMS。
YOLOv4 在传统的 YOLO 基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在 Tesla V100上,对 MS COCO 数据集的实时检测速度达到 65 FPS,精度达到 43.5% AP。
YOLOv4 的独到之处在于:
目标检测器由特征提取的 backbone 和用于目标检测的 head(下面最右边的块)组成。为了在不同尺度上检测物体,在不同的空间分辨率下通过 head 探测 feature map 来生成层次结构。
为了丰富head的信息,在送入 head 之前,输入经过自底向上和自顶向下的,相邻特征图被按元素顺序添加到一起或连接起来(如上图所示)。因此,head 的输入将包含自底向上的空间丰富信息和自上而下的语义丰富信息。这部分被称为 neck。
COCO 数据集上,仅对比 yolov3 和 yolov4,在同样的 FPS 等于83左右时,yolov3 是 33,而 yolov4 的 AP 是43,直接上涨了 10 个百分点。
总体来说,yolov4 是对 yolov3 的各个部分进行了改进和优化。为了便于分析,将 yolov4 的整体结构拆分成四大板块:
(1)输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练。
(2)Backbone主干网络:将各种新的方式结合起来,包括CSPDarknet53、Mish激活函数、Dropblock。
(3)Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如 yolov4中的SPP模块、FPN+PAN结构。
(4)Prediction:输出层的锚框机制和 yolov3 相同,主要改进的是训练时的损失函数 CIOU_Loss,以及预测框筛选的 NMS 变为 DIOU_NMS。
最简单清晰的表示: YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈)+ PANet路径聚合(颈)+ YOLOv3(头部)
完整的网络结构图如下:
YOLOv4模型由以下部分组成:
下面会对各部分逐一讲解。
实际上,YOLOv4 的结构图和 yolov3 相比,主要是多了 CSP 结构、SPP结构、PANet 结构,在绘制出上面的图形后,看起来会觉得豁然开朗,其实整体架构和 yolov3 是相同的,不过使用各种新的算法思想对各个子结构都进行了改进。
在官方给出的cfg文件中,我们可以看到YOLOv4网络每一层的输出,每一层 layer 是如何得到的注释在了每一行后面,没有注释的就是对上一行的特征图进行卷积。可以看到YOLOv4网络共有161层,在608×608分辨率下,计算量总共128.46BFLOPS,YOLOv3 为141BFLOPS。
tip:
SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
concat:张量拼接,维度会扩充,和 yolov3 中的解释一样,对应于 cfg 文件中的 route 操作。不同于add,add是张量相加,不会扩充维度,对应于cfg文件中的 shortcut操作。
CSPNet 全称是 Cross Stage Partial Network,在2019年由 Chien-Yao Wang 等人提出,用来解决以往网络结构需要大量推理计算的问题。作者将问题归结于网络优化中的重复梯度信息。CSPNet 在 ImageNet dataset 和 MS COCO 数据集上有很好的测试效果,同时它易于实现,在 ResNet、ResNext 和 DenseNet 网络结构上都能通用。CSPNet 的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。
将原来的 Darknet53 与 CSPNet 进行结合。在前面的 YOLOv3 中,我们已经了解了 Darknet53 的结构,它是由一系列残差结构组成。进行结合后,CSPNet 的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。在ResNet上加上CSPNet的结构如下:
每个CSP模块前面的卷积核的大小都是 3×3,步长为 2,因此可以起到下采样的作用。
因为 Backbone 有5个 CSP模块,输入图像是608×608,所以特征图变化的规律是:608->304->152->76->38->19
经过5次CSP模块后得到 19*19 大小的特征图。
tip:
作者只在 Backbone 中采用了 Mish 激活函数,网络后面仍然采用 Leaky_relu 激活函数。
采用 CSP 模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
因此 yolov4 在主干网络 Backbone 采用 CSPDarknet53 网络结构有三个方面的优点:
优点1:增强CNN的学习能力,使得在轻量化的同时保持准确性。
优点2:降低计算瓶颈
优点3:降低内存成本
在 YOLOv3 中,每个卷积层之后包含一个批量归一化层和一个 Leaky ReLU。而在 YOLOv4 的主干网络 CSPDarknet53中,使用 Mish 代替了原来的 Leaky ReLU。Leaky ReLU 和 Mish 激活函数的公式与图像如下:
yolov4 的 Backbone 中都使用了 Mish 激活函数,而后面的网络则还是使用 Leaky_relu 函数。yolov4 作者实验测试时,使用CSPDarknet53 网络在 ImageNet 数据集上做图像分类任务,发现使用了 Mish 激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些。因此在设计yolov4目标检测任务时,主干网络 Backbone 还是使用 Mish 激活函数。
SPP 最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。在 YOLOv4 中,作者引入 SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的 YOLOv4 运行速度。如下图所示,就是 SPP 中经典的空间金字塔池化层。这里最大池化采用padding操作,移动的步长为1,比如 13×13 的输入特征图,使用5×5大小的池化核池化,padding = 2,因此池化后的特征图仍然是13 × 13大小。
在YOLO中,SPP被修改以保留输出空间维度。最大值池化应用于大小为 1×1、5×5、9×9、13×13 的卷积核。空间维度被保留。然后,将来自不同内核大小的 feature map 连接在一起作为输出。具体的做法是:分别利用四个不同尺度的最大池化对上层输出的 feature map 进行处理。
采用SPP模块的方式,比单纯的使用 k×k 最大池化的方式,更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征,并且几乎不会导致网络运行速度的降低。
yolov4 的作者在使用 608×608 大小的图像进行测试时发现,在COCO目标检测任务中,以 0.5%的额外计算代价将 AP50增加了2.7%,因此 yolov4 中也采用了SPP模块。
PANet 整体上可以看做是在Mask R-CNN上做多处改进,充分利用了特征融合,比如引入 Bottom-up path augmentation 结构,充分利用网络浅特征进行分割;引入Adaptive feature pooling使得提取到的ROI特征更加丰富;引入 Fully-conneFcted fusion,通过融合一个前背景二分类支路的输出得到更加精确的分割结果。下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。
在 YOLOv4 中,作者使用 PANet 代替YOLOv3中的 FPN 作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原 PANet 方法进行了修改, 使用张量连接( concat )代替了原来的捷径连接( shortcut connection )。
与 yolov3 不同的是,定位损失 使用了 CIoU。以及预测框筛选的 NMS 变为 DIOU_NMS。CIoU 在 IoU 的基础上考虑了边框的重合度、中心距离和宽高比的尺度信息。
由于 IoU Loss 在候选框和真实框没有重叠的时候不提供任何移动梯度(LIoU=1-IoU 始终为1),于是 GIoU Loss 引入了一个惩罚项(即下图中的(C-AUB)/C)。由于惩罚项的引入,在不重叠的情况下,预测框会向目标框移动。但是考虑如下图特殊情况。
当出现上图情况时,GIoU Loss完全降级成IoU Loss,因此引入DIoU Loss,DIoU Loss是在IoU Loss基础上引入一个惩罚项,定义如下:
DIoU 的优点如下:
但 DIoU 这时并没有考虑到长宽比。
一个好的目标框回归损失应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
GIoU:为了归一化坐标尺度,利用 IoU,并初步解决IoU为零的情况。
DIoU:DIoU 损失同时考虑了边界框的重叠面积和中心点距离。然而,anchor 框和目标框之间的长宽比的一致性也是极其重要的。
CIoU Loss:又引入一个 box 长宽比的惩罚项,该 loss 考虑了 box 的长宽比,定义如下:
上述损失函数中,CIoU 比 DIoU 多出了 α 和 v 这两个参数。其中 α 是用于平衡比例的参数。v 用来衡量 anchor 和目标框之间的比例一致性。
从 α 参数的定义可以看出,损失函数会更加倾向于往重叠区域增多方向优化,尤其是 IoU 为零的时候。
为更准确的表示,以下图片引用原论文的训练结果:
BoF和Mish对CSPResNeXt-50分类器精度的影响:
BoF和Mish对CSPDarknet-53分类器精度的影响:
使用不同分类器预训练权重进行检测器训练:
为更准确的表示,以下图片引用原论文的测试结果:
这是作者提出的一种新的数据增强方法,该方法借鉴了 CutMix 数据增强方式的思想。CutMix 数据增强方式利用两张图片进行拼接,但是 Mosaic 使利用四张图片易随机缩放、随机裁剪、随机排布的方式进行拼接。如下图所示:
Mosaic数据增强方法有两个优点:拥有丰富检测目标的背景,在 BN 计算的时候一次性会处理四张图片。
SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,对修改后的图像进行正常的目标检测。
CmBN 的全称是 Cross mini-Batch Normalization,定义为跨小批量标准化。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN 和 CmBN 之间的区别具体如下图所示:
yolov4 中使用的 Dropblock,其实和常见网络中的 Dropout 功能类似,也是缓解过拟合的一种正则化方式。传统的 Dropout是随机删除减少神经元的数量,使网络变得更简单。在全连接的层中,我们可以使用 Dropout 来迫使模型从各种特征中学习,但是,这可能对卷积层不起作用。
这是由于相邻位置高度相关,即使一些像素被随机删除,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的 Dropout 在卷积层上效果并不好。
所以 Dropblock 的研究者则干脆整个局部区域进行删减丢弃。这种方式其实是借鉴2017年的 cutout 数据增强的方式,cutout 是将输入图像的部分区域清零,而 Dropblock 则是将 Cutout 应用到每一个特征图。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。
Dropblock 的研究者与 Cutout 进行对比验证时,发现有几个特点:
优点1:Dropblock 的效果优于 Cutout。
优点2:Cutout 只能作用于输入层,而 Dropblock 则是将 Cutout 应用到网络中的每一个特征图上。
优点3:Dropblock 可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和 Cutout 相比都有更精细的改进。
在深度学习样本训练的过程中,我们采用 one-hot 标签去进行计算损失时,只考虑到训练样本中正确的标签位置(one-hot 标签为 1 的位置)的损失,而忽略了错误标签位置(one-hot 标签为0的位置)的损失。这样一来,模型可以在训练集上拟合的很好,但由于其他错误标签位置的损失没有计算,导致预测的时候,预测错误的概率增大。又由于很难用 one-hot 来表达不同类别之间的关联度,为了解决这一问题,标签平滑的正则化方法便应运而生。这个概念缓解了过度拟合。
p = tf.placeholder(tf.float32, shape=[None, 10])
作者在原 SAM(Spatial Attention Module)方法上进行了修改,将 SAM 从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的 feature map,得到两组 shape 相同的 feature map,再将结果输入到一个卷积层,接着是一个 sigmoid 函数来创建空间注意力。
将 SAM 应用于输入特征,能够输出精细的特征图:
修改后的 SAM 不再应用最大值池化和平均池化。在作者看来,采用这种方式创建的是点注意力。
作者对原 PAN(Path Aggregation Network) 方法进行了修改, 使用张量连接(concat)代替了原来的快捷连接(shortcut connection)。如下图所示:
Bag-of-Freebies(BoF):在训练阶段使用的trick,不影响测试效率。目标检测方法通常采用的,符合 Bag-of-Freebies 定义的是数据增强。
Bag-of-Specials(BoS):只通过增加很小的计算量就可以极大的提高模型精度的方法。换句话说,只增加了少量推理成本却能显著提高目标检测精度的插件模块和后处理方法。这些插件模块用于增强模型中的某些属性,如扩大接受域、引入注意机制、增强特征集成能力等,后处理是筛选模型预测结果的一种方法
以数据增强方法为例,虽然增加了训练时间,但不增加推理时间,并且能让模型泛化性能和鲁棒性更好。像这种不增加推理成本,还能提升模型性能的方法,作者称之为"免费包",非常形象。下面总结了一些常用的数据增强方法:
常见的正则化方法有:
平衡正负样本的方法有:
除此之外,还有回归损失方面的改进:
增大感受野技巧:
注意力机制:
特征融合集成:
激活函数:
后处理非极大值抑制算法:
此外,特殊的:
这篇论文工作量是非常足的!网上看见很多人看完论文的人都说 YOLOv4 是拼凑 trick 得到的,但这想必也是经过深究发现的。YOLOv4 中 Bag of freebies 和 Bag of Specials 两部分总结的相当好,对研究目标检测有极大的参考价值,涵盖的trick非常广泛。但是由于作者将注意力主要放在了这两部分,导致讲述创新性的篇幅比较少。总体来讲,读了这篇文章以后,印象最深刻的不是创新了什么,实现了什么,而是总结的 BoF 和 BoS,涉及到非常非常多的 trick。论文最终得到的结果也很棒。唯一可惜的是创新之处描述的不够,没能有力地证明这些创新点的有效性。此外,在yolov4 上并没有发现上述提到的一个创新点:SAM。
https://blog.csdn.net/wjinjie/article/details/107509243?utm_source=app
https://blog.csdn.net/Yong_Qi2015/article/details/107438091?utm_source=app
https://zhuanlan.zhihu.com/p/143747206
https://blog.csdn.net/weixin_41560402/article/details/106119774