YOLOv4: Optimal Speed and Accuracy of Object Detection
目录
YOLOv4: Optimal Speed and Accuracy of Object Detection
3.1. Selection of architecture
4.2. Influence of different features on Classifier training
摘要
据说有许多功能可以提高卷积神经网络(CNN)的准确性。需要在大数据集上对这些功能操作的组合进行实际测试,并对结果进行理论验证。某些操作可用于特定的模型,或仅用于小规模数据集;而一些操作,如 batch-normalization和 residual-connections,适用于大多数模型、任务和数据集。我们假设此类通用功能包括加权残差连接(WRC),跨阶段部分连接(CSP),交叉小批量归一化(CmBN),自对抗训练(SAT)和Mish激活。我们使用以下新功能:WRC,CSP,CmBN,SAT,Mish激活,Mosaic data augmentation,CmBN,DropBlock正则化和CIoU丢失,并结合其中的一些功能来实现最新的结果:Tesla V100上,MS COCO数据集的实时速度约为65 FPS,43.5%的AP(65.7% AP50) 。
1.引言
大多数基于CNN的物体检测器仅适用于推荐系统。 例如,通过慢速精确模型执行通过城市摄像机搜索免费停车位的过程,而发生车祸警告与快速不准确的模型有关。 提高实时物体检测器的准确性,不仅可以将它们用于提示生成推荐系统,还可以用于独立的过程管理和人工输入减少。 常规图形处理单元(GPU)上的实时对象检测器操作允许它们以可承受的价格进行大量使用。 最精确的现代神经网络不能实时运行,并且需要大量的GPU来进行大批量的训练。我们通过创建CNN来解决此类问题,该CNN在常规GPU上实时运行,并且训练仅需要一个常规GPU。(就是说以往的模型速度快的准确率不够,准确率高的速度不快)
这项工作的主要目标是设计生产系统中目标检测器的快速运行,并优化并行计算,而不是低计算量理论指标(BFLOP)。 我们希望可以轻松地训练和使用设计的对象。 例如,任何使用常规GPU进行训练和测试的人都可以获得实时,高质量且令人信服的对象检测结果,如图1所示的YOLOv4结果。我们的贡献总结如下:
1.我们开发了一种高效而强大的物体检测模型。 它使每个人都可以使用1080 Ti或2080 Ti GPU训练超快速和准确的物体检测器。(难怪我的1650训练不了)
2.我们在检测器训练期间,验证了state-of-the-art Bag-of-Freebies 和 Bag-of-Specials 检测方法的影响。
3.我们修改了最先进的方法,使它们更有效且更适合单个GPU训练,包括CBN [89],PAN [49],SAM [85]等。
2.相关工作
2.1目标检测模型
目前的目标检测器通常由两个部分组成,一个是在ImageNet上预先训练好的主干网络,另一个是用于预测对象类别和边界框的头部网络。对于在GPU平台上运行的检测器,其主干可以是VGG [68],ResNet [26],ResNeXt [86]或DenseNet [30]。 对于在CPU平台上运行的检测器,其主干可以是SqueezeNet [31],MobileNet [28、66、27、74]或ShuffleNet [97、53]。 至于头部网络,它通常分为两类,即one-stage object detector and two-stage object detector。最具代表的 two-stage object detector是R-CNN [19]系列,包括 fast R-CNN [18], faster R-CNN [64], R-FCN [9],and Libra R-CNN [58]。也可以使two-stage object detector成为无an anchor-free object detector,例如RepPoints [87]。对于 one-stage object detector,最具代表性的模型有YOLO [61, 62, 63], SSD [50], RetinaNet[45]。近年来,研制出了 anchor-free one-stageobject detectors,这类检测器有CenterNet[13] CornerNet[37,38]、FCOS[78]等。近年来开发的对象检测器通常在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图。 我们可以称其为目标检测器的颈部。 通常,颈部由几个自下而上的路径和几个自上而下的路径组成。(应该是上采样和下采样的组合,融合不同尺度的特征)配备此机制的网络包括 Feature Pyramid Network (FPN)[44],Path Aggregation Network (PAN) [49],BiFPN [77]和NAS-FPN [17]。除上述模型外,一些研究人员还强调直接构建用于对象检测的新主干(DetNet [43],DetNAS [7])或新的整个模型(SpineNet [12],HitDetector [20]。
综上所述,普通的物体检测器由以下几部分组成:
2.2. Bag of freebies(免费赠品)
通常,常规的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,并开发出更好的训练方法,以使目标检测器获得更好的精度而又不增加推理成本。我们称这些方法仅更改培训策略或仅增加培训费用作为“免费赠品”。数据增强是目标检测方法经常采用的并符合免费赠品定义的方法。数据增强的目的是为了增加输入图像的可变性,从而使设计的物体检测模型对从不同环境获得的图像具有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据扩充方法,它们绝对有利于目标检测任务。在处理光度失真时,我们调整图像的亮度,对比度,色相,饱和度和噪点。对于几何变形,我们添加了随机缩放,裁剪,翻转和旋转。
上述数据增强方法均为逐像素调整,保留调整区域内所有原始像素信息。此外,一些从事数据增强的研究人员将重点放在模拟物体遮挡问题上。在图像分类和目标检测方面取得了较好的效果。例如,random erase [100]和CutOut[11]可以随机选择图像中的矩形区域,并填充一个随机的或互补的值为零。对于hide-and-seek[69]和 grid mask[6],在一幅图像中随机或均匀地选择多个矩形区域,将其全部替换为零。如果将类似的概念应用于feature map,则有DropOut[71]、DropConnect[80]和DropBlock[16]方法。此外,一些研究人员提出了利用多幅图像共同进行数据增强的方法。例如,MixUp[92]使用两幅图像以不同的系数比进行相乘和叠加,然后根据叠加的系数比调整标签。CutMix[91]是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法外,我们还使用了style transfer GAN[15]来进行数据增强,这样的使用可以有效的降低CNN学习到的纹理偏差。
与上面提出的各种方法不同,其他一些免费赠品方法专用于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是,不同类之间存在数据不平衡的问题,而该问题在two-stage object detector中通常通过 hard negative example mining [72]or online hard example mining [67]解决。但是mining method 不适用于one-stage object detector,因为因为这种检测器属于密集预测架构。因此 Lin et al. [45]提出了焦点损失 focal loss ,以解决各种类别之间存在的数据不平衡问题。 另一个非常重要的问题是,很难用 one-hot hard representation来表达不同类别之间的关联度关系。这种表示方案经常在执行标签时使用。[73]中提出的标签平滑是将硬标签转换为软标签以进行训练,这可以使模型更健壮。 为了获得更好的软标签, Islam et al.[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 o fset}和{x top left offset, y top left offset, x bottom right offset, y bottom right offset}。但是,直接估计BBox的每个点的坐标值是将这些点视为独立变量,但实际上并没有考虑对象本身的完整性。 为了使这个问题得到更好的处理,一些研究人员最近提出了IoU损失[90],同时考虑了预测BBox面积的覆盖范围和ground truth BBox面积。IoU损失计算过程将通过与ground truth执行IoU来触发对BBox的四个坐标点的计算,然后将生成的结果连接成一个完整的代码。由于IoU是一个尺度不变的表示,它可以解决传统方法计算{x, y, w, h}的l1或l2损失时,损失会随着尺度的增大而增大的问题。最近,一些研究人员不断改善IOU损失。例如,GIoU损失[65]是除了覆盖范围外,还包括了物体的形状和方向。他们提出寻找能够同时覆盖预测BBox和ground truth BBox的最小面积BBox,并以此BBox作为分母来替代IoU loss中原来的分母。DIoU loss[99]同时考虑了物体的中心点距离和CIoU loss[99],同时考虑了重叠区域、中心点之间的距离和高宽比。在BBox回归问题上,CIoU可以取得更好的收敛速度和精度。
2.3. Bag of specials
对于那些只增加了少量推理成本却能显著提高目标检测精度的插件模块和后处理方法,我们称之为Bag of specials(“特殊包”)。一般来说,这些插件模块用于增强模型中的某些属性,如扩大接受域、引入注意机制、增强特征集成能力等,后处理是筛选模型预测结果的一种方法。
可以用来增强感受野的常用模块是SPP [25],ASPP [5]和RFB [47]。 SPP模块起源于空间金字塔匹配(SPM)[39],SPM的原始方法是将特征图分割为几个d×d个相等的块,其中d可以是{1,2,3,...},因此 形成空间金字塔,然后提取bag-of-word features。 SPP将SPM集成到CNN中并使用最大池操作而不是bag-of-word operation。由于He等人[25]提出的SPP模块输出的是一维特征向量,因此不能应用于全卷积网络(FCN)中。因此在YOLOv3设计[63]中,Redmon和Farhadi将SPP模块改进为最大池化输出的级联,其内核大小为k×k,where k = {1,5,9,13},stride等于1。在此设计下,一个较大的k×k 最大池化有效地增加了骨干特征的接受域。在添加了SPP模块的改进版本后,YOLOv3-608以增加0.5%计算的代价在MS COCO对象检测任务上提升了AP50 2.7%。ASPP[5]模块与改进后的SPP模块在运算上的差异主要来自于原始的k×k kernel size, max-pooling的stride等于1到几个3×3 kernel size,扩张比等于k,在扩张卷积运算中stride等于1。RFB模块是利用k×k核的几个扩张卷积,扩张比等于k, stride等于1,获得比ASPP更全面的空间覆盖。RFB[47]只需要额外7%的推断时间,就可以将MS COCO上的ap50 SSD提高5.7%。
在目标检测中常用的注意模块主要分为信道定向注意和点态注意,这两种注意模型的代表分别为 Squeeze-and-Excitation压缩激励[29]和空间注意模块Spatial Attention ModuleSAM[85]。尽管SE模块可以改善ResNet50的性能, ImageNet图像分类任务中排名前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模块对多尺度连接的feature map执行信道级重加权。至于ASFF,它使用softmax作为点级别调整,然后添加不同比例的特征图。在BiFPN中,提出了多输入加权残差连接进行尺度级重加权,然后添加不同尺度的特征图。
在深度学习的研究中,一些人把重点放在寻找好的激活函数上。一个好的激活函数可以使梯度更有效地传播,同时也不会造成太多的额外计算代价。2010年,Nair和Hinton[56]提出ReLU,实质上解决了传统tanh和sigmod型激活函数中经常遇到的梯度消失问题。随后又提出了解决梯度消失问题的LReLU[54]、PReLU[24]、ReLU6[28]、scale指数线性单元(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中加入了分类置信度评分作为参考,根据置信度评分的顺序,greedy NMS按照高分到低分的顺序执行。对于soft NMS[1],考虑了在IoU评分的greedy NMS中,由于对象的闭塞可能导致置信评分下降的问题。DIoU NMS[99]开发人员的思路是在soft NMS的基础上,将中心点距离信息添加到BBox筛选过程中。值得一提的是,由于以上所有的后处理方法都没有直接引用所捕获的图像特征,因此在后续无锚方法的开发中不再需要进行后处理。
3. Methodology
其基本目标是提高生产系统中神经网络的运行速度和并行计算的优化,而不是低计算量理论指标(BFLOP)。我们提供两种实时神经网络的选择:
对于GPU,我们使用少量的组(1-8)卷积层:CSPResNeXt50 / CSPDarknet53
对于VPU-我们使用分组卷积,但是我们避免使用 Squeeze-and-excitement (SE) blocks,具体包括以下模型:EfficientNet-lite / MixNet [76] / GhostNet [21] / MobileNetV3
3.1. Selection of architecture
我们的目标是在输入网络分辨率,卷积层数,参数数(过滤器大小2 *过滤器*通道/组)和层输出(过滤器)的数量之间找到最佳平衡。 例如,我们的大量研究表明CSPResNext50是在ILSVRC2012(ImageNet)数据集上的对象分类方面,与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,作为不同骨干层对不同检测器层的参数聚合方法。
Finally, we choose CSPDarknet53 backbone, SPP additional module, PANet path-aggregation neck, and YOLOv3(anchor based) head as the architecture of YOLOv4.
在未来,我们计划在检测器上显著扩展Bag of Freebies (BoF)的内容,理论上可以解决一些问题,提高检测器的准确率,并以实验的方式依次检查每个特征的影响。
我们不使用交叉gpu批处理归一化(CGBN或SyncBN)或昂贵的专用设备。这使得任何人都可以在GTX 1080Ti或RTX 2080Ti等传统图形处理器上复制我们的最新成果。
3.2. Selection of BoF and BoS
为了改进目标检测训练,CNN通常使用以下方法:
- 激活函数:ReLU, leaky-ReLU, parametric-ReLU,ReLU6, SELU, Swish, or Mish
- BBOX回归:MSE, IoU, GIoU,CIoU, DIoU
- 数据增强:CutOut, MixUp, CutMix
- 正则化方法:DropOut, DropPath [36],Spatial DropOut [79], or DropBlock
- 通过平均值和方差对网络激活进行标准化: Batch Normalization (BN) [32],Cross-GPU Batch Normalization (CGBN or SyncBN)[93], Filter Response Normalization (FRN) [70], orCross-Iteration Batch Normalization (CBN)[89]
- 跳跃连接:Residual connections, Weighted residual connections, Multi-input weighted residual connections, or Cross stage partial connections (CSP)
在训练激活函数方面,由于PReLU和SELU较难训练,而ReLU6是专门为量化网络设计的,因此我们将上述激活函数从候选列表中删除。在reqularization方法中,发布DropBlock的人将他们的方法与其他方法进行了详细的对比,他们的正则化方法获得了很大的成功。因此,我们毫不犹豫的选择了DropBlock作为我们的正则化方法。在归一化方法的选择上,由于我们关注的是只使用一个GPU的训练策略,因此没有考虑syncBN。
3.3. Additional improvements
为了使所设计的检测器更适合在单GPU上训练,我们进行了如下的额外设计和改进:
- 介绍了一种新的数据增强、拼接和自对抗训练方法。
- 应用遗传算法选择最优超参数。
- 我们修改了一些现有的方法,使我们的设计适合于有效的训练和检测,改进的SAM,改进的PAN,和交叉小批标准化(CmBN)
Mosaic提出了一种混合4张训练图像的数据增强方法,因此有4种不同的上下文融合,而CutMix只混合2个输入图像。这允许检测正常上下文之外的对象。此外,批处理归一化计算每层4张不同图像的激活统计。这大大减少了对大型迷你批处理的需求。
自对抗训练(SAT)也代表了一种新的数据增强技术,操作在两个向前后阶段。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己进行了对抗性的攻击,改变原始图像来制造图像上没有需要的对象的假象。在第二阶段,神经网络努力以正常的方式检测这个修改后的图像。
CmBN表示CBN的修改版本,如图4所示,定义为交叉小批标准化(CmBN)。这只收集单个批处理中的小批之间的统计信息。
我们将SAM从空间注意改为点态注意,将PAN的 shortcut connection改为concatenation,分别如图5和图6所示。
3.4. YOLOv4
在本节中,我们将详细介绍YOLOv4。YOLOv4包括:
- Backbone:CSPDarknet53 [81]
- Neck: SPP [25], PAN [49]
- Head: YOLOv3 [63]
YOLO v4使用策略:
- backbone:中的免费赠品包(BoF):CutMix和马赛克数据增强,DropBlock正则化,类标签平滑
- backbone:中的特价品:Mish激活、跨阶段部分连接(CSP)、多输入加权残差连接(MiWRC)
- detector中的免费赠品包: CIoU-loss, CmBN, DropBlock正则化,Mosaic数据增强,自对抗训练,消除网格敏感性,使用多个锚点对单一ground truth,余弦退火调度[52],最优超参数,随机训练形状
- detector中的特价品: Mish activation,SPP-block, SAM-block, PAN path-aggregation block,DIoU-NMS
4. Experiments
我们测试了不同训练改进技术对ImageNet (ILSVRC 2012 val)数据集分类器准确率的影响,以及对MS COCO (test-dev 2017)数据集检测器准确率的影响。
4.1. Experimental setup
在ImageNet图像分类实验中,默认超参数为:训练步骤为8,000,000;批大小为128,迷你批大小为32;采用多项式衰减学习率调度策略,初始学习率为0.1;热身步骤1000次;动量衰减和重量衰减分别设为0.9和0.005。我们所有的BoS(特价品)实验使用相同的超参数作为默认设置,而在BoF(免费品)实验中,我们增加了额外的50%的训练步骤。在BOF实验中,我们验证了混合、切割混合、马赛克、模糊数据增强和标签平滑正则化方法。在BoS实验中,我们比较了有效的LReLU,Swish, andMish激活函数。所有的实验都使用1080 Ti或2080 Ti GPU进行训练。
在MS COCO目标检测实验中,默认超参数如下:训练步骤为500500;采用步进衰减学习率调度策略,初始学习率为0.01,在40万步和45万步分别乘以因子0.1;动量衰减和权重衰减分别设为0.9和0.0005。所有架构都使用单一GPU在64个批处理的情况下进行多尺度训练,而迷你批处理为8或4取决于架构和GPU内存的限制。除超参数搜索实验使用遗传算法外,其他实验均使用默认设置。遗传算法使用YOLOv3-SPP训练GIoU损失,最小5k集搜索300个epoch。遗传算法实验采用搜索学习率0.00261,动量0.949,IoU阈值分配ground truth 0.213, loss normalizer 0.07。我们验证了大量的BoF,包括网格灵敏度消除、马赛克数据增强、IoU阈值、遗传算法、类标签平滑、交叉小批标准化、自对抗训练、余弦退火调度、动态小批大小、DropBlock、Optimized Anchors、不同类型IoU损失。我们还在各种BoS上进行了实验,包括Mish, SPP, SAM, RFB, BiFPN,以及Gaussian YOLO[8]。在所有实验中,我们只使用一个GPU进行训练,所以没有使用syncBN等优化多个GPU的技术。
4.2. Influence of different features on Classifier training
首先,研究了不同特征对分类器训练的影响;具体来说,类标签平滑的影响,不同数据增强技术、双边模糊、混合、CutMix和马赛克的影响,如Fugure 7所示,以及不同激活的影响,如Leaky-ReLU(默认)、Swish和Mish。
在我们的实验中,如表2所示,通过引入诸如CutMix和马赛克数据增强、类标签平滑和Mish激活等特征,分类器的准确率得到了提高。结果,我们用于分类器训练的BOF骨干(免费赠品包)包括以下内容:CutMix和Mosaic数据的增强和类标签平滑。此外,我们使用Mish激活作为补充选项,如表2和表3所示。