YOLOv4 论文分享

Abstract

为了提升卷积神经网络的准确率,人们提出了许多的特征。我们需要在大规模的数据集上对这些特征进行充分的试验和理论证明。有一些特征只对特定的模型、特定的问题、特定的数据集管用,而另一些特征如 batch-norm 和残差连接对于大多数的模型、任务和数据集都有效。我们假设这些通用的特征,包括 weighted-residual-connections (WRC)、cross-stage-partial-connections (CSP)、cross mini-batch normalization (CmBN)、self-adversarial-training (SAT) 和 Mish-activation。作者使用了新的特征:WRC、CSP、CmBN、SAT、Mish**函数、Mosaic 数据增强、CmBN、DropBlock 正则、CIoU Loss,并将它们中的某些结合起来使用,在COCO数据集上实现了 state of the art 的效果:43.5%43.5\% AP (65.7%AP5065.7\% AP_{50} ),在Tesla V100 显卡上的推理速度是 65 FPS。代码放在了:https://github.com/JianqiuChen/darknet

1. Introduction

基于 CNN 的目标检测器主要应用在推荐系统中。例如我们要通过城市的视频监控摄像头寻找空停车位,这个一般是通过速度慢而准确率高的模型完成,而汽车碰撞告警则是通过速度快而没那么准确的模型完成。提升实时检测器的准确率使得它们不仅可以用于推荐系统,也可以用在独立的流程管控系统中,减少人的操作。在传统的GPU上进行实时、大量的目标检测运算,成本是比较合理的。目前最准确的神经网络模型推理时并不是实时的,需要大量的GPUs算力来训练,mini-batch 大小也设的比较大。本文提出了一个能在传统GPU上实时运算的CNN,训练时只需要一个GPU就够了。

YOLOv4 论文分享

本文主要目的就是设计一个能在生产环境中快速运行的目标检测器,而不追求理论上的计算量数字(BFLOP)。作者希望这个目的应该能够轻易地实现和利用。比如,任何一个人想使用传统的GPU来训练和测试,都可以实现实时性、高准确率的目标检测效果,如图1中YOLOv4所展示的。本文贡献主要如下:

  1. 本文提出了一个高效、强大的目标检测模型。我们可以通过 1080 Ti 或 2080 Ti 显卡就可以训练出一个非常快而准确的目标检测器。
  2. 在训练过程中,作者验证了 state of the art 的各种骚操作。
  3. 作者修改了这些方法,使它们更适合单GPU训练,包括CBN、PAN和SAM等。

YOLOv4 论文分享

2. Related Works

2.1 目标检测模型

目前的检测器主要有两个部分构成,主干网络一般在 ImageNet 上预训练得到,以及一个 head 用于预测物体的类别和边框。对于在GPU平台上运行的检测器,它们的主干网络可以是 VGG、ResNet、ResNeXt 或 DenseNet。对于在CPU平台上运行的检测器,主干网络可以是 SqueezeNet、MobileNet、ShuffleNet。至于 head部分,主要可以分为两类,单阶段和双阶段目标检测器。最具代表性的双阶段模型就是 R-CNN 系列,包括 Fast R-CNN、Faster R-CNN 和 R-FCN、Libra R-CNN。我们也可以将双阶段目标检测器修改为 anchor-free,如 RepPoints。对于单阶段目标检测器,最具代表性的就是YOLO、SSD、RetinaNet。近两年人们提出了 anchor-free 的单阶段目标检测器。这一类检测器包括 CenterNet、CornerNet、FCOS 等。人们也会在主干网络和 head 之间插入一些层,用于搜集不同阶段之间的特征图。我们可以将之称作目标检测器的 neck。一般地,一个 neck 由若干个 bottom-up paths 和 top-down paths 组成。有这种机制的网络包括 FPN、Path Aggregation Network(PAN)、BiFPN和NAS-FPN。

除了上述模型,一些研究人员直接聚焦在构建新主干网络(DetNet、DetNAS)或全新的模型(SpineNet、HiDetector)上。

总之,常见的目标检测器由以下几个部分组成:

  • 输入:图片、图片块、图像金字塔;
  • 主干网络:VGG16、ResNet-50、SpineNet、EfficientNet-B0/B7、CSPResNeXt50、CSPDarkNet53。
  • Neck:
    • Additional blocks: SPP、ASPP、RFB、SAM。
    • Path-aggregation blocks: FPN、PAN、NAS-FPN、Fully-connected、BiFPN、ASFF、SFAM。
  • Heads:
    • 密集检测(单阶段):
      • 基于 anchor : RPN, SSD, YOLO, RetinaNet;
      • 不基于anchor : CornerNet, CenterNet, MatrixNet, FCOS。
    • 稀疏检测(双阶段):
      • 基于 anchor : Faster R-CNN, R-FCN, Mask R-CNN;
      • 不基于 anchor : RepPoints。

2.2 Bag of Freebies

传统的目标检测器通常都是在线下训练的。因此研究者会利用这点,设计更好的训练方法,提升推理准确率,而不增加推理成本。本文中作者将这种只改变训练策略,或只增加训练成本的方法称作 “bag of freebies”。数据增广就是这样的一个方法。数据增广的目的是增加输入图片的多样性,这样训练出的模型对不同环境下的图片更具鲁棒性。例如光度变形和几何变形是两种常用的数据增广方法,有助于目标检测效果提升。对于光度变形,我们会调整其亮度、对比度、色彩、饱和度和噪点。对于几何变形,我们会增加随机缩放、裁剪、翻转和旋转。

上述数据增广方法都是像素级的调整,调整区域内的所有原始像素信息都会被保留下来。此外,一些研究数据增广的研究人员关注于如何模拟物体的遮挡问题。他们在图像分类和目标检测任务上都取得了不错的效果。比如 random erase 或 CutOut 随机选择图片中的矩形区域,然后用一个随机数或0填充。至于 hide-and-seek 和 grid mask方法,它们随机或均匀地选择多个矩形区域,将它们替换为0。在特征图上也有类似的操作,比如 DropOut, DropConnect, DropBlock方法。此外,一些研究者提出使用多个图片来进行数据增广。比如,MixUp 将2张图片相乘,再用不同的比例系数来进行叠加,然后用这些叠加比例调整标签。CutMix方法则是用其它图片的矩形区域来覆盖裁剪图像,然后根据这个 mix 面积的大小来调整其标签。风格迁移 GAN 也可用于数据增广,它可以显著地降低CNN学到的图片纹理的 bias。

与上述方法不同,另一些 bag of freebies 方法则致力于解决数据集中的语义分布的 bias。一个很重要的问题就是类别不均衡,在双阶段检测器中,我们通常通过 hard negative example mining 来解决,或 online hard example mining。但是 example mining 方法不适用于单阶段目标检测器,因为这类检测器会有非常密集的预测输出。因此 Lin 等人提出了 Focal Loss 来解决这个问题。另一个重要的问题就是,用 one-hot hard representation 很难去表示不同类别之间的联系程度。我们通常在标注数据的时候,使用这个 representation 机制。[73]中提出的 label smoothing 方法将 hard label 转为 soft label 来训练,使得模型更加鲁棒。为了获得一个更优的 soft label,Islam 等人引入了 knowledge distillation 概念来设计 label refinement 网络。

最后一个 bag of freebies 方法就是边框回归的目标函数。传统的目标检测器通常使用 mean square error 对中心点的坐标、边框高度和宽度直接进行回归,即{xcenter,ycenter,w,h}\{x_{center}, y_{center}, w, h\},或者左上点和右下点,即{xtopleft,ytopleft,xbottomright,xbottomright}\{x_{top-left}, y_{top-left}, x_{bottom-right}, x_{bottom-right}\}。对于基于 anchor 的方法,它是要去估计其对应的偏移量,例如{xcenteroffset,ycenteroffset,woffset,hoffset}\{x_{center-offset}, y_{center-offset}, w_{offset}, h_{offset}\}。直接估计边框上每个点的坐标值,就是将这些点看作为独立的变量,但并没有考虑目标物体的完整性。为了更好地处理这个问题,研究人员最近提出了 IoU Loss,计算预测边框与 ground truth 边框的重叠面积。IoU Loss 计算物体边框与 ground truth 边框的 IOU,从而计算边框的四个坐标点,然后将生成的结果整体编码。IOU是与尺度无关的,而传统的l1,l2l_1,l_2损失会随着尺度的增加而增加。最近,研究人员持续改进IoU 损失。例如,GIoU 损失除了重叠度,也考虑了物体的形状和朝向。他们提出找到面积最小的边框,能同时覆盖预测边框和 ground truth 边框,然后将这个边框作为分母,代替原来的IOU损失的分母。DIOU 损失考虑了物体中心点的距离,而CIOU 损失则同时考虑了重叠面积、中心点距离与 aspect ratio 等。CIOU 能够实现更快的收敛速度与更高的边框回归准确性。

2.2 Bag of specials

插件模块和后处理方法只增加一点点的推理成本,但是可以显著提升目标检测的准确率,作者将之称作"bag of specials"。一般而言,插件模块用于增强模型的某些属性,如增大感受野,增强特征整合能力,引入注意力机制等,后处理则用于筛选模型的预测结果。

常用的增强感受野的模块包括 SPP、ASPP、RFB等。SPP模块起源于 Spatial Pyramid Matching(SPM),SPM原来的方法是将特征图分割为多个d×dd\times d一样的区块,dd可以是KaTeX parse error: Undefined control sequence: \1 at position 3: \{\̲1̲,2,3,...},这样就有了空间金字塔,然后提取出 bag-of-word 特征。SPP 将SPM 整合入CNN,使用最大池化操作,而非 bag-of-word 操作。SPP模块的输出是一维特征向量,因此无法用在全卷积网络中。在YOLOv3的设计中,Redmon和Farhadi改进了SPP模块,将最大池化的输出 concat 起来,最大池化的 kernel 大小是 k×k,k{1,5,9,13}k\times k, k\in\{1,5,9,13\},步长为1。该最大池化操作有效地增大了主干网络特征的感受野。增加了SPP模块改进版本之后,在COCO数据集上,YOLOv3-608 的AP50AP_{50}提升了2.7%2.7\%,而计算量只增加了0.5%0.5\%。ASPP模块和改进SPP模块的主要不同在于,原来的是k×kk\times k kernel 大小,max-pool 步长为1,改为了3×33\times 3的 kernel 大小,dilated ratio 为kk,dilated 卷积操作中步长为1。RFB模块使用了多个 dilated 卷积,kernel 大小是k×kk\times k,dilated ratio 为kk,步长为1,实现了比ASPP更全面的空间覆盖。RFB 在MS COCO数据集上,只增加了7%7\%的计算量,但提升了AP50AP_{50} 5.7%5.7\%

注意力模块经常用在目标检测中,可以分为通道级注意力和像素级注意力,这俩的代表模型分别是 Squeeze and Excitation 和 Spatial Attention Module。尽管SE模块在ImageNet 分类任务上,能够提升 ResNet50 的 top-1准确率 1%1\%,而计算成本会增加2%2\%,但是在GPU上它会增加10%10\%的推理时间,因此它更适合用在移动设备上。但是对于SAM,它只增加0.1%0.1\%的成本,但可以提升 ResNet50-SE的 top-1准确率0.5%0.5\%。而且,它并不会影响GPU的推理速度。

关于特征融合,早期的实践是使用 skip 连接或 hyper-column 来整合低层级物理特征与高层级语义特征。由于多尺度预测方法如FPN越来越流行,许多轻量级模块就被提出来了,如SFAM、ASFF、BiFPN。SFAM的主要思想就是利用SE模块,对 concat 的多尺度特征图的通道进行重新加权。ASFF则是使用 softmax 进行像素点级别的再加权,将不同尺度的特征图加起来。BiFPN提出了多输入加权的残差连接,进行尺度级别的重新加权,然后增加不同尺度的特征图。

在深度学习研究中,有一些研究人员关注在**函数上。一个好的**函数使得梯度可以更高效率地传播,而不会增加额外的成本。2010年,Nair和Hinton提出了 ReLU函数,显著地解决了梯度消失的问题,在tanh函数和sigmoid函数中梯度消失问题很常见。随后,人们提出了LReLU、PReLU、ReLU6、Scaled Exponential Linear Unit(SELU)、Swish、hard-Swish 和Mish函数,用于解决了梯度消失问题。LReLU和PReLU用于解决当输出小于0时,ReLU输出为0的情况。对于ReLU6和hard-Swish,它们是针对量化网络提出的。为了自归一化神经网络,人们提出了SELU**函数。我们需要注意的是,Swish和Mish都是连续可微的。

深度学习目标检测器中常用的后处理方法有NMS,用于过滤那些错的离谱的边框,只留下那些响应较高的候选边框。NMS改进的方式与目标函数优化的方式一致。原来的NMS方法并不考虑上下文信息,所以 Girshick等人增加了R-CNN的分类置信度作为参考,根据置信度得分来排序,然后从高到低地进行 greedy NMS。至于 soft NMS,它考虑到了物体遮挡的情形,这会造成 greedy NMS 置信度得分退化的问题。DIOU NMS 基于 soft NMS而来,增加了中心点距离的信息来过滤边框。因为上述的后处理方法都没有直接应用在图像特征上,在anchor-free方法上就不再需要这些步骤了。

3. Methodology

本文基本目的就是在生产环境下的神经网络的快速推理与并行计算,而非理论上的计算量数字。作者提出了两个实时神经网络的选项:

  • 对于GPU,作者在卷积层中,使用较少数量的 groups (181-8):CSPResNeXt50/CSPDarknet53;
  • 对于VPU,作者使用分组卷积,但是没使用 Squeeze and Excitation 模块,这包括以下模型:EfficientNet-lite/MixNet/GhostNet/MobileNetV3。

3.1 网络结构的选择

本文的一个目的是在输入分辨率、卷积层个数、参数数量(滤波器大小×\times滤波器大小×\times滤波器个数×\times通道数//分组数),以及输出的个数之间实现最佳的平衡。例如,在ImageNet分类任务上,本文研究证明 CSPResNext50 要比 CSPDarkNet53的效果好。但是相反,在目标检测数据集MS COCO上,CSPDarkNet53的效果要比CSPResNext50好。

另一个目的就是选择额外的模块,增加感受野和找到最佳的参数聚合方式,如 FPN、PAN、ASFF、BiFPN。

在分类任务上表现很好的模型,在目标检测任务上并不一定是最优的。与分类器相比,目标检测器需要具备以下特点:

  • 更高的输入分辨率,检测小物体;
  • 更多的层,实现更大的感受野来覆盖输入图像;
  • 更多的参数,这样模型检测单张图片中不同大小物体的能力更强。

我们假设一个具有较大感受野(有非常多的3×33\times 3卷积层)和较多参数的模型作为主干网络。表1显示了CSPResNeXt50, CSPDarknet53, EfficientNet B3 的信息。

YOLOv4 论文分享

CSPResNeXt50只有16个卷积层,卷积核大小是3×33\times 3,感受野大小是425×425425\times 425,参数量是20.6M20.6M,而CSPDarknet53有29个卷积层,卷积核大小是3×33\times 3,感受野大小是725×725725\times 725,参数量是27.6M27.6M。理论证明以及实验研究显示,CSPDarknet53相对于CSPResNeXt50更适合做目标检测器的主干网络。

不同大小感受野的影响如下:

  • 对于物体大小而言,可以看到物体的全貌;
  • 对于网络大小而言,可以看到物体周围的上下文信息;
  • 增加图像像素点与最终**函数的连接数量。

作者在CSPDarknet53中增加了SPP模块,因为它能明显增大感受野,找到最显著的上下文特征,而不会降低网络的推理速度。作者使用PANet作为参数聚合的方法,将不同检测器层级的参数聚合起来,而不是 YOLOv3 中的FPN。

最终,作者选择CSPDarknet53作为主干网络,SPP模块,PANet 聚合 neck,以及 YOLOv3 head 作为 YOLOv4 的网络结构

未来,作者打算大幅度扩展 bag of freebies 的内容,理论上可以解决一些问题,提升检测器的准确率,然后通过实验依次核对每个特征的影响。

作者没有使用 Cross-GPU Batch Norm(CGBN或SyncBN)操作或其它昂贵的特殊设备。这使得任何人在一张传统的显卡如 GTX 1080Ti或2080Ti上都可以实现本文的成果。

3.2 BoF 和 BoS的选择

为了提升目标检测的训练,CNN通常会使用下面的操作:

  • **函数:ReLU, Leaky-ReLU,parametric-ReLU,ReLU6, SELU, Swish, Mish。
  • 边框回归损失:MSE, IOU, GIoU, CIoU, DIoU。
  • 数据增广:CutOut, MixUp, CutMix。
  • 正则方法:DropOut, DropPath, Spatial DropOut, DropBlock。
  • **函数归一化方法:Batch Norm, Cross-GPU Batch Norm, Filter Response Norm, Cross-Iteration Batch Norm。
  • Skip connections:残差连接、加权残差连接、多输入加权残差连接、Cross stage partial connections。

对于训练**函数,由于PReLU和ELU更难训练,ReLU6 是针对量化网络特别提出的,作者因而将上述**函数移除出了候选列表。在正则项中,DropBlock 的效果要比其它方法好许多,因此作者就选择了 DropBlock作为正则方法。对于归一化方法,因为作者关注在训练策略上,只使用一个GPU,就没有考虑 syncBN了。

3.3 其它改进

为了使检测器更适合在单GPU上训练,作者做了额外的改进:

  • 引入了一个新的数据增广方法,Mosaic和Self-Adversarial Training;
  • 使用遗传算法,选择最优的超参数;
  • 修改现有的方法,使本文模型更适合高效的训练与检测— modified SAM, modified PAN, Cross mini-Batch Norm(CmBN)。

Mosaic 是一个新的数据增广方法,将4张训练图片混合起来。因而我们就混合了4个不同的上下文,而 CutMix 只混合了2个输入图片。这允许我们在常规的上下文信息之外进行目标检测。此外,BN计算4张图片在每一层**函数的统计数据。这极大地降低了 batch size 所需的大小。

YOLOv4 论文分享

Self-Adversarial Training 是另一个新的数据增广方法,有2个前向和反向阶段。在第一个阶段中,神经网络改变原始图片,而非网络的权重。这样神经网络就对它自己进行对抗攻击,修改原始图片来造成一种假象图片中没有想要的物体。在第二个阶段中,我们训练神经网络来在修改后的图片中检测物体。

CmBN 是 CBN 修改后的版本,如图4所示,叫做Cross Mini-Batch Norm。它搜集单个 batch 中 mini-batch 的统计数据。

作者修改了SAM,从 spatial-wise 注意力变为 point-wise 注意力机制,将PAN中的短路连接改为 concat 操作,分别如图5和图6所示。

YOLOv4 论文分享

YOLOv4 论文分享

YOLOv4 论文分享

3.4 YOLOv4

这一章节中,作者详细介绍了YOLOv4。

YOLOv4由以下构成:

  • 主干网络:CSPDarknet53;
  • Neck: SPP, PAN;
  • Head: YOLOv3.

YOLOv4 使用:

  • 在主干网络中应用的 Bag of Freebies:CutMix和Mosaic数据增广,DropBlock正则,Class Label Smoothing;
  • 在主干网络中使用的 Bag of Specials: Mish **函数,Cross-stage partial connections, Multi-input weighted residual connections;
  • 在检测器中使用的 Bag of Freebies: CIoU-Loss, CmBN, DropBlock 正则,Mosaic 数据增广,Self-Adversarial Training, Eliminate grid sensitivity, 对单个 ground truth 图片使用多个 anchor boxes,Cosine 退火机制,最优的超参数和随机训练形状。
  • 在检测器中使用的 Bag of Specials: Mish**函数,SPP模块,SAM模块,PAN聚合模块,DIOU-NMS。