YOLOv4: 目标检测的最佳速度和精度
论文地址
代码
据说有很多功能可以提高卷积神经网络(CNN)的准确性。在大型数据集上对这些特征的组合进行实际测试,并对结果进行理论证明是必要的。某些功能仅在某些模型上运行,并且仅在某些问题上运行,或者仅在小型数据集上运行。而一些特性,如批处理规范化和调整大小连接,则适用于大多数模型、任务和数据集。我们假设这些通用特征包括加权剩余连接(WRC)、跨阶段部分连接(CSP)、跨小批量规范化(CmBN)、自对抗训练(SAT)和Mish激活。我们使用了新功能:WRC、CSP、CmBN、SAT、误激活、马赛克数据增强、CmBN、DropBlock正则化和CIoU丢失,并将其中一些功能结合起来,以达到最新的结果:43.5%AP(65.7%AP 50)用于MS COCO数据集,在Tesla V100上以65 FPS的实时速度。
大多数基于cnn的对象检测器主要只适用于推荐系统。例如,通过城市摄像机搜索免费停车位是由低精度模型执行的,而汽车碰撞警告则与高精度模型相关。提高实时对象检测器的准确性,不仅可以将其用于提示生成推荐系统,还可以用于独立的过程管理和减少人工输入。常规图形处理单元(GPU)上的实时对象检测器操作允许以它们可承受的价格大量使用。最精确的现代神经网络不能实时运行,需要大量的gpu来进行小批量的训练。我们通过创建一个在传统GPU上实时运行的CNN来解决这些问题,而训练只需要一个传统GPU。
这项工作的主要目标是设计生产系统中目标检测器的快速运行速度并优化并行计算,而不是降低计算量理论指标(BFLOP)。我们希望设计的对象可以很容易地训练和使用。例如,任何使用传统GPU进行训练和测试的人都可以实现实时、高质量、令人信服的目标检测结果,如图1所示的YOLOv4结果。我们的贡献总结如下:
现代检测器通常由两部分组成,一个是在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]。
综上所述,一个普通的物体探测器由几个部分组成:
(关于Bag of freebies大概是指: 即在不改变模型结构并且不改变损失函数的情况下,不牺牲前向传播时间,将mAP提升)
通常,传统的目标探测器是离线训练的。因此,研究人员总是希望利用这一优势,开发出更好的训练方法,使目标探测器在不增加推理成本的情况下获得更高的精度。我们把这些只会改变培训策略或只会增加培训成本的方法称为“免费包(Bag of freebies)”。对象检测方法通常采用的是数据扩充,它满足了免费包的定义。数据扩充的目的是增加输入图像的可变性,使所设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性。例如,光度畸变和几何畸变是两种常用的数据增强方法,它们肯定有利于对象检测任务。在处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何分布,我们加入随机缩放、裁剪、翻转和反旋转。
上述数据增强方法均为像素级调整,并保留调整区域内的所有原始像素信息。此外,一些从事数据扩充的研究人员把重点放在模拟对象遮挡问题上。在图像分类和目标检测方面取得了较好的效果。例如,随机擦除[100]和CutOut [11]可以随机选择图像中的矩形区域并填充随机值或零的互补值。至于 hide-and-seek(69)和 grid mask(6),它们随机或均匀地选择图像中的多个矩形区域,并将它们替换为全部零。如果将类似的概念应用到特征地图,则有DropOut[71]、DropConnect[80]和DropBlock[16]方法。此外,一些研究者提出了将多幅图像结合在一起进行数据增强的方法。例如,MixUp [92]使用两个图像以不同的系数比率进行乘法和叠加,然后使用这些叠加比率调整标签。 CutMix[91]是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法外,还使用style transfer GAN[15]进行数据扩充,这样可以有效减少CNN学习到的纹理偏差。
与上面提出的各种方法不同,其他一些免费赠品方法专用于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类之间存在数据不平衡的问题,这一问题通常通过两级对象检测器中的难例负样本挖掘[72]或在线难例挖掘[67]来解决。但是示例挖掘方法不适用于单阶段目标检测器,因为这种检测器属于密集预测架构。因此,Lin等人提出了focal loss来处理各个类之间存在的数据不平衡问题。另一个非常重要的问题是,很难用独热硬编码表示来表达不同类别之间的关联度的关系。进行标注时经常使用此表示方案。文[73]中提出的标签平滑是将硬标签转化为软标签进行训练,使模型更加健壮。为了获得更好的软标签,Islam等人[33]引入了知识蒸馏的概念来设计标签细化网络。
最后一包免费赠品是边界框(BBox)回归的目标函数。传统的目标检测器通常采用均方误差(MSE)方法对BBox的中心点坐标和高、宽进行回归。对于基于锚的方法,是对相应偏移量的估计。但是,直接估计BBox的每个点的坐标值是将这些点视为自变量,但实际上并没有考虑对象本身的完整性。为了更好地处理这个问题,一些研究人员最近提出了IoU损失[90],将预测BBox区域的覆盖范围和地面真实BBox区域纳入考虑范围。IoU损耗计算过程将触发BBox的四个坐标点的计算,执行IoU并将生成的结果连接成一个完整的代码。由于IoU是尺度不变的表征,它可以解决传统方法在计算{x, y, w, h}的l1或l2损失时,损失会随着尺度的增大而增大的问题。最近,一些研究人员继续改善IoU损失。例如,GIoU loss[65]除了覆盖区域外,还包括了对象的形状和方向。他们建议找到可以同时覆盖预测的BBox和地面真值BBox的最小面积BBox,并使用该BBox作为分母来代替最初用于IoU损失的分母。对于DIoU loss[99],它额外考虑了物体中心的距离,而CIoU loss[99]则同时考虑了重叠区域、中心点之间的距离和纵横比。对于BBox回归问题,CIoU具有更好的收敛速度和精度。
对于那些只增加少量推理成本,却能显著提高对象检测准确性的插件模块和后处理方法,我们称之为“特价包(Bag of specials)”。一般而言,这些插件模块用于增强模型中的某些属性,例如扩大感受野,引入注意力机制或增强特征集成能力等,而后处理是用于筛选模型预测结果的方法。
可以用来增强感受野的常用模块是SPP [25],ASPP [5]和RFB [47]。SPP模块源自空间金字塔匹配(SPM)[39]。SPM的原始方法是将特征图划分为几个 d × d d × d d×d个相等的块,其中 d d d可以为{ 1 , 2 , 3 , . . . 1,2,3,... 1,2,3,...},从而形成空间金字塔,然后提取词袋特征。SPP将SPM集成到CNN中,并使用max-pooling操作代替bag-of-word操作。由于He等人提出的SPP模块, [25]将输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3 [63]的设计中,Redmon和Farhadi将SPP模块改进为卷积核核大小为 k × k k×k k×k的最大池化输出的级联,其中 k = 1 , 5 , 9 , 13 k = {1,5,9,13} k=1,5,9,13,步幅等于1。在本设计中,较大的 k × k k×k k×k最大池化有效地增加了主干特征的感受野。在添加了改进版本的SPP模块后,在MS COCO对象检测任务中,YOLOv3-608以0.5%的额外计算量将 A P 50 AP_{50} AP50提升了2.7%。ASPP[5]模与改进的SPP模在运算上的区别主要在于原 k × k k×k k×k卷积核大小、最大步长池等于1, 现在是使用几个 3 × 3 3×3 3×3卷积核大小、膨胀比等于k、膨胀卷积运算步长等于1。RFB模块将使用多个 k × k k×k k×k大小的膨胀卷积,膨胀比等于k,步幅等于1,来获得比ASPP更全面的空间覆盖。RFB[47]只需额外花费7%的推断时间,即可使MS COCO上SSD的 A P 50 AP_{50} AP50增加5.7%。
在目标检测中常用的注意模块主要分为通道注意和点注意,这两种注意模型的代表分别是挤压和激发(SE)[29]和空间注意模块(SAM)[85]。虽然SE模块可以提高ResNet50在ImageNet图像分类任务中的能力1%top-1的精度,只需增加2%的计算量,但在GPU上通常会增加10%左右的推理时间,因此更适合在移动设备中使用。但对于SAM,只需额外支付0.1%的计算费用,就可以在ImageNet图像分类任务中提高ResNet50 SE 0.5%的top-1精度。最重要的是,它完全不影响GPU的推理速度。
在特征融合方面,早期的实践是使用skip connection[51]或hyper column[22]将低级物理特征集成到高级语义特征。随着FPN等多尺度预测方法的流行,人们提出了许多融合不同特征金字塔的轻量级预测模块。这类模块包括SFAM[98]、ASFF[48]和BiFPN[77]。SFAM的主要思想是利用SE模块在多尺度连接的特征图上执行信道级的权重重分配。对于ASFF,它使用softmax作为点向水平重加权,然后添加不同尺度的特征图。在BiFPN中,提出了多输入加权剩余连接来执行按比例的水平重加权,然后添加不同比例的特征图。
在深度学习的研究中,一些人把重点放在寻找好的激活函数上。一个好的激活函数可以使梯度更有效地传播,同时也不会造成过多的计算开销。2010年,Nair和Hin- ton[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,它可以用来过滤那些对同一对象预测不佳的bbox,只保留响应度较高的候选bbox。NMS试图改进的方法与优化目标函数的方法是一致的。NMS提出的原始方法不考虑上下文信息,因此Girshick等人[19] 在R-CNN中加入分类置信度得分作为参考,根据置信度得分的顺序,贪婪的NMS按照从高分到低分的顺序进行。对于soft NMS[1],它考虑了对象的遮挡可能导致带IoU分数的贪婪NMS的置信度分数下降的问题。DIoU NMS[99]开发者的思路是在soft NMS的基础上,在BBox筛选过程中加入中心点距离信息。值得一提的是,由于以上的后处理方法都没有直接引用捕获的图像特征,因此在无锚方法的基础开发中不再需要后处理。
其基本目标是神经网络在生产系统中的快速运行和并行计算的优化,而不是低计算量理论指标(BFLOP)。我们提出了实时神经网络的两种选择:
我们的目标是在输入网络分辨率、卷积层数、参数量(滤波器尺寸2滤波器信道/组)和层输出数(滤波器)之间找到最佳平衡。例如,我们的大量研究表明,在ILSVRC2012 (ImageNet)数据集[10]上的对象分类方面,CSPResNext50要比CSPDarknet53好得多。然而,相反地,在检测MS COCO数据集[46]上的对象方面,CSPDarknet53比CSPResNext50更好。
下一个目标是针对不同的检测器级别从不同的主干级别中选择其他块来增加接收场和参数聚集的最佳方法: FPN,PAN,ASFF,BiFPN。
对于分类来说是最优的参考模型对于检测器来说并不总是最优的。与分类器相比,检测器需要以下特性:
假设我们可以选择一个感受野较大(卷积层数为3×3)且参数较多的模型作为主干。表1显示了CSPResNeXt50、CSPDarknet53和Effi- cientNet 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或SyncBN)或昂贵的专用设备。这使得任何人都可以在传统的图形处理器(如GTX 1080Ti或RTX)上重现我们最先进的结果2080 ti。
为了提高目标检测训练,CNN通常使用以下方法:
至于训练激活函数,由于PReLU和SELU较难训练,并且ReLU6是专门为量化网络设计的,因此我们从候选列表中删除了上述激活函数。在重新规范化方法中,发表DropBlock的人详细比较了他们的方法和其他方法,他们的正则化方法赢得了很多。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。对于归一化方法的选择,由于我们关注的是只使用一个GPU的训练策略,所以没有考虑syncBN。
为了使设计的检测器更适合于单GPU上的训练,我们做了如下的附加设计和改进:
马赛克表示一种新的数据增强方法,该方法混合了4个训练图像。因此,4个不同的上下文被混合,而CutMix只混合2个输入图像。这允许检测正常上下文之外的对象。此外,批量归一化从每层的4张不同图像中计算激活统计信息。这大大减少了mini-batch size的大小。
自对抗训练(SAT)也代表了一种新的数据增加技术,在两个前后阶段操作。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己进行了一次对抗性的攻击,改变了原始图像,从而制造出图像上没有所需对象的欺骗。在第二阶段,神经网络以正常的方式对这个修改后的图像进行检测。
CmBN表示CBN修改版本,如图4所示,定义为跨小批量规范化(CmBN)。这只在单个批内的小批之间收集统计信息。我们将SAM从空间注意修改为点注意,并替换PAN到连接的快捷连接,分别如图5和图6所示。
在本节中,我们将详细介绍YOLOv4。
YOLOv4包括:
YOLO v4使用:
在ImageNet(ILSVRC 2012 val)数据集上测试了不同训练改进技术对分类器精度的影响,然后在MS-COCO(test dev 2017)数据集上测试了检测器的精度。
在ImageNet图像分类实验中,默认的超参数如下:训练步骤为8000000。批大小和迷你批大小分别为128和32。采用多项式衰减学习率调度策略,初始学习率为0.1。热身(warm-up)步长1000;动量和权重衰减分别设置为0.9和0.005。我们所有的BoS实验都使用与默认设置相同的超参数,在BoF实验中,我们添加了50%的额外训练步骤。在BoF实验中,我们验证了MixUp、CutMix、Mosaic、模糊数据增强和标签平滑正则化方法。在BoS实验中,我们测试了flrelu、Swish和mish激活功能的效果。所有实验训练都是使用单个1080Ti 或 2080Ti。
在MS-COCO目标检测实验中,默认超参数如下:训练步数为500500;采用阶跃衰减学习率调度策略,初始学习率为0.01,在40万步和45万步分别乘以系数0.1;动量衰减和权重衰减分别设定为0.9和0.0005。所有体系结构都使用一个单一的GPU来执行64批大小的多尺度训练,而最小批大小是8或4取决于体系结构和GPU内存限制。除了使用遗传算法进行超参数搜索实验外,其他所有实验均使用默认设置。遗传算法使用YOLOv3-SPP训练GIoU损失并搜索300个epoch的min-val 5k sets。对于遗传算法实验,我们采用搜索的学习率0.00261,动量0.949,IoU阈值来分配地面实况0.213,并使用损失归一化器0.07。我们已经验证了大量的BoF,包括网格敏感度消除、马赛克数据增强、IoU阈值、遗传算法、类标签平滑、交叉小批量规范化、自对抗训练、余弦退火调度、动态小批量、DropBlock、优化锚、不同类型的IoU损失。我们还对各种BoS进行了实验,包括Mish,SPP,SAM,RFB,BiFPN和高斯YOLO [8]。对于所有的实验,我们只使用一个GPU进行训练,所以像syncBN这样的优化多个GPU的技术并没有被使用。
首先,我们研究了不同特征对分类器训练的影响;具体来说,如图7所示,类标签平滑的影响,不同数据增强技术的影响,双边模糊、混合、剪切和镶嵌,以及不同激活的影响,Leaky-ReLU(默认)、Swish和Mish。
在我们的实验中,如表2所示,通过引入CutMix和Mosaic数据增强、类标签平滑和错误激活等特性,提高了分类器的准确性。因此,我们用于分类器训练的BoFbackbone(免费包)包括以下内容:CutMix和Mosaic数据增强和类标签平滑。此外,我们使用Mish激活作为补充选项,如表2和表3所示。
进一步研究了不同的免费包(BoF检测器)对检测器训练精度的影响,如表4所示。通过研究在不影响FPS的情况下提高检测器精度的各种功能,我们大大扩展了BoF列表:
进一步的研究涉及不同的特殊包(BoS检测器)对检测器训练精度的影响,包括PAN、RFB、SAM、Gaussian YOLO(G)和ASFF,如表5所示。在我们的实验中,当使用SPP、PAN和SAM时,检测器的性能最佳。
进一步研究不同骨架模型对检测精度的影响,如表6所示。我们注意到,就检测器的精度而言,具有最佳分类精度的模型并不总是最佳的。
首先,尽管不同特征训练的CSPResNeXt-50模型的分类精度比CSPDarknet53模型高,但CSPDarknet53模型在目标检测方面显示出更高的精度。其次,使用BoF和Mish进行CSPResNeXt50分类器训练可以提高其分类精度,但进一步应用这些预先训练的权重进行检测器训练会降低检测器的精度。然而,在CSPDarknet53分类器训练中,使用BoF和Mish的方法提高了分类器和使用预先训练权重的检测器的准确性。结果表明,基干CSPDarknet53比CSPResNeXt50更适合于检测器。
我们观察到,CSPDarknet53模型由于各种改进而显示出更大的提高检测器准确度的能力。
最后,我们对不同小批尺寸训练模型的结果进行了分析,结果如表7所示。从表7的结果可以看出,加入BoF和BoS训练策略后,小批量尺寸对检测器的性能几乎没有影响。该结果表明,在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都只能使用传统的GPU来训练优秀的检测器。
得到的结果与其他最先进的对象探测器的比较显示在图8中。我们的YOLOv4位于Pareto最优曲线上,在速度和精度方面都优于最快和最精确的检测器。
由于不同的方法使用不同体系结构的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 A P 50 … 95 AP_{50…95} AP50…95和 A P 50 AP_{50} AP50)。所描述的检测器可以在8-16GB-VRAM的传统GPU上训练和使用,这使得它的广泛应用成为可能。单阶段基于anchor的检测器的已经证明了它的可行性。我们已经验证了大量的特征,并选择使用这些特征来提高分类器和检测器的准确性。这些特性可以作为未来研究和开发的最佳实践。