Alexey Bochkovskiy Chien-Yao Wang Hong-Yuan Mark Liao
目录
YOLOv4:目标检测的最佳速度和精度
YOLOv4: Optimal Speed and Accuracy of Object Detection
摘要
1. 介绍
2. 相关工作
2.1. 目标检测模型
2.2. Bag of freebies
2.3. Bag of specials
3. 方法
3.1. 结构选择
3.2. BoF and BoS的选择
3.3. 其他改进
3.4. YOLOv4
4. 实验
4.1. 实验设置
4.2. 不同功能对分类器训练的影响
4.3. 不同功能对检测器训练的影响
4.4. 不同骨干和预先训练的权重对检测器训练的影响
4.5. 不同小批次对检测器训练的影响
5. 结果
6. 结论
有大量的功能可以提升卷积神经网络(Convolutional Neural Network, CNN)的准确性。需要在大型数据集上对此类功能的组合进行实际测试,以及结果的理论论证。一些功能仅针对某些模型,或仅针对某些问题,或仅适用于小规模数据集;而一些功能(如批规范化batch-normalization和残差连接residual-connections)适用于大多数的模型、任务和数据集。我们假设此类通用功能包括加权残差连接(Weighted-Residual-Connections, WRC)、跨阶段-部分连接(Cross-Stage-Partial-connections, CSP)、交叉小批量规范化(Cross mini-Batch Normalization, CmBN)、自对抗训练(Self-adversarial-training, SAT)和Mish激活。我们使用新功能:WRC、CSP、CmBN、SAT、Mish激活、Mosaic数据扩增、CmBN、DropBlock正则化和CIoU损失,并联合其中一些功能实现最先进的结果:针对MS COCO数据集,在Tesla V100上以~65 FPS的实时速度达到43.5% AP(65.7% AP50)。源代码为https://github.com/AlexeyAB/darknet。
多数基于CNN的目标检测器大多仅适用于推荐系统(recommendation systems)。例如,通过城市摄像机搜索免费停车位是通过缓慢但准确的模型执行的,而汽车碰撞警告则与快速而不准确的模型有关。提高实时目标检测器精度,不仅可以将其用于提示生成建议系统,还可用于独立的过程管理和人工输入的减少。在传统图形处理单元(Graphics Processing Units , GPU)上允许了实时目标检测器操作以实惠的价格大规模使用。最精确的现代神经网络无法实时运行,并且需要大量的GPU进行大量小批次处理的训练。我们通过创建一个在传统GPU 上实时运行的CNN来解决这些问题,为此训练只需要一个常规的GPU。
这项工作的主要目标是设计一个生产系统中运行速度快速的目标检测器,并优化并行计算,而不是低计算量理论指标(BFLOP)。我们希望设计的模型能够轻松训练和使用。例如,任何使用传统GPU进行训练与测试的人都可以获得实时、高质量和令人信服的目标检测结果,如图1 的YOLOv4结果所示。我们的贡献总结如下:
1. 我们开发了一种高效、强大的目标检测模型。它使每个人都可以使用1080 Ti或2080 Ti GPU来训练超快速和准确的目标检测器。
2. 在检测器训练期间,我们验证了最先进的Bag-of-Freebies和Bag-of-Specials检测方法的影响。
3. 我们修改最先进的方法,使其更高效,适合单个GPU训练,包括CBN [89]、PAN [49]、SAM [85]等。
现代检测器通常由两部分组成,一个是在ImageNet上预先训练的骨干(backbone),另一个是用于预测物体的类和边界框的头部(head)。对于在GPU 平台上运行的检测器,其骨干可以是VGG [68]、ResNet [26]、ResNeXt [86]或DenseNe [30]。对于在CPU平台上运行的检测器,其骨干可以是SqueezeNet [31]、MobileNet [28、66、27、74]或ShuffleNet [97、53]。至于头部,通常分为两类,即one-stage目标检测器和two-stage目标检测器。最具代表性的two-stage目标检测器是R-CNN[19]系列,包括fast R-CNN[18],faster R-CNN[64],R-FCN[9]和Libra R-CNN[58]。也可以使two-stage目标检测器成为无锚(anchor-free)目标检测器,如RepPoints [87]。至于one-stage目标检测器,最具代表性的模型是YOLO[61、62、63]、SSD[50]和RetinaNet [45]。近年来,研制了无锚式one-stage目标检测器。此类检测器有CenterNet [13]、CornerNet [37、38]、FCOS [78]等。近年来开发的目标检测器通常在骨干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图(feature map)。我们可以称它为目标检测器的颈部(neck)。通常,颈部由几个自下而上的路径和几个自上而下的路径组成。配备此机制的网络包括Feature Pyramid Network(FPN)[44]、Path Aggregation Network(PAN) [49]、BiFPN [77]和NAS-FPN [17]。除了上述模型外,一些研究人员还强调直接构建一个新的骨干(DetNet [43],DetNAS [7])或新的完整模型(SpineNet [12],HitDetector [20])用于目标检测。
总之,普通目标检测器由几个部分组成:
通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。我们将这些方法称为“bag of freebies”,这些方法仅改变训练策略或仅增加训练成本。目标检测方法通常采用并符合bag of freebies定义的是数据扩增。数据扩增的目的是增加输入图像的可变性,使设计的目标检测模型对从不同环境获得的图像具有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据扩增方法,它们肯定有利于目标检测任务。在处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,我们添加随机缩放、裁剪、翻转和旋转。
上面提到的数据扩增方法是所有像素的调整,并保留调整后区域中的所有原始像素信息。此外,一些从事数据扩增的研究人员强调模拟目标遮挡问题。他们在图像分类和目标检测方面取得了良好的效果。例如,随机擦除(random erase) [100]和CutOut [11]可以随机选择图像中的矩形区域并填充随机或互补的零值(a random or complementary value of zero)。至于hide-and-seek [69] 和grid mask [6],它们随机或均匀地选择图像中的多个矩形区域,并将其替换为零。如果类似的概念应用于feature maps,则有DropOut [71]、DropConnect [80]和DropBlock [16] 方法。此外,一些研究人员提出了将多个图像结合在一起执行数据扩增的方法。例如,MixUp [92]使用的两个图像是以不同的系数比率倍增和叠加(multiply and superimpose),然后以此叠加比率调整标签。至于CutMix [91],它是将裁剪的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除上述方法外,风格转换GAN(style transfer GAN)[15]还用于数据扩增,使用这种方法可以有效地减少CNN学到的纹理偏差。
与上述各种方法不同,其他一些bag of freebies方法专门用于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个很重要的问题是,不同类之间的数据不平衡问题,这个问题往往通过hard negative example mining [72]或two-stage目标检测器中的online hard example mining [67]来解决。但example mining方法不适用于one-stage目标检测器,因为这种检测器属于密集预测架构。因此,Lin等人[45]提出了解决不同类别之间存在的数据不平衡问题的focal损失问题。另一个非常重要的问题是,很难表达不同类别与one-hot硬编码的联系程度。在执行标签时,通常使用此表示方案。[73]中提出的标签平滑是将硬标签转换为软标签进行训练,这将使模型更加鲁棒。为了获得更好的软标签,Islam等人[33]引入了知识蒸馏的概念来设计标签细化网络。
bag of freebies的最后一个是边界框(Bounding Box , BBox)回归的目标函数。传统的目标检测器通常使用均值方误差(Mean Square Error, MSE)直接对 BBox 的中心点坐标以及高度和宽度执行回归,即或左上点和右下角点,即 。对于基于锚的方法,它是估计相应的偏移量,例如和。然而,直接估计BBox的每个点的坐标值是将这些点视为独立的变量,但实际上没有考虑目标本身的完整性。为了更好地处理这一问题,一些研究人员最近提出了IoU损失[90],将预测的BBox区域和真值BBox区域的覆盖范围考虑在内。IoU 损失计算过程将通过执行带有真值的IoU,然后将生成的结果连接到整个代码,触发BBox的四个坐标点的计算。由于IoU是一种缩放不变表示形式(a scale invariant representation),因此可以解决传统方法在计算的l1或l2损失时,损失会随着比例的增加而增加的问题。最近,一些研究人员继续改善IoU损失。例如,GIoU损失[65]是除覆盖区域外,还包括目标的形状和方向。他们建议找到最小区域BBox,可以同时覆盖预测的 BBox和真值BBox,并使用此BBox作为分母来替换最初用于IoU损失的分母。至于DIoU损失[99],它另外考虑物体中心的距离,另一方面,CIoU损失[99]同时考虑重叠区域,中心点之间的距离和纵横比。CIoU可以在BBox回归问题上实现更好的收敛速度和准确性。
对于那些插件模块(plugin modules)和后处理方法,它只增加少量的推理成本,但可以显著提高目标检测的准确性,我们称之为“bag of specials”。一般来说,这些插件模块用于增强模型中的某些属性,如增强感受野、引入注意力机制、增强特征集成能力等,后处理是筛选模型预测结果的方法。
可用于增强感受野的常见模块有SPP [25]、ASPP [5]和RFB [47]。SPP模块源自空间金字塔匹配(Spatial Pyramid Matching, SPM)[39],SPM的原始方法是将feature map拆分为多个d×d的等块,其中d可以是{1,2,3,…},从而形成空间金字塔,然后提取bag-of-word特征。SPP将SPM集成到CNN中,并使用最大池化(max-pooling)操作,而不是bag-of-word操作。由于He等人提出的SPP模块[25]将输出一维特征向量,因此无法应用于全卷积网络(Fully Convolutional Network, FCN)中。因此,在YOLOv3[63]的设计中,Redmon和Farhadi改进了SPP模块,使多个核大小为k×k的最大池化输出串联,其中k={1,2,3,…},步长等于1。在这种设计下,相对较大的k×k最大池化可有效增加骨干特征的感受野。添加改进版的SPP模块后,YOLOv3-608在MS COCO目标检测任务中将AP50提升了2.7%,但额外的计算代价为0.5%。ASPP [5]模块与改进的SPP模块之间操作的不同主要在于原来的核大小为k×k,最大池化步长等于1变成了3×3的核大小,膨胀比等于k,步长等于1的膨胀卷积(dilated convolution)操作。RFB模块是使用k×k核的多个膨胀卷积,膨胀比等于k,步长等于1,以获得比ASPP更全面的空间覆盖。RFB [47]只需花费额外7%的推理时间,就将SSD在MS COCO上的AP50增加5.7%。
目标检测中常用的注意力模块主要分为channel-wise attention和point-wise attention,这两个注意力模型的代表分别是Squeeze-and-Excitation(SE)[29]和空间注意力模块(Spatial Attention Module, SAM)[85]。虽然SE模块可以提高ResNet50在ImageNet图像分类任务中1%的top-1精度,而代价只增加计算工作量的2%,但在GPU上通常会增加10%左右,因此在移动设备中使用更合适。但对于SAM,它只需要额外支付0.1%的计算代价,并且它可以提高ResNet50-SE 在ImageNet 图像分类任务中 0.5% 的top-1精度。最重要的是,它根本不影响 GPU上的推理速度。
在特征集成方面,早期做法是使用跳过连接(skip connection)[51]或hyper-column [22]将低级物理特征集成到高级语义特征。由于FPN等多尺度预测方法已经普及,许多集成不同特征金字塔的轻量级模块被提出来。此类模块包括 SFAM [98]、ASFF [48]和BiFPN [77]。SFAM的主要思想是使用SE模块在多尺度串联feature map上执行channel-wise级重新加权(re-weighting)。至于ASFF,它使用softmax作为point-wise级重新加权,然后添加不同尺度的feature map。 在 BiFPN 中,提出多输入加权残差连接(multi-input weighted residual connections)执行scale-wise级重新加权,然后添加不同尺度的feature map。
在深度学习的研究中,有些人把精力放在寻找良好的激活函数上。良好的激活函数可以使梯度更有效地传播,同时也不会制造过多的额外计算代价。2010年,Nair and 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,它们是专门为量化网络(quantization networks)设计的。为了实现神经网络的自正则化(self-normalizing),提出了符合目标的SELU激活函数。需要注意的是,Swish 和 Mish 都是连续可微(continuously differentiable)的激活功能。
在基于深度学习的目标检测中常用的后处理方法是NMS,可用于过滤那些预测相同目标的坏BBox,并且仅保留响应较高的候选BBoxes。NMS尝试改进的方式与优化目标函数的方法一致。NMS提出的原始方法不考虑上下文信息,因此Girshick等人[19]在R-CNN中添加了分类置信度分数作为参考,并根据置信度分数的顺序,以高分到低分的顺序进行greedy NMS。至于soft NMS [1],它考虑的问题是目标物体的遮挡可能会导致在greedy NMS与IoU分数的置信度得分下降的问题。DIoU NMS [99]的开发人员的思维方式是在soft NMS的基础上将中心点距离的信息添加到BBox筛选过程中。值得一提的是,由于上述后处理方法都没有直接参考捕获的图像特征(none of above postprocessing methods directly refer to the captured image features),因此在后续开发无锚方法时不再需要后处理。
基本目标是加快神经网络的运行速度,在生产系统中优化并行计算,而不是低计算量理论指标(BFLOP)。我们提出了两个实时神经网络选项:
我们的目标是在输入网络分辨率、卷积层数、参数个数(filter size2 * filters * channel / groups)和图层输出数(过滤器)之间找到最佳平衡。例如,我们的大量研究表明,在 ILSVRC2012(ImageNet)数据集[10]上,CSPResNext50比 CSPDarknet53要好得多。但是,相反,在检测MS COCO数据集[46]上的目标方面,CSPDarknet53优于CSPResNext50。
下一个目标是选择其他模块,以增加感受野和不同骨干级别参数聚合的最佳方法:例如FPN、PAN、ASFF、BiFPN。
分类方面最佳的参考模型在检测器上并不总是最佳的。与分类器不同,检测器需要:
我们可以假设一个感受野大小的模型(具有较多的卷积层3×3)和更多的参数应作为骨干。表1显示了CSPReSNeXt50、CSPDarknet53和EfficientNet B3 的信息。CSPResNext50仅包含16个卷积层3×3、425×425感受野和20.6 M参数,而CSPDarknet53包含29个卷积层3×3、725×725感受野和27.6 M参数。这一理论论证,加上我们的大量实验,表明CSPDarknet53神经网络是两者中作为检测器骨干的最佳模型。
不同大小的感受野的影响总结如下:
我们在CSPDarknet53上添加SPP块,因为它显著增强(increase)了感受野,分离出最重要的上下文特征,并且几乎不降低网络操作速度。我们使用PANet作为不同检测器级别的参数聚合方法,而不是YOLOv3中使用的FPN。
最后,我们选择CSPDarknet53骨干、SPP附加模块、PANet路径聚合颈部和YOLOv3(基于锚)头部作为YOLOv4的框架。
今后,我们计划大幅扩展检测器Bag of Freebies(BoF)的含量,理论上可以解决一些问题,提高检测器的精度,并按顺序以实验方式检查每个功能的影响。
我们不使用Cross-GPU批处理规范化(Cross-GPU Batch Normalization)(CGBN或SyncBN)或昂贵的专业设备。这允许任何人在传统的图形处理器上复现我们最先进的结果,例如GTX 1080Ti或RTX 2080Ti。
为了改进目标检测训练,CNN通常使用以下内容:
至于训练激活函数,由于PReLU和SELU更难训练,并且ReLU6是专门为量化网络设计的,因此我们从候选列表中删除了上述激活函数。在再量化(reqularization)方法中,发布Drop-Block的人将该方法与其他方法进行了详细的比较,其正则化方法赢得了很多。因此,我们毫不犹豫地选择DropBlock作为我们的正则化方法。至于规范化方法的选择,由于我们专注于只使用一个GPU 的训练策略,因此不考虑syncBN。
为了使设计的检测器更适合于单GPU的训练,我们进行了如下其他设计和改进:
Mosaic是一种新的数据扩增方法,它混合了4个训练图像。因此,混合有4个不同的上下文,而CutMix只混合2个输入图像。这允许检测其正常上下文之外的目标。此外,批处理规范化计算每个层上4个不同图像的激活统计信息。这大大减少了对大型小批次大小的需求。
自对抗训练(SAT)也代表一种新的数据扩增技术,可在2个向前向后阶段运行。在第一阶段,神经网络更改原始图像而不是网络权重。通过这种方式,神经网络对自身执行对抗攻击,更改原始图像以创建图像上没有所需目标的欺骗。在第二阶段,神经网络以正常方式训练以检测修改后的图像上的目标。
CmBN表示CBN的修改版本,如图4所示,定义为Cross mini-Batch Normalization(CmBN)。这仅在单个批次处理中的小批次处理之间收集统计信息。
我们从spatial-wise注意力到point-wise注意力来修改SAM,并将PAN的shortcut连接改为串联,如图5和图6所示。
在本节中,我们将详细阐述YOLOv4的细节。
YOLOv4包括:
骨干:CSPDarknet53 [81]
颈部:SPP [25],PAN [49]
头部:YOLOv3 [63]
YOLOv4使用:
骨干的Bag of Freebies(BoF):CutMix 和Mosaic数据扩增、DropBlock正则化、类标签平滑
骨干的Bag of Specials(BoS):Mish激活、Cross-stage partial connections(CSP)、多输入加权残差连接(Multi-input weighted residual connections, MiWRC)
用于检测器的Bag of Freebies(BoF):CIoU 损失、CmBN、DropBlock 正化、Mosaic数据扩增、自对抗训练、消除网格灵敏度、对一个真值使用多个锚、 Cosine annealing scheduler [52]、最佳超参数、随机训练形状
用于检测器的Bag of Specials(BoS):Mish激活、SPP块、SAM块、PAN 路径聚合块、DIoU-NMS
我们测试不同改进训练的技术对分类器在ImageNet(ILSVRC 2012 val)数据集上准确性的影响,然后测试检测器在MS COCO(test-dev 2017)数据集上的准确性。
在ImageNet图像分类实验中,默认的超参数如下:训练步数为8,000,000;批次大小和小批量大小分别为128和32;采用多项式衰减学习率调度策略,初始学习速率为0.1; 预热步数为1000;动量和权重衰减分别设置为0.9和0.005。我们所有的BoS实验都使用与默认设置相同的超参数,在BoF实验中,我们增加了50%的训练步数。在BoF实验中,我们验证 MixUp、CutMix、Mosaic、Bluring data augmentation和标签平滑正则化方法。在BoS实验中,我们比较了LReLU、Swish和Mish激活函数的影响。所有实验都使用1080 Ti或2080 Ti GPU进行训练。
在MS COCO目标检测实验中,默认超参数如下:训练步数为500,500;采用步长衰减学习率调度策略,初始学习速率0.01,在400,000步和450,000步时乘以因子(factor)0.1;动量和权重衰减分别设置为0.9和0.0005。所有体系结构都使用单个GPU执行批处理大小为64的多级训练,而小批量处理大小为8或4 取决于体系结构和GPU内存限制。除了使用遗传算法进行超参数搜索实验外,所有其他实验都使用默认设置。遗传算法使用YOLOv3-SPP训练与GIoU损失和搜索300个epochs为min-val 5k集。采用搜索学习速率0.00261、动量0.949、分配真值的IoU阈值为0.213和遗传算法实验的损失规范化为0.07。我们已经验证了大量的BoF,包括网格灵敏度消除、mosaic数据扩增、IoU阈值、遗传算法、类标签平滑、交叉小批量规范化、自对抗性训练、cosine annealing scheduler、动态小批量大小、DropBlock、优化锚、不同类型的IoU损失。我们还对各种BoS 进行实验,包括Mish、SPP、SAM、RFB、BiFPN 和Gaussian YOLO [8]。对于所有实验,我们只使用一个GPU进行训练,因此不使用同步BN优化多个GPU 等技术。
首先,研究了不同功能对分类器训练的影响;具体来说,类标签平滑的影响,不同数据扩增技术的影响,bilateral blurring,MixUp,CutMix和Mosaic,如图7所示,以及不同激活的影响,如Leaky-ReLU(默认情况下),Swish和Mish。
在我们的实验中,如表2所示,分类器的精度通过引入以下功能得到提高,例如:CutMix和Mosaic数据扩增、类标签平滑和Mish激活。因此,我们的BoF骨干(Bag of Freebies)用于分类器训练包括以下内容:CutMix和Mosaic数据扩增和类标签平滑。此外,我们使用Mish激活作为补充选项,如表2和表3所示。
进一步研究涉及不同的Bag-of-Freebies(BoF-检测器)对检测器训练精度的影响,如表4所示。我们在不影响FPS的情况下研究那些能够提高检测器精度的不同功能,以此显著扩展了BoF列表:
进一步研究涉及不同的Bag-of-Specials(BoS-检测器)对检测器训练精度的影响,包括PAN、RFB、SAM、Gaussian YOLO(G)和ASFF,如表5所示。在我们的实验中,检测器在使用SPP、PAN和SAM时获得最佳性能。
进一步研究了不同骨干模型对检测器精度的影响,如表6所示。我们注意到,在检测器精度方面,具有最佳分类精度的模型并不总是最好的。
首先,虽然与CSPDarknet53模型相比,具有不同功能的CSPReSNeXt-50型号的分类精度较高,但CSPDarknet53模型在目标检测方面表现出更高的精度。
其次,将BoF和Mish用于CSPResNeXt50分类器训练,提高了其分类精度,但进一步将这些预先训练的权重应用于检测器训练,降低了检测器的精度。但是,将BoF和Mish用于CSPDarknet53分类器训练可提高分类器和检测器的准确性,后者使用此分类器预先训练的权重。最终结果是,骨干CSPDarknet53更适合检测器,而不是CSPResNeXt50。
我们观察到,CSPDarknet53模型表明,由于各种改进,提高了检测器精度的能力。
最后,分析了使用不同小批次大小的模型获得的结果,结果显示在表7中。从表7所示的结果中,我们发现,在添加了BoF和BoS训练策略后,小批次大小对检测器的性能几乎没有影响。这一结果表明,在引入BoF和BoS后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都可以只使用传统的GPU来训练出色的检测器。
图8显示了与其他最先进的目标检测器结果的比较。我们的YOLOv4位于帕雷托最佳曲线(Pareto optimality curve)上,在速度和精度方面优于最快、最精确的检测器。
由于不同方法使用不同体系结构的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。
我们提供最先进的检测器,比所有可用的替代检测器更快(FPS)和精度更高(MS COCO AP50…95和AP50)。所述检测器可在具有8-16 GB-VRAM的传统 GPU上进行训练和使用,这使得其广泛使用成为可能。基于锚的one-stage检测器的最初概念已证明其具有可行性。我们已经验证了大量的功能,并选择用这些功能,以提高分类器和检测器的准确性。这些功能可用作未来研究和发展的最佳实践。