目录
Author: Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao
Subjects: Computer Vision and Pattern Recognition (cs.CV); Image and Video Processing (eess.IV)
Cite as: arXiv:2004.10934 [cs.CV] (or arXiv:2004.10934v1 [cs.CV] for this version)
https://doi.org/10.48550/arXiv.2004.10934
摘要
据说有许多特性可以提高卷积神经网络(CNN)的准确性。需要在大型数据集上对这些特性的组合进行实际测试,并对结果进行理论论证。有些特性仅适用于某些特定的模型、特定的问题,或者仅适用于小规模数据集;而另一些特性,如批量归一化和残差连接,适用于大多数模型、任务和数据集。我们假设,此类通用特性还包括加权残差连接(WRC)、跨阶段部分连接(CSP)、跨小批量归一化(CmBN)、自对抗训练(SAT)和Mish激活。我们采用了新的特性:WRC、CSP、CmBN、SAT、Mish激活、马赛克数据增强、CmBN、DropBlock正则化和CIoU损失,并将其中一些结合起来,以实现最先进的结果:在Tesla V100上实时速度约为65 FPS时,对MS COCO数据集达到43.5%的AP(65.7%的AP50)。源代码可在以下网址找到:GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )。
1.引言
大多数基于卷积神经网络(CNN)的目标检测器主要适用于推荐系统。例如,通过城市视频摄像头寻找免费停车位是由缓慢但准确的模型执行的,而汽车碰撞预警则与快速但不准确的模型有关。提高实时目标检测器的准确性,使它们不仅可以用于生成提示的推荐系统,还可以用于独立的流程管理和减少人工输入。实时目标检测器在传统图形处理单元(GPU)上的运行,使得它们能够以合理的价格大规模使用。目前最准确的现代神经网络无法实时运行,并且需要大量的 GPU 来进行大规模小批量训练。我们通过创建一个在传统 GPU 上实时运行的 CNN 来解决这些问题,该网络的训练仅需要一个传统 GPU。
本工作的主要目标是在生产系统中设计一个快速运行速度的目标检测器,并优化其以适应并行计算,而不是仅仅关注低计算量的理论指标(BFLOP)。我们希望所设计的目标检测器能够易于训练和使用。例如,任何使用传统 GPU 进行训练和测试的人都可以实现实时、高质量且令人信服的目标检测结果,如图 1 所示的 YOLOv4 的结果。我们的贡献总结如下:
- 我们开发了一个高效且强大的目标检测模型。它使得每个人都能使用 1080 Ti 或 2080 Ti GPU 来训练一个超快速且准确的目标检测器。
- 我们验证了在检测器训练过程中,最先进的“免费技巧”(Bag-of-Freebies)和“特殊技巧”(Bag-of-Specials)方法对目标检测的影响。
- 我们改进了最先进的方法,使它们更加高效且适合单 GPU 训练,包括 CBN [89]、PAN [49]、SAM [85] 等。
2.相关工作
2.1 目标检测模型
现代检测器通常由两部分组成:一个在 ImageNet 上预训练的骨干网络(backbone)和一个用于预测目标类别和边界框的头部(head)。对于在 GPU 平台上运行的检测器,其骨干网络可以是 VGG [68]、ResNet [26]、ResNeXt [86] 或 DenseNet [30]。对于在 CPU 平台上运行的检测器,其骨干网络可以是 SqueezeNet [31]、MobileNet [28, 66, 27, 74] 或 ShuffleNet [97, 53]。
至于头部部分,它通常分为两类:单阶段目标检测器和两阶段目标检测器。最具代表性的两阶段目标检测器是 R-CNN [19] 系列,包括 Fast R-CNN [18]、Faster R-CNN [64]、R-FCN [9] 和 Libra R-CNN [58]。也可以将两阶段目标检测器设计为无锚框(anchor-free)的目标检测器,例如 RepPoints [87]。对于单阶段目标检测器,最具代表性的模型是 YOLO [61, 62, 63]、SSD [50] 和 RetinaNet [45]。近年来,还开发了无锚框的单阶段目标检测器,如 CenterNet [13]、CornerNet [37, 38] 和 FCOS [78] 等。
近年来开发的目标检测器通常在骨干网络和头部之间插入一些层,这些层通常用于收集来自不同阶段的特征图。我们可以称这部分为目标检测器的“颈部”(neck)。通常,颈部由几个自底向上(bottom-up)的路径和几个自顶向下(top-down)的路径组成。配备这种机制的网络包括特征金字塔网络(Feature Pyramid Network, FPN)[44]、路径聚合网络(Path Aggregation Network, PAN)[49]、BiFPN [77] 和 NAS-FPN [17]。
除了上述模型外,一些研究人员着重于直接构建一个新的骨干网络(DetNet [43]、DetNAS [7])或一个新的完整模型(SpineNet [12]、HitDetector [20])用于目标检测。
总结来说,一个普通的目标检测器由以下几个部分组成:
(1)输入:图像、图像块、图像金字塔
(2)骨干网络:VGG16 [68]、ResNet-50 [26]、SpineNet [12]、EfficientNet-B0/B7 [75]、CSPResNeXt50 [81]、CSPDarknet53 [81]
(3)颈部:
(a)额外模块:SPP [25]、ASPP [5]、RFB [47]、SAM [85]
(b)路径聚合模块:FPN [44]、PAN [49]、NAS-FPN [17]、全连接FPN、BiFPN [77]、ASFF [48]、SFAM [98]
(4)头部:
(a)密集预测(单阶段):
(a.1)RPN [64]、SSD [50]、YOLO [61]、RetinaNet [45](基于锚框)
(a.2)CornerNet [37]、CenterNet [13]、MatrixNet [60]、FCOS [78](无锚框)
(b)稀疏预测(两阶段):
(b.1)Faster R-CNN [64]、R-FCN [9]、Mask R-CNN [23](基于锚框)
(b.2)RepPoints [87](无锚框)
注解:
(1)对于输入而言,图像块表示的是将大图像拆分成为若干个小的图像块,图像金字塔表示的是将同一张图像,生成多个不同尺度的版本。对于YOLOv4,图像块表示将若干个图像块合并成为一张大图(Mosaic数据增强,用于提升模型对局部目标和复杂背景的适应性),图像金字塔表示随机缩放输入图像(如320×320到608×608),模拟“图像金字塔”效果,增强模型尺度不变性
(2)骨干网络,用于提取多尺度的特征图和语义信息;颈部,用于融合前面获取的多尺度特征图和语义信息,提升对多尺度目标的检测能力;头部,基于颈部输出的融合特征图,生成边界框、类别概率和置信度
2.2 免费技巧包(Bag of freebies)
通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更高的准确性。我们将这些仅改变训练策略或仅增加训练成本的方法称为“免费技巧包”(bag of freebies)。在目标检测方法中经常采用且符合“免费技巧包”定义的是数据增强。数据增强的目的是增加输入图像的多样性,从而使设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据增强方法,它们无疑对目标检测任务有益。在处理光度失真时,我们会调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,我们会添加随机缩放、裁剪、翻转和旋转。
上述提到的数据增强方法都是像素级调整,调整区域内的所有原始像素信息都被保留。此外,一些从事数据增强的研究人员将重点放在模拟目标遮挡问题上。他们在图像分类和目标检测方面取得了良好的效果。例如,随机擦除[100]和CutOut[11]可以随机选择图像中的矩形区域,并用随机值或零值填充。至于hide-and-seek[69]和grid mask[6],它们会随机或均匀地选择图像中的多个矩形区域,并将它们替换为全零。如果将类似的概念应用于特征图,就有DropOut[71]、DropConnect[80]和DropBlock[16]等方法。此外,一些研究人员提出了使用多张图像一起进行数据增强的方法。例如,MixUp[92]使用两张图像以不同的系数比例进行乘法和叠加,然后根据这些叠加比例调整标签。至于CutMix[91],它是将裁剪后的图像覆盖到其他图像的矩形区域上,并根据混合区域的大小调整标签。除了上述提到的方法外,风格迁移GAN[15]也被用于数据增强,这种使用可以有效减少CNN所学到的纹理偏差。
与上述提出的各种方法不同,一些其他的“免费技巧包”方法致力于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类别之间存在数据不平衡的问题,这个问题通常通过在两阶段目标检测器中使用困难负样本挖掘[72]或在线困难样本挖掘[67]来解决。但是,样本挖掘方法不适用于单阶段目标检测器,因为这种检测器属于密集预测架构。因此,Lin等人[45]提出了焦点损失来处理存在于不同类别之间的数据不平衡问题。另一个非常重要的问题是,很难用one-hot hard表示来表达不同类别之间关联程度的关系。这种表示方案通常在执行标记时使用。在[73]中提出的标签平滑是将硬标签转换为软标签进行训练,这可以使模型更具鲁棒性。为了获得更好的软标签,Islam等人[33]引入了知识蒸馏的概念来设计标签细化网络。
最后一个“免费技巧包”是边界框(BBox)回归的目标函数。传统的目标检测器通常使用均方误差(MSE)直接对边界框的中心点坐标和高宽进行回归,即 { x center , y center , w , h } \{x_{\text{center}}, y_{\text{center}}, w, h\} {xcenter,ycenter,w,h},或者左上角点和右下角点,即 { x top left , y top left , x bottom right , y bottom right } \{x_{\text{top left}}, y_{\text{top left}}, x_{\text{bottom right}}, y_{\text{bottom right}}\} {xtop left,ytop left,xbottom right,ybottom right}。对于基于锚框的方法,它是估计相应的偏移量,例如 { x center of offset , y center of offset , w of offset , h of offset } \{x_{\text{center of offset}}, y_{\text{center of offset}}, w_{\text{of offset}}, h_{\text{of offset}}\} {xcenter of offset,ycenter of offset,wof offset,hof offset} 和 { x top left of offset , y top left of offset , x bottom right of offset , y bottom right of offset } \{x_{\text{top left of offset}}, y_{\text{top left of offset}}, x_{\text{bottom right of offset}}, y_{\text{bottom right of offset}}\} {xtop left of offset,ytop left of offset,xbottom right of offset,ybottom right of offset}。
然而,直接估计边界框每个点的坐标值是将这些点视为独立变量,但实际上并没有考虑目标本身的完整性。为了更好地处理这个问题,一些研究人员最近提出了 IoU 损失 [90],它考虑了预测边界框区域和真实边界框区域的覆盖情况。IoU 损失的计算过程会通过与真实值执行 IoU 来触发边界框四个坐标点的计算,然后将生成的结果连接成一个整体代码。由于 IoU 是一个尺度不变的表示,它可以解决传统方法在计算 { x , y , w , h } \{x, y, w, h\} {x,y,w,h} 的 l 1 l1 l1 或 l 2 l2 l2 损失时,损失会随着尺度增加的问题。
最近,一些研究人员继续改进 IoU 损失。例如,GIoU 损失 [65] 除了考虑覆盖区域外,还包括目标的形状和方向。他们提出找到能够同时覆盖预测边界框和真实边界框的最小面积边界框,并用这个边界框作为分母,替换 IoU 损失中原本使用的分母。至于 DIoU 损失 [99],它还额外考虑了目标中心的距离,而 CIoU 损失 [99] 则同时考虑了重叠区域、中心点之间的距离和宽高比。CIoU 在边界框回归问题上能够实现更好的收敛速度和准确性。
2.3 特殊技巧包(Bag of specials)
对于那些只略微增加推理成本,但能显著提高目标检测准确性的插件模块和后处理方法,我们称它们为“特殊技巧包”(bag of specials)。一般来说,这些插件模块用于增强模型的某些属性,例如扩大感受野、引入注意力机制或加强特征整合能力等,而后处理是一种用于筛选模型预测结果的方法。
用于增强感受野的常见模块包括 SPP [25]、ASPP [5] 和 RFB [47]。SPP 模块源自空间金字塔匹配(Spatial Pyramid Matching, SPM)[39],SPM 的原始方法是将特征图分割成若干个 d × d d \times d d×d 的等大小块,其中 d d d 可以是 {1, 2, 3, …},从而形成空间金字塔,然后提取词袋特征。SPP 将 SPM 集成到 CNN 中,并用最大池化操作代替词袋操作。由于 He 等人 [25] 提出的 SPP 模块将输出一维特征向量,因此它无法应用于全卷积网络(Fully Convolutional Network, FCN)。因此,在 YOLOv3 [63] 的设计中,Redmon 和 Farhadi 对 SPP 模块进行了改进,将其改为最大池化输出的拼接,其中核大小为 k × k k \times k k×k, k = { 1 , 5 , 9 , 13 } k = \{1, 5, 9, 13\} k={1,5,9,13},步长为 1。在这种设计下,较大的 k × k k \times k k×k 最大池化有效地扩大了骨干特征的感受野。在加入改进版的 SPP 模块后,YOLOv3-608 在 MS COCO 目标检测任务上将 AP50 提升了 2.7%,代价是额外增加了 0.5% 的计算量。
ASPP [5] 模块与改进后的 SPP 模块的主要区别在于,原始的 k × k k \times k k×k 核大小、步长为 1 的最大池化被替换为多个 3 × 3 3 \times 3 3×3 核大小、膨胀比为 k k k、步长为 1 的膨胀卷积操作。RFB 模块则是使用多个 k × k k \times k k×k 核、膨胀比为 k k k、步长为 1 的膨胀卷积,以获得比 ASPP 更全面的空间覆盖。RFB [47] 仅增加了 7% 的额外推理时间,就将 SSD 在 MS COCO 上的 AP50 提升了 5.7%。
在目标检测中常用的注意力模块主要分为通道注意力和逐点注意力,这两种注意力模型的代表分别是 Squeeze-and-Excitation (SE) [29] 和 Spatial Attention Module (SAM) [85]。尽管 SE 模块可以在仅增加 2% 的计算量的情况下,将 ResNet50 在 ImageNet 图像分类任务上的 top-1 准确率提高 1%,但在 GPU 上通常会增加约 10% 的推理时间,因此更适合用于移动设备。而对于 SAM,它只需要额外增加 0.1% 的计算量,就能将 ResNet50-SE 在 ImageNet 图像分类任务上的 top-1 准确率提高 0.5%。最重要的是,它完全不会影响 GPU 上的推理速度。
在特征整合方面,早期的做法是使用跳跃连接(skip connection)[51] 或超列(hyper-column)[22] 将低层次的物理特征整合到高层次的语义特征中。随着像 FPN 这样的多尺度预测方法变得流行,许多用于整合不同特征金字塔的轻量级模块被提出。这类模块包括 SFAM [98]、ASFF [48] 和 BiFPN [77]。SFAM 的主要思想是使用 SE 模块对多尺度拼接的特征图进行通道级的重新加权。至于 ASFF,它使用 softmax 进行逐点级的重新加权,然后将不同尺度的特征图相加。在 BiFPN 中,提出了多输入加权残差连接来执行尺度级的重新加权,然后将不同尺度的特征图相加。
在深度学习的研究中,一些人专注于寻找好的激活函数。一个好的激活函数可以使梯度更有效地传播,同时不会造成过多的额外计算成本。2010 年,Nair 和 Hinton [56] 提出了 ReLU,以显著解决传统 tanh 和 sigmoid 激活函数中频繁遇到的梯度消失问题。随后,LReLU [54]、PReLU [24]、ReLU6 [28]、缩放指数线性单元(SELU)[35]、Swish [59]、hard-Swish [27] 和 Mish [55] 等激活函数也被提出,用于解决梯度消失问题。LReLU 和 PReLU 的主要目的是解决当 ReLU 的输出小于零时梯度为零的问题。至于 ReLU6 和 hard-Swish,它们是为量化网络特别设计的。为了自归一化神经网络,提出了 SELU 激活函数以实现这一目标。需要注意的是,Swish 和 Mish 都是连续可微的激活函数。
在基于深度学习的目标检测中常用的后处理方法是 NMS(非极大值抑制),它可以用来过滤那些对同一目标预测不佳的边界框(BBoxes),只保留响应更高的候选边界框。NMS 的改进方式与优化目标函数的方法是一致的。NMS 最初提出的方法没有考虑上下文信息,因此 Girshick 等人 [19] 在 R-CNN 中加入了分类置信度分数作为参考,并根据置信度分数的顺序,从高分到低分依次执行贪婪 NMS。至于 soft NMS [1],它考虑了对象遮挡可能导致贪婪 NMS 中置信度分数下降的问题,并引入了 IoU 分数。DIoU NMS [99] 的开发者在 soft NMS 的基础上,将中心点距离的信息加入到边界框筛选过程中。值得一提的是,由于上述后处理方法都没有直接引用捕获的图像特征,因此在后续的无锚框方法的发展中不再需要后处理。
3.方法
基本目标是神经网络的快速运行速度,在生产系统中以及对并行计算的优化,而不是低计算量的理论指标(BFLOP)。我们提出了两种实时神经网络的选项:
- 对于 GPU,我们在卷积层中使用少量的组(1 - 8):CSPResNeXt50 / CSPDarknet53
- 对于 VPU,我们使用分组卷积,但避免使用 Squeeze-and-Excitement(SE)模块
- 具体包括以下模型:
EfficientNet-lite / MixNet [76] / GhostNet [21] / MobileNetV3
3.1 结构的选择
我们的目标是在输入网络分辨率、卷积层数量、参数数量(滤波器大小² × 滤波器数量 × 通道数 / 组数)以及层输出数量(滤波器数量)之间找到最佳平衡。例如,我们的大量研究表明,在 ILSVRC2012(ImageNet)数据集上进行目标分类时,CSPResNeXt50 比 CSPDarknet53 显著更好。然而,相反地,在 MS COCO 数据集上进行目标检测时,CSPDarknet53 比 CSPResNeXt50 更好。
下一个目标是选择用于增加感受野的附加模块,以及从不同骨干网络级别聚合参数的最佳方法,以适应不同检测器级别:例如 FPN、PAN、ASFF、BiFPN。
对于分类任务来说是最优的参考模型,并不总是对检测器来说也是最优的。与分类器相比,检测器需要以下几点:
(1)更高的输入网络尺寸(分辨率)——用于检测多个小尺寸目标
(2)更多的层——用于更大的感受野以覆盖增加的输入网络尺寸
(3)更多的参数——用于模型更大的容量,以在单张图像中检测多个不同尺寸的目标
假设性地讲,我们可以假设一个具有更大感受野尺寸(具有更多数量的
3
×
3
3 \times 3
3×3 卷积层)和更多参数的模型应该被选作骨干网络。表 1 显示了 CSPResNeXt50、CSPDarknet53 和 EfficientNet B3 的信息。CSPResNext50 仅包含 16 个
3
×
3
3 \times 3
3×3 的卷积层,感受野为
425
×
425
425 \times 425
425×425,参数数量为 2060 万;而 CSPDarknet53 包含 29 个
3
×
3
3 \times 3
3×3 的卷积层,感受野为
725
×
725
725 \times 725
725×725,参数数量为 2760 万。这一理论依据,结合我们的大量实验,表明 CSPDarknet53 神经网络是这两个模型中作为检测器骨干网络的最优选择。
不同尺寸的感受野的影响总结如下:
(1)达到目标尺寸——能够看到整个目标
(2)达到网络尺寸——能够看到目标周围的上下文
(3)超过网络尺寸——增加图像点与最终激活之间的连接数量
我们在 CSPDarknet53 上添加了 SPP 模块,因为它显著增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低网络的运行速度。我们使用 PANet 作为从不同骨干网络级别聚合参数的方法,用于不同检测器级别,而不是 YOLOv3 中使用的 FPN。
最终,我们选择了 CSPDarknet53 作为骨干网络,SPP 作为附加模块,PANet 作为路径聚合颈部,以及 YOLOv3(基于锚框)头部作为 YOLOv4 的架构。
在未来,我们计划大幅扩展检测器的“免费技巧包”(Bag of Freebies, BoF),理论上它可以解决一些问题并提高检测器的准确性,并且我们将依次以实验的方式检查每个特性的影响。
我们不使用跨 GPU 批量归一化(CGBN 或 SyncBN)或昂贵的专业设备。这使得任何人都可以在传统的图形处理器上重现我们的最先进的结果,例如 GTX 1080Ti 或 RTX 2080Ti。
注解:
(1)使用ImageNet进行目标分类训练,使用COCO数据集进行目标检测
(2)感受野的直观理解,假设网络某一层的某个神经元,它的输出值是由输入图像中某个局部区域的计算结果决定的。这个局部区域的面积就是该神经元的感受野。感受野越大,该神经元能捕获的输入图像中的上下文信息越广,对于每个卷积层而言,适当的增加感受野,能够提取图像中更多的语义信息
3.2 BoS和BoF的选择
为了改进目标检测的训练,卷积神经网络(CNN)通常会使用以下方法:
- 激活函数:ReLU、Leaky ReLU、参数化 ReLU(PReLU)、ReLU6、SELU、Swish 或 Mish
- 边界框回归损失:均方误差(MSE)、IoU(交并比)、GIoU(广义交并比)、CIoU(完全交并比)、DIoU(距离交并比)
- 数据增强:CutOut、MixUp、CutMix
- 正则化方法:DropOut、DropPath [36]、空间 DropOut [79] 或 DropBlock
- 通过均值和方差对网络激活进行归一化:批量归一化(Batch Normalization, BN)[32]、跨 GPU 批量归一化(Cross-GPU Batch Normalization, CGBN 或 SyncBN)[93]、滤波器响应归一化(Filter Response Normalization, FRN)[70] 或跨迭代批量归一化(Cross-Iteration Batch Normalization, CBN)[89]
- 跳跃连接:残差连接、加权残差连接、多输入加权残差连接或跨阶段部分连接(Cross Stage Partial connections, CSP)
至于训练激活函数,由于PReLU和SELU更难以训练,而ReLU6是专门为量化网络设计的,因此我们将上述激活函数从候选列表中移除。在正则化方法方面,DropBlock的发布者已经详细地将他们的方法与其他方法进行了比较,并且他们的正则化方法表现出色。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。至于归一化方法的选择,由于我们专注于仅使用一个GPU的训练策略,因此没有考虑syncBN。
3.3 额外的改进
为了使设计的检测器更适合在单个GPU上进行训练,我们进行了如下额外的设计和改进:
- 我们引入了一种新的数据增强方法Mosaic和自对抗训练(Self-Adversarial Training,SAT)。
- 在应用遗传算法时,我们选择了最优的超参数。
- 我们修改了一些现有的方法,以使我们的设计更适合高效的训练和检测,包括改进的SAM(Scaled Average Method)、改进的PAN(Path Aggregation Network)以及跨小批量归一化(Cross mini-Batch Normalization,CmBN)。
Mosaic是一种新的数据增强方法,它将4张训练图像混合在一起。因此,它混合了4种不同的上下文,而CutMix仅混合2张输入图像。这使得模型能够检测到超出其正常上下文的物体。此外,批量归一化在每一层上从4张不同的图像中计算激活统计信息,这显著减少了对大尺寸小批量的需求。
自对抗训练(SAT)也是一种新的数据增强技术,它在两个正向和反向阶段中运行。在第一阶段,神经网络会改变原始图像而不是网络权重。通过这种方式,神经网络对自己执行对抗性攻击,改变原始图像以制造出图像中不存在目标物体的假象。在第二阶段,神经网络以正常方式训练以检测这张修改后的图像上的物体。
CmBN是CBN的一个改进版本,如图4所示,被定义为跨小批量归一化(Cross mini-Batch Normalization,CmBN)。它仅在单个批次内的小批量之间收集统计信息。
我们将SAM从空间注意力(spatial-wise attention)修改为逐点注意力(point-wise attention),并将PAN的快捷连接(shortcut connection)替换为拼接(concatenation),分别如图5和图6所示。
3.4 YOLOv4
在本节中,我们将详细阐述YOLOv4的细节。
YOLOv4由以下部分组成:
- 主干网络(Backbone):CSPDarknet53 [81]
- 颈部结构(Neck):空间金字塔池化(SPP)[25]、路径聚合网络(PAN)[49]
- 头部结构(Head):YOLOv3 [63]
YOLOv4使用的技术包括:
- 主干网络的“免费技巧”(Bag of Freebies, BoF):CutMix和Mosaic数据增强;DropBlock正则化;类别标签平滑(Class label smoothing)
- 主干网络的“特殊技巧”(Bag of Specials, BoS):Mish激活函数;跨阶段部分连接(Cross-stage partial connections, CSP);多输入加权残差连接(Multi-input weighted residual connections, MiWRC)
- 检测器的“免费技巧”(Bag of Freebies, BoF):CIoU损失函数;跨小批量归一化(Cross mini-Batch Normalization, CmBN);DropBlock正则化;数据增强:Mosaic数据增强;自对抗训练(Self-Adversarial Training);消除网格敏感性(Eliminate grid sensitivity);单个真实值(ground truth)使用多个锚框;余弦退火调度器(Cosine annealing scheduler)[52];最优超参数;随机训练形状
- 检测器的“特殊技巧”(Bag of Specials, BoS):Mish激活函数;空间金字塔池化块(SPP-block);SAM块;PAN路径聚合块;DIoU-NMS
注解:
(1)参考YOLOv4.cfg,查阅到如下的网络结构
Backbone部分
1.Input Image
输入:608×608×3
2.Stage 1
Conv_1: 3×3x32
输入:608×608×3
输出:608×608×32
Conv_2: 3×3x64-s-2
输入:608×608×32
输出:304×304×64
Conv_3: 1×1x64
输入:304×304×64
输出:304×304×64
CSPBlock
输入:304×304×64
输出:304×304×64
2.Stage 2
Conv_4: 3×3x128-s-2
输入:304×304×64
输出:152×152×128
CSPBlock ×2
输入:152×152×128
输出:152×152×128
3.Stage 3
Conv_5: 3×3x256-s-2
输入:152×152×128
输出:76×76×256
CSPBlock ×8
输入:76×76×256
输出:76×76×256
4.Stage 4
Conv_6: 3×3x512-s-2
输入:76×76×256
输出:38×38×512
CSPBlock ×8
输入:38×38×512
输出:38×38×512
5.Stage 5
Conv_7: 3×3x1024-s-2
输入:38×38×512
输出:19×19×1024
CSPBlock ×4
输入:19×19×1024
输出:19×19×1024
Conv_8: 1x1x512
输入:19x19x1024
输出:19x19x512
Conv_9:3x3x1024
输入:19x19x512
输出:19x19x1024
Conv_10:1x1x512
输入:19x19x1024
输出:19x19x1024
6.Neck部分
SPP Module
输入:19×19×512
MaxPool (5×5, 9×9, 13×13)
Concat + 1×1 Conv
输出:19×19×2048(拼接4个输出)
7.PANet # 通过从上向下,从下到上的不同方式,提升了不同层级特征的融合
自顶向下路径
上采样 + 拼接浅层特征
输入:19×19×512
输出:38×38×256
自底向上路径
下采样 + 拼接深层特征
输入:38×38×256
输出:76×76×128
8.Head部分
检测头1
输入:76×76×128
卷积预测
输出:76×76×255
锚框:(12,16), (19,36), (40,28)
检测头2
输入:38×38×256
卷积预测
输出:38×38×255
锚框:(36,75), (76,55), (72,146)
检测头3
输入:19×19×512
卷积预测
输出:19×19×255
锚框:(142,110), (192,243), (459,401)
上述的Stage1到Stage5是CSPDarknet53。第1个CSPBlock的结构如下,最后的输出是304x304x64
# 输入
ImageInput(608x608x3) * Conv_1(3x3x32) --> feature_1(608x608x32)
feature_1(608x608x32) * Conv_2(3x3x64-s-2) --> feature_2(304x304x64)
feature_2(304x304x64) * Conv_3(1x1x64) --> feature_3(304x304x64)
之后进入CSPBlock
其中feature_2进入直接传输分支,feature_3进入卷积分支
卷积分支:
feature_3(304x304x64) * Conv_4(1x1x64) = feature_4(304x304x64)
feature_4(304x304x64) * Conv_5(1x1x32) = feature_5(304x304x32)
feature_5(304x304x32) * Conv_6(3x3x64) = feature_6(304x304x64)
# shortcut逐像素相加
shortcut(feature_4, feature_6) = feature_shortcut(304x304x64)
feature_shortcut(304x304x64) * Conv_7(1x1x64) = feature_7(304x304x64)
# concat
concat(feature_2, feature_7) --> feature_concat(304x304x128)
feature_concat(304x304x128) * Conv_8(1x1x64) = feature_8(304x304x64)
SPP模块的作用是增加感受野,下面分别对不同尺度的特征进行了提取,然后将这些尺度的特征进行拼接,因为是stride=1,所以不会改变图像的数值大小
### SPP ###
[maxpool]
stride=1
size=5
[route]
layers=-2
[maxpool]
stride=1
size=9
[route]
layers=-4
[maxpool]
stride=1
size=13
[route]
layers=-1,-3,-5,-6
### End SPP ###
使用PANet和多个检测头的主要好处是,提取了不同尺度的特征,实现了多个尺度的目标检测,尤其是小目标的检测效果
4.实验
我们在ImageNet(ILSVRC 2012验证集)数据集上测试了不同训练改进技术对分类器准确率的影响,随后又在MS COCO(2017年测试开发集)数据集上测试了这些技术对检测器准确率的影响。
4.1 实验设置
在ImageNet图像分类实验中,使用的默认超参数如下:训练步数为8,000,000;批量大小(batch size)和小批量大小(mini-batch size)分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1;学习率预热步数为1000;动量(momentum)和权重衰减(weight decay)分别设置为0.9和0.005。所有“特殊技巧”(BoS)实验都使用与默认设置相同的超参数,而在“免费技巧”(BoF)实验中,我们额外增加了50%的训练步数。在BoF实验中,我们验证了MixUp、CutMix、Mosaic、模糊(Bluring)数据增强以及标签平滑正则化方法。在BoS实验中,我们比较了LReLU、Swish和Mish激活函数的效果。所有实验均使用1080 Ti或2080 Ti GPU进行训练。
在MS COCO目标检测实验中,使用的默认超参数如下:训练步数为500,500;采用分步衰减学习率调度策略,初始学习率为0.01,并在第400,000步和第450,000步时分别乘以0.1的衰减因子;动量和权重衰减分别设置为0.9和0.0005。所有架构均使用单个GPU在批量大小为64的情况下进行多尺度训练,而小批量大小根据架构和GPU内存限制为8或4。除了使用遗传算法进行超参数搜索实验外,所有其他实验均使用默认设置。遗传算法使用YOLOv3-SPP进行训练,采用GIoU损失,并针对min-val 5k数据集搜索300个周期。我们为遗传算法实验采用了搜索到的学习率0.00261、动量0.949、分配真实值的IoU阈值0.213以及损失归一化因子0.07。我们验证了大量“免费技巧”(BoF),包括消除网格敏感性、Mosaic数据增强、IoU阈值、遗传算法、类别标签平滑、跨小批量归一化、自对抗训练、余弦退火调度器、动态小批量大小、DropBlock、优化锚框以及各种IoU损失。我们还对多种“特殊技巧”(BoS)进行了实验,包括Mish、SPP、SAM、RFB、BiFPN和高斯YOLO [8]。在所有实验中,我们仅使用一个GPU进行训练,因此未使用syncBN等针对多GPU优化的技术。
4.2 不同特征对分类器训练的影响
首先,我们研究了不同特征对分类器训练的影响;具体来说,包括类别标签平滑(Class label smoothing)的影响、不同数据增强技术的影响,如双边模糊(bilateral blurring)、MixUp、CutMix和Mosaic(如图7所示),以及不同激活函数的影响,例如默认的Leaky-ReLU、Swish和Mish。
在我们的实验中,如表2所示,通过引入CutMix和Mosaic数据增强、类别标签平滑以及Mish激活等特征,分类器的准确率得到了提升。因此,我们为分类器训练设计的BoF-backbone(“免费技巧”组合)包括以下内容:CutMix和Mosaic数据增强以及类别标签平滑。此外,我们还将Mish激活作为补充选项,如表2和表3所示。
4.3 不同特征对检测器训练的影响
进一步的研究关注了不同的“免费技巧”(Bag-of-Freebies,BoF-detector)对检测器训练准确率的影响,如表4所示。通过研究那些能够在不影响每秒帧数(FPS)的情况下提高检测器准确率的不同特征,我们显著扩展了BoF的列表:
- S:消除网格敏感性。YOLOv3中用于评估目标坐标时使用的公式为 b x = σ ( t x ) + c x b_x = \sigma(t_x) + c_x bx=σ(tx)+cx 和 b y = σ ( t y ) + c y b_y = \sigma(t_y) + c_y by=σ(ty)+cy,其中 c x c_x cx 和 c y c_y cy 总是整数。因此,为了使 b x b_x bx 的值接近 c x c_x cx 或 c x + 1 c_x + 1 cx+1,需要 t x t_x tx 的绝对值非常高。我们通过将Sigmoid函数乘以一个大于1.0的系数来解决这个问题,从而消除了网格对目标不可检测的影响。
- M:Mosaic数据增强——在训练时使用4图像拼接(mosaic)而不是单个图像。
- IT:IoU阈值——为单个真实值(ground truth)使用多个锚框,条件是IoU(真实值,锚框)> IoU阈值。
- GA:遗传算法——在训练的前10%时间段内,使用遗传算法选择最优超参数。
- LS:类别标签平滑——在Sigmoid激活中使用类别标签平滑。
- CBN:CmBN——使用跨小批量归一化(Cross mini-Batch Normalization),在完整批次内收集统计信息,而不是仅在单个小批量内收集。
- CA:余弦退火调度器——在正弦波训练过程中调整学习率。
- DM:动态小批量大小——通过使用随机训练形状,在小分辨率训练时自动增加小批量大小。
- OA:优化锚框——在512x512网络分辨率下训练时使用优化后的锚框。
- GIoU、CIoU、DIoU、MSE:在边界框回归中使用不同的损失算法。
进一步的研究关注了不同的“特殊技巧”(Bag-of-Specials,BoS-detector)对检测器训练准确率的影响,包括PAN、RFB、SAM、高斯YOLO(Gaussian YOLO,简称G)以及ASFF,如表5所示。在我们的实验中,当使用SPP、PAN和SAM时,检测器获得了最佳性能。
4.4 不同主干网络和预训练权重对检测器训练的影响
接下来,我们研究了不同主干网络模型对检测器准确率的影响,如表6所示。我们注意到,具有最佳分类准确率的模型并不一定在检测器准确率方面表现最佳。
首先,尽管使用不同特征训练的CSPResNeXt50模型的分类准确率高于CSPDarknet53模型,但CSPDarknet53模型在目标检测方面表现出更高的准确率。
其次,对于CSPResNeXt50分类器训练,使用“免费技巧”(BoF)和Mish激活可以提高其分类准确率,但将这些预训练权重进一步应用于检测器训练时,会导致检测器准确率降低。然而,对于CSPDarknet53分类器训练,使用BoF和Mish激活不仅提高了分类器的准确率,还提高了使用这些预训练权重的检测器的准确率。最终结果表明,CSPDarknet53主干网络比CSPResNeXt50更适合用于检测器。
我们观察到,CSPDarknet53模型由于各种改进,展现出更强的能力来提高检测器的准确率。
4.5 不同小批量大小对检测器训练的影响
最后,我们分析了使用不同小批量大小训练得到的模型的结果,这些结果如表7所示。从表7所示的结果中,我们发现,在引入“免费技巧”(BoF)和“特殊技巧”(BoS)训练策略后,小批量大小对检测器性能的影响几乎可以忽略不计。这一结果表明,在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。换句话说,任何人仅使用普通的GPU就可以训练出优秀的检测器。
5.实验结果
与其他最先进的目标检测器所获得的结果的比较如图8所示。我们的YOLOv4位于帕累托最优曲线上,在速度和准确率方面均优于最快且最准确的检测器。
由于不同方法在验证推理时间时使用了不同架构的GPU,我们在广泛采用的Maxwell、Pascal和Volta架构的GPU上运行YOLOv4,并与其他最先进的方法进行比较。表8列出了使用Maxwell GPU的帧率比较结果,可以是GTX Titan X(Maxwell)或Tesla M40 GPU。表9列出了使用Pascal GPU的帧率比较结果,可以是Titan X(Pascal)、Titan Xp、GTX 1080 Ti或Tesla P100 GPU。至于表10,它列出了使用Volta GPU的帧率比较结果,可以是Titan Volta或Tesla V100 GPU。
6.结论
我们提供了一种最先进的检测器,它比所有现有的替代检测器更快(FPS)且更准确(MS COCO AP50…95 和 AP50)。所描述的检测器可以在具有 8-16 GB显存的普通 GPU 上进行训练和使用,这使得其广泛使用成为可能。单阶段基于锚框的检测器的原始概念已经证明了其可行性。我们验证了大量特征,并选择了其中一些用于提高分类器和检测器的准确率。这些特征可以作为未来研究和开发的最佳实践。
7.致谢
作者们感谢Glenn Jocher提出了Mosaic数据增强的想法、通过遗传算法选择超参数以及解决网格敏感性问题。相关工作可以在GitHub上的ultralytics/yolov3项目中找到。