YOLOv4理论深度剖析

目标检测方向发展迅速。十几个月前,谷歌Brain团队发布了用于对象检测的EfficientDet,挑战了YOLOv3作为(近)实时对象检测的主要模型的地位,并推动了对象检测模型的可能上界。
现在YOLOv4已经发布,COCO平均精度(AP)和帧率(FPS)分别提高了10%和12%。
YOLOv4理论深度剖析_第1张图片

解剖物体检测器

YOLOv4理论深度剖析_第2张图片
YOLOv4理论深度剖析_第3张图片
所有的目标检测器都将图像作为输入,并通过卷积神经网络主干压缩特征。在图像分类中,这些主干是网络的末端,可以利用它们进行预测。在目标检测中,需要在图像中的目标周围绘制多个边界框并进行分类,因此卷积主干的特征层需要相互混合并相互作用。主干特征层的组合发生在颈部。

将目标检测器分为两类也很有用:单阶段检测器和双阶段检测器。检测发生在头部。双阶段检测器解耦了每个包围框的目标定位和分类任务。单阶段检测器同时进行目标定位和分类预测。YOLO是一个单阶段检测器。

YOLOv4骨干网(Backbone)-特征生成

目标检测器的骨干网络通常是在ImageNet分类上预先训练的。预训练意味着网络的权值已经被用来识别图像中的相关特征,尽管在新的目标检测任务中还会有所调整。

作者考虑了以下YOLOv4对象检测器的主干网络:

  • CSPResNext50
  • CSPDarknet53
  • EfficientNet-B3

YOLOv4理论深度剖析_第4张图片
CSPResNext50和CSPDarknet53都是基于DenseNet的。DenseNet被设计用于连接卷积神经网络中的层,其动机如下:缓解梯度消失问题(很难通过非常深的网络回传信号),支持特征传播,鼓励网络重用特征,并减少网络参数的数量。

Dense Block & DenseNet

为了提高准确性,我们可以设计一个更深层次的网络来扩展感受野并增加模型的复杂性。为了减轻训练的难度,可以使用跳跃连接。我们可以用高度互联的层进一步扩展这个概念。

Dense Block包含多个卷积层,每一层Hi由批处理归一化、ReLU和卷积组成。Hi不只是使用最后一层的输出,而是将所有以前层的输出以及原始层的输出作为其输入。即x₀,x₁,…和xᵢ₋₁。下面的每个Hi输出四个特征映射。因此,在每一层,特征图的数量增加了4倍。
YOLOv4理论深度剖析_第5张图片
然后,通过在卷积和池化之间的过渡层(transition layer)中组合多个Dense Block,形成一个DenseNet。
在这里插入图片描述
下面是详细的结构设计。
YOLOv4理论深度剖析_第6张图片

Cross-Stage-Partial-connections (CSP)

CSPNet将DenseBlock的输入特征图分为两部分。第一部分x₀’绕过DenseBlock,成为下一个过渡层(transition layer)输入的一部分。第二部分x₀”经过Dense block,如下所示。
YOLOv4理论深度剖析_第7张图片
这种新的设计通过将输入分成两部分来降低计算复杂度——只有一部分通过DenseBlock。

CSPResNext50和CSPDarknet53的想法是消除DenseNet中的计算瓶颈,并通过传递部分未经修改的特征图来改进学习。
YOLOv4理论深度剖析_第8张图片

EfficientNet是谷歌大脑设计的,主要研究卷积神经网络的缩放问题。在缩放ConvNet时,你可以做很多决定,包括输入大小、宽度缩放、深度缩放,以及以上所有的缩放。EfficientNet论文假设所有这些都有一个最佳点,通过搜索,他们找到了它。
YOLOv4理论深度剖析_第9张图片
在图像分类方面,EfficientNet优于其他同等规模的网络。然而,YOLOv4的作者假设,其他网络在目标检测设置中可能工作得更好,并决定对所有网络进行试验。
基于他们的直觉和实验结果,最终YOLOv4网络使用CSPDarknet53作为骨干网。

CSPDarknet53

YOLOv4利用上面的CSP连接和下面的Darknet-53作为提取特征的骨干。
YOLOv4理论深度剖析_第10张图片
与基于ResNet的设计相比,CSPDarknet53模型具有更高的目标检测精度,即使ResNet具有更好的分类性能。但CSPDarknet53的分类精度可以通过Mish等技术来提高。因此,YOLOv4的最终选择是CSPDarknet53。

YOLOv4 Neck -特征聚合

目标检测的下一步是混合和结合ConvNet骨干中形成的特征,为检测步骤做准备。YOLOv4考虑了一些neck的选择,包括:

  • FPN
  • PAN
  • NAS-FPN
  • BiFPN
  • ASFF
  • SFAM

neck的组件通常在各层之间上下流动,只连接卷积网络末端的几层。

YOLOv4理论深度剖析_第11张图片
上面的每个 P i P_i Pi代表CSPDarknet53骨干中的一个特征层。
上面的图像来自YOLOv4的前身EfficientDet。由谷歌大脑编写,EfficientDet利用神经架构搜索在网络的颈部部分找到块的最佳形式,得到NAS-FPN。然后,EfficientDet作者稍微调整了一下,使体系结构更加直观(并且可能在他们的开发集上执行得更好)。

Feature Pyramid Networks (FPN)

YOLOv3采用了与FPN类似的方法,在backbone不同的输出层进行目标预测。
YOLOv4理论深度剖析_第12张图片
在对特定的backbone输出层进行预测时,FPN向上采样(2×)之前的自上而下流,并将其与自下而上流的相邻层相加(见下图)。结果被传递到3×3卷积滤波器,以减少上采样的伪影,并为head创建特征图P4。

SPP (spatial pyramid pooling layer)

SPP在检测不同尺度的物体时采用了稍微不同的策略。它用一个空间金字塔池化层替换了最后一个池化层(在最后一个卷积层之后)。feature map在空间上被划分为m×m个bins, m分别等于1、2和4。然后对每个通道的每个bin应用一个最大池。这形成了一个固定长度的表示,可以用fc层进一步分析。
YOLOv4理论深度剖析_第13张图片
许多基于cnn的模型包含fc层,因此只接受特定尺寸的输入图像。相比之下,SPP接受不同大小的图像。然而,像完全卷积网络(FCN)这样的技术不包含fc层,并接受不同维度的图像。这种设计对于空间信息非常重要的图像分割尤其有用。因此,对于YOLO,将2-D特征映射转换为固定大小的1-D向量不一定是可取的。

YOLO with SPP (spatial pyramid pooling layer)

在YOLO中,SPP被修改以保留输出空间维度。最大池化使用大小为1×1、5×5、9×9、13×13的kernel。空间维度得以保留。然后将经过不同kernel操作后得到的特性图连接在一起作为输出。
YOLOv4理论深度剖析_第14张图片
下图演示了如何将SPP集成到YOLO中。
YOLOv4理论深度剖析_第15张图片

路径聚合网络(Path Aggregation Network (PAN))

在FPN中,信息来自自底向上和自顶向下的流中邻近层的组合。
YOLOv4理论深度剖析_第16张图片
层之间的信息流成为模型设计中的另一个关键决策。

下图是用于目标检测的路径聚合网络(PAN)。一个自底向上的路径(b)被扩充,以使低层信息更容易传播到高层。在FPN中,局部空间信息在红色箭头中向上移动。虽然在图表中没有清楚地显示,但红色路径通过了大约100多层。PAN引入了一条捷径(绿色路径),只需要大约10层就可以到达N₅层。这种短路概念使上层可以使用细粒度的局部信息。
YOLOv4理论深度剖析_第17张图片
neck设计可以如下图所示:
YOLOv4理论深度剖析_第18张图片
然而,在YOLOv4中,不是将相邻的特征层加在一起,而是将相邻的特征层连接在一起。
YOLOv4理论深度剖析_第19张图片
在FPN中,目标是在不同的尺度水平上分别独立检测的。这可能会产生重复的预测,并且不会利用来自其他特征图的信息。PAN首先使用逐元素最大运算将所有层的信息融合在一起。
YOLOv4理论深度剖析_第20张图片

空间注意模块(Spatial Attention Module (SAM))

注意力在DL设计中被广泛采用。在SAM中,最大池化和平均池化分别应用于输入特征图,创建两组特征图。结果被输入一个卷积层,然后是一个sigmoid函数来创建空间注意力。
YOLOv4理论深度剖析_第21张图片
该空间注意力掩码应用于输入特征,输出精细化的特征图。
YOLOv4理论深度剖析_第22张图片
在YOLOv4中,使用了一个修改过的SAM,没有应用最大池化和平均池化。
YOLOv4理论深度剖析_第23张图片

YOLOv4选择PANet作为网络的特征聚合。他们没有写太多关于这个决定的基本原理,而且由于NAS-FPN和BiFPN是同时写的,这可能是未来研究的一个领域。
在YOLOv4中,FPN概念逐渐被改进后的SPP和PAN所取代。

YOLOv4 Head -检测步骤

YOLOv4使用了与YOLOv3相同的head,使用基于锚的检测步骤进行检测,有三个级别的检测粒度。
YOLOv4理论深度剖析_第24张图片
通道的数量是255,因为(80个类+ 1个对象+ 4个坐标)* 3个锚框。

消除网格敏感性(Eliminate grid sensitivity)

YOLOv4理论深度剖析_第25张图片
对于bₓ= cₓ和bₓ= cₓ+1的情况,我们需要tₓ分别有一个巨大的负数和正数。但是我们可以将σ与一个比例因子(>1.0)相乘使之更容易。以下是源代码更改:
YOLOv4理论深度剖析_第26张图片

计算机视觉中的数据增强

图像增强是从现有的训练数据中创建新的训练数据。我们不可能为我们的模型捕捉到每个可能的真实场景图像。因此,调整现有的训练数据,使之适用于其他情况,可以提高模型的泛化能力。

失真(distortion)

光度失真(Photometric Distortion):这包括改变图像的亮度、对比度、饱和度和噪声。(例如,在计算机视觉中的模糊数据增强。)

几何失真(Geometric Distortion):这包括随机缩放、裁剪、翻转和旋转。这些类型的增强可能特别棘手,因为包围框也会受到影响,必须更新。

这两种方法都是像素调整,这意味着通过一系列的变换可以很容易地恢复原始图像。

图像遮挡(Image Occlusion)

随机删除(Random Erase):这是一种用随机值或训练集的平均像素值替换图像区域的数据增强技术。通常,它是通过不同比例的图像擦除和擦除区域的宽高比来实现的。从功能上来说,这成为一种正则化技术,它可以防止我们的模型记忆训练数据和过拟合。
YOLOv4理论深度剖析_第27张图片
Cutout:在训练中,正方形区域被掩盖。cutout区域只在CNN的第一层隐藏。这与随机擦除非常相似,但是在cutout中遮盖区域一个常量。目的是相似的:我们减少过拟合。
YOLOv4理论深度剖析_第28张图片
Hide and Seek:将图像划分为SxS个网格。以一定的概率隐藏每个网格(p_hide)。这使得模型可以了解一个对象是什么样子,而不只是了解对象的单个部分是什么样子。
YOLOv4理论深度剖析_第29张图片
Grid Mask:图像的区域被隐藏在网格中。类似于Hide and Seek,这迫使我们的模型学习单个对象的各个组件。
YOLOv4理论深度剖析_第30张图片
MixUp:图像及其标签的叠加。

YOLOv4理论深度剖析_第31张图片

YOLOv4-Bag of Freebies(涨点或变快,但是不增加计算量)

YOLOv4的作者在题为“bag of freebies”的论文中包含了一系列的贡献,在不增加推理时间的情况下提高模型性能。由于它们不会影响模型的推理时间,所以大多数改进都是在训练管道的数据管理和数据增强方面。这些技术改进了训练集,并扩大了训练集的规模,以将模型泛化到原本看不到的场景中。计算机视觉中的数据增强是最大限度地利用数据集的关键,而最新的研究也在继续验证这一假设。

现在我们将查看YOLOv4在训练期间使用的数据增强策略。研究过程的特点是一系列的实验,所以我们可以想象作者实验了更多的策略,但没有进入最后的论文。这进一步证明,在自定义视觉任务中,在您自己的训练/测试集上探索各种数据增强策略是非常重要的。

CutMix:通过从一个图像中剪切部分并将其粘贴到增强的图像中来组合图像。图像的切割迫使模型学会基于大量稳健的特征进行预测。看上面的“Hide and Seek”,在那里,没有切割,模型专门依靠狗的头来进行预测。如果我们想要准确地识别一只把头藏起来的狗(可能是在灌木丛后面),这就有问题了。在CutMix中,切割的部分被替换为另一个图像的一部分以及第二个图像的ground truth标签。每个图像的比例在图像生成过程中设定(例如0.4/0.6)。在下面的图片中,你可以看到CutMix的作者是如何证明这种技术比简单的MixUp和Cutout更有效。

马赛克数据增强(Mosaic):马赛克数据增强将4幅训练图像按一定比例组合成一幅(在CutMix中只有两幅)。Mosaic是YOLOv4引入的第一个新的数据增强技术。这使得模型能够学习如何识别小物体。

类标签平滑(Class label smoothing):类标签平滑不是一种图像处理技术,而是一种对类标签的直观改变。一般来说,一个边界框的正确分类是用一个one-hot向量表示的[0,0,0,1,0,0,…],并以此表示计算损失。然而,当一个模型的预测接近1.0时,它往往是错误的,过度拟合,在某种程度上忽略了其他预测的复杂性。按照这种直觉,对类标签增加某种程度上的不确定性更为合理。当然,作者选择了0.9,所以[0,0,0,0.9,0…来表示正确的类。

自我对抗训练(Self-Adversarial Training (SAT)):首先,图像经过一个正常的训练步骤。然后,不是通过权重反向传播,而是利用损失信号以对模型最不利的方式改变图像。在随后的训练中,模型被迫面对这个特别困难的例子,并围绕它学习。在我们这里介绍的技术中,这可能是最不直观和最接近建模方面的技术。

SAT的目标是找到网络在训练过程中最依赖的图像部分,然后对图像进行编辑,以掩盖这种依赖,迫使网络泛化到可以帮助它检测的新特征。
YOLOv4理论深度剖析_第32张图片
YOLOv4的作者提供了一项消融研究,证明他们使用的数据增强是正确的。
YOLOv4理论深度剖析_第33张图片
这是在COCO上效果最好的方法,但对于您自己的数据集,重要的是批判性地思考哪些增强可能会有帮助,并实验性地使用增强技术。

DropBlock正则化:
在全连接层中,我们可以应用drop来迫使模型从各种特征中学习,而不是对少数特征过于自信。然而,这可能不适用于卷积层。相邻位置高度相关。因此,即使一些像素被丢弃(下图中间的图表),空间信息仍然是可检测的。DropBlock正则化基于与卷积层相似的概念。
YOLOv4理论深度剖析_第34张图片
DropBlock不是丢弃单个像素,而是丢弃一个block_size × block_size像素块。
YOLOv4理论深度剖析_第35张图片

另一个无痛涨点的技巧是CIoU损失函数。YOLOv4的作者使用CIoU损失,这与预测的边界框与真实边界框重叠的方式有关。基本上,只看重叠是不够的,因为在没有重叠的情况下,你还想看边界框离真实框有多近,并鼓励网络把预测的边界框拉到离真实框更近的地方。当然,这里面有很多数学工程。

许多单阶段目标检测器都是用固定的输入图像形状进行训练的。为了提高泛化能力,我们可以用不同的图像大小来训练模型。(YOLO的多尺度训练)

YOLOv4 - Bag of Specials(BoS)

YOLOv4部署的策略称为“Bag of Specials”,之所以这么说,是因为它们增加了推理时间,但显著提高了性能,所以它们被认为是值得的。

Mish激活函数

下面的新激活函数Swish显示出比ReLU和许多其他激活函数更好的性能。
YOLOv4理论深度剖析_第36张图片
Mish是另一个与ReLU和Swish非常相似的激活函数。Mish在不同数据集的许多深度网络中都能胜过它们。
YOLOv4理论深度剖析_第37张图片
在CSPDarknet53和检测器上使用Mish,可以提高YOLOv4的精确度。

DIoU NMS

NMS过滤掉其他预测相同对象的边界框,并保留一个置信度最高的边界框。
YOLOv4理论深度剖析_第38张图片
DIOU方法在抑制冗余框时取IoU和两个边界框中点之间的距离。这使得它在有遮挡的情况下更加健壮。
YOLOv4理论深度剖析_第39张图片
我使用的是YOLOv3,它需要一些更好的NMS,比如YOLOv4 -这不能同时是两种吉普车(绿色标签是吉普车TJ,棕色标签是吉普车YJ)。

对于批处理归一化,作者使用了交叉批处理归一化(CmBN),这可以在人们使用的任何GPU上运行。许多批处理归一化技术需要多个gpu协同操作。

YOLOV4中的BoF和BoS总结

YOLOv4理论深度剖析_第40张图片

YOLOv4 -实验结果

YOLOv4的技术通过MS COCO上的实验得到了充分的验证。COCO包含80个对象类,用于表示检测器可能在野外遇到的广泛的对象检测场景。

YOLOv4对本文中尝试的技术进行了深入的消融研究。一项消融研究试图依次去除添加物,以证明哪些添加物改善了网络。

YOLOv4理论深度剖析_第41张图片
通过最终的配置,YOLOv4实现了对象检测的最好性能。本文研究了许多不同gpu上的推理时间,尽管我们在这里只显示一个。
YOLOv4理论深度剖析_第42张图片

技术评估

虽然本文介绍了哪些技术已经集成到YOLOv4中,但YOLOv4在评估其他技术方面花费了大量精力。为了结束本文,下面的图表列出了YOLOv4考虑的技术。
YOLOv4理论深度剖析_第43张图片

YOLOV3与YOLOV4差异

YOLOV3和YOLOV4网络架构图

YOLOv4理论深度剖析_第44张图片
YOLOv4理论深度剖析_第45张图片

YOLOV3和YOLOV4网络架构对比

YOLOv4理论深度剖析_第46张图片

使用YOLOV4注意事项

  • 由于cfg的anchors是使用coco datasets计算出来的anchors,在训练自己的数据集时候不一定适用,因此需要使用cal_anchors来计算出适合自己的datasets的anchors。
  • 如果是在类似colab这种不能有弹出式视窗的环境下训练时候,后面记得要加上-dont_show,不然会报错,例如:darknet detector train data/coco.data data/yolov4-coco.cfg data/yolov4-csp.conv.142 -dont_show
  • 当发生类别不均衡时候可以使用GAN的方法来自己生成数量较少的数据,例如在瑕疵检测中,一定有一些的瑕疵是很少出现的,这时候使用segmentation的方法将瑕疵切出来再贴到背景图像上,若想要将其更无违和的贴上去可以使用GP-GAN的方法,如下图所示:
    YOLOv4理论深度剖析_第47张图片
  • 当开始训练时候,结果只训练一下就断掉了有segmentation fault(core dumped)的情形发生,这时候会生成bad.list,里面会记录一些不正常的训练记录,例如你的x,y,w,h有<0的状况,更正后就可以训练了。
  • 若训练完模型,想在Python中做进一步的应用,可以使用opencv来导入YOLO模型的权重和配置文件,例如:
import cv2
CONFIDENCE_THRESHOLD=0.2
NMS_THRESHOLD=0.4
net = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
model = cv2.dnn_DetectionModel(net)
model.setInputParams(size=(416, 416), scale=1/255, swapRB=True)
classes, scores, boxes = model.detect(img, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)

总结

总之,YOLOv4是计算机视觉中目标检测的一大套技术集大成。这些技术已经经过测试和改进,形成了最好的实时对象检测器,它是轻量级的,易于使用。

参考目录

https://jonathan-hui.medium.com/yolov4-c9901eaa8e61
https://medium.com/ai-academy-taiwan/yolov4-%E7%94%A2%E6%A5%AD%E6%87%89%E7%94%A8%E5%BF%83%E5%BE%97%E6%95%B4%E7%90%86-72d072007e2

你可能感兴趣的:(目标检测,深度学习,神经网络,pytorch)