YOLOv4:目标检测的最佳速度与精度
0.论文摘要
有许多特征被认为可以提高卷积神经网络(CNN)的准确性。需要在大规模数据集上对这些特征的组合进行实际测试,并对结果进行理论上的验证。某些特征仅适用于特定模型和特定问题,或仅适用于小规模数据集;而一些特征,如批量归一化和残差连接,适用于大多数模型、任务和数据集。我们假设这些通用特征包括加权残差连接(WRC)、跨阶段部分连接(CSP)、跨小批量归一化(CmBN)、自对抗训练(SAT)和Mish激活函数。我们使用了新的特征:WRC、CSP、CmBN、SAT、Mish激活函数、Mosaic数据增强、CmBN、DropBlock正则化和CIoU损失,并将其中一些特征结合起来,实现了最先进的结果:在Tesla V100上以约65 FPS的实时速度,在MS COCO数据集上达到了43.5% AP(65.7% AP50)的精度。
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]等。
图1:提出的YOLOv4与其他最先进目标检测器的对比。YOLOv4在性能相当的情况下,运行速度比EfficientDet快两倍。与YOLOv3相比,AP和FPS分别提高了10%和12%。
2.相关工作
2.1 目标检测模型
现代检测器通常由两部分组成:一个是在ImageNet上预训练的主干网络,另一个是用于预测物体类别和边界框的头部网络。对于运行在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]。也可以将两阶段目标检测器设计为无锚框目标检测器,例如RepPoints [87]。对于单阶段目标检测器,最具代表性的模型是YOLO [61, 62, 63]、SSD [50]和RetinaNet [45]。近年来,无锚框单阶段目标检测器得到了发展,这类检测器包括CenterNet [13]、CornerNet [37, 38]、FCOS [78]等。近年来开发的目标检测器通常在主干网络和头部网络之间插入一些层,这些层通常用于从不同阶段收集特征图。我们可以称之为目标检测器的颈部网络。通常,颈部网络由若干自下而上的路径和若干自上而下的路径组成。采用这种机制的网络包括特征金字塔网络(FPN)[44]、路径聚合网络(PAN)[49]、BiFPN [77]和NAS-FPN [17]。
除了上述模型外,一些研究者将重点放在直接构建新的骨干网络(如DetNet [43]、DetNAS [7])或全新的整体模型(如SpineNet [12]、HitDetector [20])上,以用于目标检测。
综上所述,一个普通的物体检测器由以下几个部分组成:
• 输入:图像、图像块、图像金字塔
• 主干网络:VGG16 [68]、ResNet-50 [26]、SpineNet [12]、EfficientNet-B0/B7 [75]、CSPResNeXt50 [81]、CSPDarknet53 [81]
• 颈部:
• 附加模块:SPP [25]、ASPP [5]、RFB [47]、SAM [85]
• 路径聚合模块:FPN [44]、PAN [49]、NAS-FPN [17]、全连接FPN、BiFPN [77]、ASFF [48]、SFAM [98]
• 头部:
• 密集预测(单阶段):
◦ RPN [64]、SSD [50]、YOLO [61]、RetinaNet [45](基于锚点)
◦ CornerNet [37]、CenterNet [13]、MatrixNet [60]、FCOS [78](无锚点)
• 稀疏预测(两阶段):
◦ Faster R-CNN [64]、R-FCN [9]、Mask RCNN [23](基于锚点)
◦ RepPoints [87](无锚点)
2.2 免费赠品
通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更高的精度。我们将这些仅改变训练策略或仅增加训练成本的方法称为“免费午餐”。目标检测方法中经常采用且符合“免费午餐”定义的是数据增强。数据增强的目的是增加输入图像的多样性,从而使设计的目标检测模型对不同环境下获取的图像具有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据增强方法,它们无疑对目标检测任务有益。在处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,我们添加随机缩放、裁剪、翻转和旋转。
上述数据增强方法都是基于像素级别的调整,调整区域内的所有原始像素信息均被保留。此外,一些从事数据增强的研究者将重点放在模拟物体遮挡问题上,并在图像分类和目标检测中取得了良好的效果。例如,随机擦除(Random Erase)[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]提出了焦点损失(focal loss)来处理各类别之间存在的数据不平衡问题。另一个非常重要的问题是,使用one-hot硬标签表示法难以表达不同类别之间的关联程度。这种表示方案通常在执行标注时使用。[73]中提出的标签平滑(label smoothing)方法将硬标签转换为软标签进行训练,可以使模型更加鲁棒。为了获得更好的软标签,Islam等人[33]引入了知识蒸馏的概念,设计了标签精炼网络。
最后一个免费赠品是边界框(BBox)回归的目标函数。传统的目标检测器通常使用均方误差(MSE)直接对BBox的中心点坐标和高度、宽度进行回归,即{x_center, y_center, w, h},或者对左上点和右下点进行回归,即{x_top_left, y_top_left, x_bottom_right, y_bottom_right}。对于基于锚点的方法,则是估计相应的偏移量,例如{x_center_offset, y_center_offset, w_offset, h_offset}和{x_top_left_offset, y_top_left_offset, x_bottom_right_offset, y_bottom_right_offset}。然而,直接估计BBox每个点的坐标值是将这些点视为独立变量,但实际上并未考虑物体本身的完整性。为了更好地处理这一问题,一些研究者最近提出了IoU损失[90],它将预测BBox区域与真实BBox区域的覆盖范围纳入考虑。IoU损失的计算过程会通过与真实值执行IoU来触发BBox四个坐标点的计算,然后将生成的结果连接成一个整体代码。由于IoU是一种尺度不变的表示方法,它可以解决传统方法在计算{x, y, w, h}的l1或l2损失时,损失会随着尺度增加的问题。最近,一些研究者继续改进IoU损失。例如,GIoU损失[65]除了覆盖范围外,还考虑了物体的形状和方向。他们提出找到能够同时覆盖预测BBox和真实BBox的最小区域BBox,并使用该BBox作为分母来替换IoU损失中原本使用的分母。至于DIoU损失[99],它额外考虑了物体中心的距离,而CIoU损失[99]则同时考虑了重叠区域、中心点之间的距离以及宽高比。CIoU在BBox回归问题上可以实现更好的收敛速度和精度。
2.3 Bag of specials
对于那些仅略微增加推理成本但能显著提高目标检测准确率的插件模块和后处理方法,我们称之为“特殊技巧包”。一般来说,这些插件模块用于增强模型中的某些属性,例如扩大感受野、引入注意力机制或加强特征整合能力等,而后处理则是一种用于筛选模型预测结果的方法。
可用于增强感受野的常见模块包括SPP [25]、ASPP [5]和RFB [47]。SPP模块源自空间金字塔匹配(SPM)[39],SPM的原始方法是将特征图分割为若干个d × d的等大小块,其中d可以是{1, 2, 3, …},从而形成空间金字塔,然后提取词袋特征。SPP将SPM集成到CNN中,并使用最大池化操作代替词袋操作。由于He等人[25]提出的SPP模块会输出一维特征向量,因此无法直接应用于全卷积网络(FCN)。因此,在YOLOv3 [63]的设计中,Redmon和Farhadi对SPP模块进行了改进,将其改为使用不同核大小k × k(其中k = {1, 5, 9, 13})的最大池化输出进行拼接,且步长为1。在这种设计下,较大的k × k最大池化操作有效地增加了骨干特征的感受野。在添加了改进版的SPP模块后,YOLOv3-608在MS COCO目标检测任务中的AP50提升了2.7%,同时仅增加了0.5%的计算开销。ASPP [5]模块与改进版SPP模块的主要区别在于,ASPP将原始的k × k核大小、步长为1的最大池化操作替换为多个3 × 3核大小、膨胀率为k、步长为1的膨胀卷积操作。RFB模块则是通过使用多个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模块可以在ImageNet图像分类任务中将ResNet50的top-1准确率提高1%,而计算量仅增加2%,但在GPU上通常会使推理时间增加约10%,因此更适合在移动设备上使用。而对于SAM来说,它只需额外支付0.1%的计算量,便能在ImageNet图像分类任务中将ResNet50-SE的top-1准确率提高0.5%。最重要的是,它完全不会影响GPU上的推理速度。
在特征融合方面,早期的实践是使用跳跃连接[51]或超列[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]、Scaled Exponential Linear Unit (SELU) [35]、Swish [59]、hard-Swish [27]和Mish [55]等也被提出,用于解决梯度消失问题。LReLU和PReLU的主要目的是解决ReLU在输出小于零时梯度为零的问题。至于ReLU6和hard-Swish,它们专门为量化网络设计。为了实现神经网络的自我归一化,提出了SELU激活函数。需要注意的是,Swish和Mish都是连续可微的激活函数。
在基于深度学习的物体检测中,常用的后处理方法是NMS(非极大值抑制),它可以用来过滤那些对同一物体预测效果较差的边界框(BBox),并仅保留响应较高的候选边界框。NMS试图改进的方式与优化目标函数的方法一致。NMS最初提出的方法并未考虑上下文信息,因此Girshick等人在R-CNN中加入了分类置信度分数作为参考,并根据置信度分数的顺序,从高分到低分进行贪婪NMS。至于soft NMS,它考虑了物体遮挡可能导致贪婪NMS中IoU分数置信度下降的问题。DIoU NMS的开发者的思路是在soft NMS的基础上,将中心点距离的信息加入到边界框筛选过程中。值得一提的是,由于上述后处理方法均未直接参考捕获的图像特征,因此在后续无锚点方法的发展中,不再需要后处理。
3.方法
基本目标是实现神经网络在生产系统中的快速运行速度,并优化并行计算,而非低计算量的理论指标(BFLOP)。我们提出了两种实时神经网络的方案:
• 对于GPU,我们在卷积层中使用少量分组(1 - 8):CSPResNeXt50 / CSPDarknet53
• 对于VPU,我们使用分组卷积,但避免使用Squeeze-and-excitation(SE)模块——具体包括以下模型:EfficientNet-lite / MixNet [76] / GhostNet [21] / MobileNetV3
3.1 架构的选择
我们的目标是找到输入网络分辨率、卷积层数、参数数量(滤波器大小² * 滤波器数 * 通道数 / 组数)和层输出数(滤波器数)之间的最佳平衡。例如,我们的多项研究表明,在ILSVRC2012(ImageNet)数据集上的物体分类任务中,CSPResNext50明显优于CSPDarknet53 [10]。然而,相反地,在MS COCO数据集上的物体检测任务中,CSPDarknet53则优于CSPResNext50 [46]。
下一个目标是选择额外的模块以增加感受野,并为不同检测器层级选择最佳的参数聚合方法,例如FPN、PAN、ASFF、BiFPN。
对于分类任务最优的参考模型并不总是对检测器最优。与分类器相比,检测器需要以下内容:
• 更高的输入网络尺寸(分辨率)——用于检测多个小尺寸物体
• 更多的层——用于更大的感受野以覆盖增加的输入网络尺寸
• 更多的参数——用于提高模型在单张图像中检测不同尺寸物体的能力
假设来说,我们可以认为应该选择具有更大感受野大小(包含更多3×3卷积层)和更多参数的模型作为骨干网络。表1展示了CSPResNeXt50、CSPDarknet53和EfficientNet B3的信息。CSPResNext50仅包含16个3×3卷积层,感受野为425×425,参数数量为20.6M,而CSPDarknet53包含29个3×3卷积层,感受野为725×725,参数数量为27.6M。这一理论依据,加上我们的大量实验,表明CSPDarknet53神经网络是两者中作为检测器骨干网络的最优模型。
不同大小的感受野的影响总结如下:
• 达到物体大小——可以观察整个物体
• 达到网络大小——可以观察物体周围的上下文
• 超过网络大小——增加图像点与最终激活之间的连接数量
我们在CSPDarknet53上添加了SPP模块,因为它显著增加了感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度。我们使用PANet作为从不同骨干层级到不同检测器层级的参数聚合方法,而不是YOLOv3中使用的FPN。
最后,我们选择了CSPDarknet53作为主干网络,SPP附加模块,PANet路径聚合颈部,以及YOLOv3(基于锚点)的头部作为YOLOv4的架构。
未来,我们计划显著扩展检测器的“免费礼包”(BoF)内容,理论上可以解决一些问题并提高检测器的准确性,并通过实验方式依次检查每个特征的影响。
我们没有使用跨GPU批量归一化(CGBN或Sync