YOLOv4: Optimal Speed and Accuracy of Object Detection学习笔记
摘要
据说有大量功能可以提高卷积神经网络 (CNN) 的准确性。需要在大型数据集上对这些特征的组合进行实际测试,并对结果进行理论证明。某些功能专门针对某些模型和某些问题专门操作,或仅针对小规模数据集;而一些特性,例如批量归一化和残差连接,适用于大多数模型、任务和数据集。我们假设这些通用特征包括加权残差连接 (WRC)、跨阶段部分连接 (CSP)、交叉小批量标准化 (CmBN)、自我对抗训练 (SAT) 和 Mish 激活。我们使用新功能:WRC、CSP、CmBN、SAT、Mish 激活、Mosaic 数据增强、CmBN、DropBlock 正则化和 CIoU 损失,并结合其中一些实现最先进的结果:43.5% AP (65.7 % AP50) 用于 MS COCO 数据集,在 Tesla V100 上以 ~65 FPS 的实时速度。
1.介绍
作者指出目前基于CNN的目标检测器在很大程度上仅适用于推荐系统(例如,通过城市摄像机搜索空闲停车位是由慢准确模型执行的,而汽车碰撞警告则与快速不准确模型有关)。目前最准确的现代神经网络都不是实时运行的,而且需要大量的GPU来进行大规模mini-batch的训练。作者通过创建一个在传统GPU上实时运行的CNN来解决这些问题,而且训练的时候只需要一个GPU。这项工作的主要目标是设计生产系统中目标检测器的快速运行速度并优化并行计算,而不是低计算量理论指标(BFLOP)。作者希望这个被设计出来的系统可以很容易的进行训练和测试(比如每个人都可以使用传统的GPU,例如1080Ti和2080Ti进行训练和测试然后达到实时的、高质量的、令人满意的目标检测效果)。
作者总结了所做的贡献,如下:
开发了一个高效而强大的对象检测模型。它使每个人都可以使用 1080 Ti 或 2080 Ti GPU 来训练超快速和准确的目标检测系统。
验证了在检测器训练期间最先进的 Bag-of-Freebies 和 Bag-of-Specials 目标检测方法的影响。
修改了最先进的方法,使它们更有效,更适合单 GPU 训练,包括 CBN 、PAN 、SAM 等。
2.相关工作
2.1目标检测模型
现代检测器通常由两部分组成,一个在 ImageNet 上预训练的骨干网络和一个用于预测对象的类别和边界框的部分。对于那些在 GPU 平台上运行的检测器,它们的主干可以是 VGG 、ResNet 、ResNeXt 或 DenseNet 。对于那些在 CPU 平台上运行的检测器,它们的主干可以是 SqueezeNet 、MobileNet 或 ShuffleNet 。对于预测部分,大体可以分为两种,一种是单阶段的,另一种是两阶段的目标检测系统。
两阶段的目标检测系统中最具代表的是R-CNN系列,包括fast R-CNN,faster R-CNN,R-FCN,和libra R-CNN。当然也可以将两级对象检测器制作为无锚对象检测器,例如 RepPoints。
一阶段目标检测系统最具代表的是YOLO,ssd和RetinaNet。
近年来,也有人开发了无锚框的一阶段目标检测器。这类检测器有CenterNet 、CornerNet、FCOS等。
近年来开发的目标检测器通常在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图(这些层我们通常称之为目标检测器的颈部)。通常颈部由几个自下而上和自上而下的路径组成,配备这种机制的网络包括特征金字塔网络 (FPN) 、路径聚合网络 (PAN) 、BiFPN 和 NAS-FPN。
除了上述模型,一些研究人员将重点放在直接构建新的主干(DetNet 、DetNAS )或新的整体模型(SpineNet 、HitDetector )来进行目标检测。
综合起来说就是,一个普通的目标检测系统由一下几部分组成;
- 输入:图片,经过图像金字塔处理过的图片等等
- 骨干网络:VGG16 , ResNet-50 , SpineNet , EfficientNet-B0/B7 , CSPResNeXt50 , Darknet-53等
- 颈部:
- 附加块:SPP , ASPP , RFB , SAM
- 路径聚合块:Fully-connected FPN, BiFPN , ASFF , SFAM
- 头部:
- 密集预测(单阶段):
- RPN , SSD , YOLO , RetinaNet (anchor based)
- CornerNet , CenterNet , MatrixNet , FCOS (anchor free)
- 稀疏预测(两阶段):
- Faster R-CNN, R-FCN, Mask RCNN (anchor based)
- RepPoints (anchor free)
2.2免费包
传统的物体检测器是离线训练的。因此,研究人员喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。我们将这些只改变训练策略或只增加训练成本的方法称为“免费赠品袋(免费包,Bag of freebies)”。目标检测方法通常采用并符合免费赠品袋定义的是数据增强。数据增强是为了增加输入数据的多样性,使得设计好的目标检测模型对不同环境输入的图像就有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据增强方法,它们绝对有利于目标检测任务(在处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,我们可以添加随机缩放、裁剪、翻转和旋转)。这些数据增强方法都是逐像素调增,调整区域内的像素信息都将被保留。
也有一些人专门研究模拟物体遮挡问题,在目标检测和图像分类问题上都取得了比较好的成绩。比如随机擦除和裁剪可以在一张图片上随机选择一些长方形区域然后填充随机的数字或者互补的零值。至于做迷藏(hide-and-seek)和网格编码(grid mask),它们在图片上均匀的选择长方形区域,然后把他们全部替换为零值。如果将类似的概念应用于特征图,则有 DropOut 、DropConnect 和 DropBlock 方法。也有人提出采用多张图像同时进行数据增强的办法:
MixUp 使用两个图像以不同的系数比率进行相乘和叠加,然后用这些叠加的比率调整原来的标签。
CutMix 将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。
除了上述方法外,风格迁移 GAN 也用于数据增强,这种方法可以有效减少 CNN 学习到的纹理偏差。
与上面提出的各种方法不同,其他一些免费赠品方法专门用于解决数据集中的语义分布可能存在偏差的问题。在处理语义偏差问题的时候,一个重要的问题就是在不同的类之间存在着数据不平衡的问题。这个问题经常在两阶段目标检测中通过难例挖掘或者在线难例挖掘来解决。这种方法不适用于单阶段目标检测系统中,所以 Linet al提出焦点损失的办法来解决这个问题。另一个很重要的问题是,很难用 one-hot hard representation 来表达不同类别之间的关联程度的关系(执行标注时经常使用这种方案)。 ???(【73】)中提出的标签平滑将硬标签转换为软标签进行训练,可以使模型更加健壮。为了获得更好的软标签,Islam 等人引入知识蒸馏的概念来设计标签细化网络。
最后一个免费包是Bounding Box(BBox)回归的目标函数。传统的目标检测算法采用均方误差对边界框的中心坐标和宽高进行回归,或者回归边界框的左上角和右下角的坐标。如果是基于锚框的方法,那么它就估计对应的偏移量。直接估计边界框的坐标就直接把这些坐标点当成了自变量,没有考虑到事物的完整性。为了更好地处理这个问题,一些研究人员最近提出了 IoU 损失,它考虑了预测边界框区域和真实对象边界框区域的覆盖范围。因为IoU是一种尺度不变的表示,它可以解决传统方法在计算{x,y,w,h}的l1或l2损失时,损失会随着尺度的增加而增加的问题。当然也有人在不断的改进Iou损失。GIoU loss 是除了覆盖区域之外还包括对象的形状和方向。他们提出找到能够同时覆盖预测边界框和 真实边界框的最小区域 边界框,并以此 作为分母来代替原本用于 IoU 损失 的分母。至于DIoU损失,它额外考虑了物体中心的距离,而CIoU损失同时考虑了重叠区域、中心点之间的距离和纵横比。 CIoU在边界框回归问题上可以达到更好的收敛速度和准确率。
2.3特赠包
对于那些只增加少量推理成本但可以显着提高物体检测精度的插件模块和后处理方法,我们称之为“特色包”。一般来说,这些插件模块是为了增强模型中的某些属性,比如扩大感受野,引入注意力机制,或者加强特征整合能力等,而后处理是一种筛选模型预测结果的方法。
可用于增强感受野的常见模块有SPP、ASPP和RFB。
SPP 模块起源于空间金字塔匹配(SPM),SPM 的原始方法是将特征图分割成几个 d × d 相等的块,其中 d 可以是{1, 2, 3, …},因此形成空间金字塔,然后提取词袋特征。SPP将SPM集成到CNN中,使用最大池化操作代替词袋操作。由于 He 等人提出的 SPP 模块将输出一维特征向量,这在全卷积网络(FCN)中应用是不可行的。因此在yolov3的设计中,原作者将SPP改进为最大池化输出的串联,内核大小为K x K,k={1, 5, 9, 13},步长为1。在这种设计下,相对较大的K x K池化层有效的增加了主干特征的感受野。在加入改进版的 SPP 模块后,YOLOv3-608 在 MS COCO 目标检测任务上将 AP50 提升了 2.7%,代价是额外计算增加了了 0.5%。
ASPP 与改进的SPP在操作上最大的不同在于原来的K x K内核的大小,最大池化的步长可以等于1到几个3 x 3内核大小,扩展比例可以等于k,而在空洞卷积操作中步长等于1。
RFB模块是利用k×k核的若干个空洞卷积,空洞率等于k,步长等于1,以获得比ASPP更全面的空间覆盖。 RFB 只需花费 7% 的额外推理时间即可将 MS COCO 上 SSD 的 AP50 提高 5.7%。
物体检测中经常用到的注意力模块主要分为channel-wise attention和pointwise attention,这两种注意力模型的代表是分别是Squeeze-and-Excitation(SE)和Spatial Attention Module(SAM)。虽然 SE 模块可以在 ImageNet 图像分类任务中将 ResNet50 的能力提高 1% top-1 准确率的同时仅增加 2% 的计算量,但在 GPU 上通常会增加约 10% 的推理时间,所以更适合用在移动设备上。对于SAM,它只需要0.1%的额外计算,就可以在ImageNet图像分类任务上提高ResNet50-SE 0.5%的top-1准确率。更重要的一点是,SAM完全不增加在GPU上面的推理速度。
在特征集成方面,早期的做法是使用跳过连接或者超列的方法将低级的物理特征集成到高级语义特征。由于FPN等多尺度预测方法的流行,人们提出了许多融合不同特征金字塔的轻量级模型。这些模型包括了SFAM,ASFF和BiFPN。
SFAM 的主要思想是使用 SE 模块对多尺度级联特征图执行通道级别重新加权;至于ASFF,它使用softmax作为point-wise level 重新加权,然后添加不同尺度的特征图;在 BiFPN 中,提出了多输入加权残差连接来执行 scale-wise level 重新加权,然后添加不同尺度的特征图。
在深度学习的研究中,也有很多人把注意力集中在寻找好的激活函数方面(一个好的激活函数可以使梯度更好的传播,而且还不会造成太多的计算成本)。2010 年,Nair 和 Hinton [56] 提出 ReLU 来解决传统 tanh 和 sigmoid 激活函数中经常遇到的梯度消失问题(随后,LReLU 、PReLU 、ReLU6 、Scaled Exponential Linear Unit (SELU) 、Swish 、hard-Swish和Mish 等,也被提出用于解决梯度消失问题)。LReLU和PReLU的主要目的是解决输出小于零时ReLU的梯度为零的问题。至于 ReLU6 和 hard-Swish,它们是专门为量化网络设计的。为了对神经网络进行自归一化,提出 SELU 激活函数。
基于深度学习的物体检测常用的后处理方法是NMS,可以用来过滤那些对同一物体预测不好的BBox,只保留响应更高的候选BBox。NMS 提出的原始方法没有考虑上下文信息,因此 Girshick 等人在R-CNN中增加了分类置信度得分作为参考,按照置信度得分的顺序,按照从高到低的顺序进行贪心NMS。至于soft NMS ,它考虑了在 IoU 分数的贪婪 NMS 中,物体的遮挡可能导致置信度得分下降的问题。DIoU NMS思路是在soft NMS的基础上,在BBox筛选过程中加入中心点距离的信息。由于上述后处理方法都不是直接参考捕获的图像特征,因此后续开发无锚方法时不再需要后处理。
3.方法
基本目标是神经网络的快速运行速度,在生产系统和并行计算的优化,而不是低计算量的理论指标(BFLOP)。作者提出了两种实时神经网络选项:
针对CPU,在卷积层中使用少量组(1 - 8):CSPResNeXt50 / CSPDarknet53
针对VPU, 使用分组卷积,但避免使用 Squeeze-and-excitement (SE) 块 - 具体而言,这包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3
3.1架构的选择
我们的目标是在输入网络分辨率、卷积层数、参数数量(滤波器大小2 * 滤波器 * 通道/组)和层输出数(滤波器)之间找到最佳平衡。
下一个目标是选择额外的块来增加感受野,并为不同的检测器级别从不同的主干级别选择参数聚合的最佳方法。
对分类最优的参考模型并不总是对检测器最优。与分类器相比,检测器需要以下几个特点:
更高的输入分辨率:用于检测更多的小目标
更多的层:更高的感受野可以覆盖增加的输入网络规模
更多的参数:提高模型在单个图像中检测多个不同尺寸对象的能力
不同尺寸下的感受野受到的影响如下:
扩大化目标大小---------感受野就可以看到整个目标对象
扩大网络规模------------允许看到目标周围的上下文信息
超越网络大小 ------------增加图像点和最终激活之间的连接数
然后在 CSPDarknet53 上添加了 SPP 模块,因为它可以增加感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度,同时使用 PANet 作为不同检测器级别的不同主干级别的参数聚合方法,而不是 YOLOv3 中使用的 FPN。最后的结果是选择 CSPDarknet53 骨干网、SPP 附加模块、PANet 路径聚合颈部和 YOLOv3(基于锚点)头作为 YOLOv4 的架构。
未来作者计划显着扩展Bag of Freebies(BoF)的检测器内容,理论上可以解决一些问题并提高检测器精度,并以实验的方式依次检查每个特征的影响。
作者指出yoloV4目标检测系统不吃显卡配置,不使用跨 GPU 批量标准化(CGBN 或 SyncBN)或昂贵的专用设备。这允许任何人在传统图形处理器上重现我们最先进的结果,例如图形处理器 GTX 1080Ti 或 RTX 2080Ti(不晓得笔记本的3050能不能跑动)。
3.2免费包与特赠包的选择
CNN常从以下几个方面来改进目标检测系统的训练效果:
激活函数,包括ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish;
边界框回归损失,包括MSE, IoU, GIoU, CIoU, DIoU;
数据增强,常用的有CutOut, MixUp, CutMix(剪切、混合、剪切混合);
正则化方法,通常有DropOut, DropPath, Spatial DropOut , DropBlock;
通过均值和方差对网络激活函数进行归一化,方法有批量归一化 (BN) 、跨 GPU 批量归一化(CGBN 或 SyncBN)、滤波器响应归一化 (FRN) 或交叉迭代批量归一化 (CBN);
跳过连接,常见的方法有残差连接、加权残差连接、多输入加权残差连接或跨级部分连接 (CSP)。
3.3其他的改进
为了使设计的检测器更适合在单 GPU 上训练,作者做了如下额外的设计和改进:
一种新的数据增强马赛克方法和自我对抗训练 (SAT);
使用遗传算法时选择最佳超参数(实验设置的时候会提到);
修改了一些现有的方法,使当前的设计适用于有效的训练和检测——修改的 SAM、修改的 PAN 和交叉小批量标准化 (CmBN);
Mosaic 表示是一种新的数据增强方法,它混合了 4 个训练图像,因此也混合了四种图像的上下文信息,而剪切混合数据增强方法只能混合两张输入的图片(后续我们是不是可以考虑将两个扩大成四个、八个等等)。这样做的好处就是允许检测其正常上下文之外的对象。此外,批量归一化从每层的 4 个不同图像计算激活统计信息。这显着减少了对大量 mini-batch 的需求。
自我对抗训练(SAT)也代表了一种新的数据增强技术,它在 2 个前向后向阶段中运行。在第一阶段,神经网络改变原始图像而不是网络权重。通过这种方式,神经网络对自身执行对抗性攻击,改变原始图像以创建图像上没有所需对象的欺骗。在第二阶段,训练神经网络以正常方式检测修改后的图像上的对象。
4.实验
4.1实验设置
在ImageNet图像分类实验中,默认的超参数为:训练步数为 8,000,000;批量大小和小批量大小分别为 128 和 32;采用多项式衰减学习率调度策略,初始学习率为0.1;预热步数为1000;动量和权重衰减分别设置为 0.9 和 0.005。所有的 BoS 实验都使用与默认设置相同的超参数,并且在 BoF 实验中,额外增加了 50% 的训练步骤。在 BoF 实验中,验证了 MixUp、CutMix、Mosaic、Bluring 数据增强和标签平滑正则化方法。在 BoS 实验中,比较了 LReLU、Swish 和 Mish 激活函数的效果。所有实验均使用 1080 Ti 或 2080 Ti GPU 进行训练。
在 MS COCO 目标检测实验中,默认超参数如下:训练步数为 500,500;采用阶梯衰减学习率调度策略,初始学习率为0.01,在400000步和450000步分别乘以0.1因子;动量和权重衰减分别设置为 0.9 和 0.0005。所有架构都使用单个 GPU 执行批量大小为 64 的多尺度训练,而 mini-batch 大小为 8 或 4 取决于架构和 GPU 内存限制。除超参数搜索实验使用遗传算法外,其他实验均使用默认设置。遗传算法使用 YOLOv3-SPP 进行 GIoU 损失训练并搜索 300 个 epoch 以找到 min-val 5k 集。实验中采用搜索学习率 0.00261、动量 0.949、分的 IoU 阈值 0.213 和遗传算法实验的损失归一化器 0.07。实验中验证了大量的 BoF,包括网格敏感性消除、马赛克数据增强、IoU 阈值、遗传算法、类标签平滑、交叉 mini-batch 归一化、自对抗训练、余弦退火调度器、动态 mini-batch 大小、DropBlock、Optimized锚点,不同类型的 IoU 损失。我们还对各种 BoS 进行了实验,包括 Mish、SPP、SAM、RFB、BiFPN 和 Gaussian YOLO 。对于所有的实验,我们只使用一个 GPU 进行训练,因此没有使用优化多个 GPU 的 syncBN 等技术。
4.2不同特征对目标分类训练的影响
首先,作者研究了不同特征对分类器训练的影响;具体来说,类标签平滑的影响、不同数据增强技术的影响、双边模糊、混合、裁剪 和 马赛克
实验证明通过引入诸如裁剪和马赛克数据增强、类标签平滑和 Mish 激活函数等功能可以提高图像分类的准确性。因此,作者用于分类训练的 BoF骨干网路(免费赠品袋)包括以下内容:裁剪 和 马赛克 数据增强以及类标签平滑。此外,作者使用 Mish 激活函数作为补充选项。
4.3不同特征对目标检测训练的影响
进一步的研究涉及不同免费包 (BoF-detector) 对目标检测训练精度的影响。
1)S :bx = σ(tx)+cx, by = σ(ty ) + cy ,其中 cx 和 cy 总是整数,在 YOLOv3 中用于评估目标对象的坐标,因此,对于接近 cx 或 cx + 1 值的 bx 值,需要极高的 tx 绝对值。作者通过将 sigmoid 乘以超过 1.0 的因子来解决这个问题,从而消除了无法检测到对象的网格的影响。
2)M : 马赛克数据增强 - 在训练期间使用 4 图像马赛克而不是单个图像
3)IT :IoU 阈值 - 对单个 ground truth IoU(真值,锚点)使用多个锚点 > IoU 阈值
4)GA :遗传算法 - 使用遗传算法在前 10% 时间段的网络训练期间选择最佳超参数
5)LS :类标签平滑 - 使用类标签平滑进行 sigmoid 函数激活
6)CBN :CmBN - 使用交叉小批量标准化(Cross mini-Batch Normalization) 在整个批次内收集统计信息,而不是在单个 mini-batch 内收集统计信息
7)CA :余弦退火调度器 - 在正弦训练期间改变学习率
8)DM :动态小批量大小 - 在小分辨率训练期间通过使用随机训练形状自动增加小批量大小
9)OA :优化的锚框 - 使用优化的锚点框进行512x512网络分辨率的训练
10)GIoU :CIoU, DIoU, MSE - 使用不同的损失算法进行边界框的回归
作者进一步的研究关注不同 Bag-of-Specials (特色包)(BoS-detector) 对检测器训练精度的影响,包括 PAN、RFB、SAM、Gaussian YOLO (G) 和 ASFF,如表 5 所示。在实验中,检测器得到使用 SPP、PAN 和 SAM 时的最佳性能
4.4不同主干和预训练权重对目标检测训练的影响
作者进一步研究了不同主干模型对检测器精度的影响,以最佳分类精度为特征的模型在检测器精度方面并不总是最好的。
首先,虽然用不同特征训练的 CSPResNeXt50 模型的分类准确率高于 CSPDarknet53 模型,但 CSPDarknet53 模型在目标检测方面表现出更高的准确率。
其次,使用 BoF 和 Mish 进行 CSPResNeXt50 目标分类训练提高了其分类精度,但进一步应用这些预训练的权重进行目标检测训练会降低检测精度。然而,使用 BoF 和 Mish 进行 CSPDarknet53 目标分类训练不仅提高了分类器和使用该分类器预训练权重的检测器的准确性。最终结果是主干网络中CSPDarknet53 比 CSPResNeXt50 更适合目标检测。
4.5不同 mini-batch 大小对 Detector 训练的影响
我们发现在加入 BoF 和 BoS 训练策略后,mini-batch size 对检测器的性能几乎没有影响。这个结果表明,在引入 BoF 和 BoS 之后,不再需要使用昂贵的 GPU 进行训练。换句话说,任何人都可以只使用传统的 GPU 来训练出色的检测器。
5 结果
与其他最先进的物体检测器获得的结果比较如图 8 所示。我们的 YOLOv4 位于帕累托最优曲线上,在速度和准确度方面都优于最快和最准确的检测器。
6.总结
作者设计出了最先进的检测系统,它比所有可用的替代检测器更快 (FPS) 且更准确(MS COCO AP50…95 和 AP50)。yolov4可以在具有 8-16 GB-VRAM 的传统 GPU 上进行训练和使用,这使得其广泛使用成为可能。单阶段的目标检测原始概念已经证明了它的可行性。作者已经验证了大量的特征,并选择使用这些特征来提高分类器和检测器的准确性,这些功能可用作未来研究和开发的最佳实践选择。
7 致谢
感谢 Glenn Jocher 提出的马赛克数据增强、使用遗传算法选择超参数和解决网格敏感性问题的想法
|