1、YOLOv4 介绍

2020 年 4 月,YOLOv4 在悄无声息中重磅发布,在目标检测领域引起广泛的讨论。在 YOLO 系列的原作者 Joseph Redmon 宣布退出 CV 领域后,表明官方不再更新 YOLOv3。但在过去的两年中,AlexeyAB 继承了 YOLO 系列的思想和理念,在 YOLOv3 的基础上不断进行改进和开发,于今年 4 月发布 YOLOv4,并得到了原作者 Joseph Redmon 的承认。YOLOv4 可以使用传统的 GPU 进行训练和测试,并能够获得实时的,高精度的检测结果。与其他最先进的目标检测器的比较的结果如图1.1所示,YOLOv4 在与 EfficientDet 性能相当的情况下,推理速度比其快两倍。相比 YOLOv3 的 AP 和 FPS 分别提高了 10% 和 12%。

图1.1 检测结果对比

YOLOv4 贡献可总结如下:

  • 提出了一种实时、高精度的目标检测模型。它可以使用1080 Ti或2080 Ti 等通用GPU来训练快速和准确的目标检测器;
  • 在检测器训练阶段,验证了一些最先进的 Bag-of-Freebies 和 Bag-of-Specials 方法的效果;
  • 对SOTA方法进行改进,使其效率更高,更适合单GPU训练,包括 CBN,PAN 和 SAM等。

论文地址:YOLOv4: Optimal Speed and Accuracy of Object Detection,https://arxiv.org/abs/2004.10934

代码链接:https://github.com/AlexeyAB/darknet#yolo-v4-in-other-frameworks

1.1. 目标检测相关方法总结

一般目标检测器网络结构由以下四个部分构成,如图 1.2 所示。

图1.2 目标检测

1.1.1 Bag of freebies

可以在训练过程中进行改进(例如数据增强,类别不平衡,损失函数,软标签等)以提高检测的准确性。我们把这些只改变训练策略或只增加训练成本而对推理速度没有影响的方法称为"Bag of freebies (BoF)"。BoF 方法总结如图 1.3 所示。

图1.3 Bag of freebies 

1.1.2. Bag of specials

对于那些仅增加少量推理时间但可以显着提高目标检测精度的插件模块和后处理方法,将其称为“Bag of specials (BoS)”。这些方法主要用于增强模型中的某些属性,例如扩大感受野,引入注意力机制或增强特征集成能力等,而后处理方法则是筛选模型预测结果。BoS 方法总结如下图1.4所示。

图1.4 Bag of specials 

1.2. YOLOv4 模型结构及其使用的方法

YOLOv4 所采用的网络结构,Bag 方法总结如下图1.5所示。

图1.5 YOLOv4

1.2.1 网络结构

YOLOv4 模型结构如图 1.6 所示。图片引用来自https://blog.csdn.net/nan355655600/article/details/107852288

图1.6 YOLOv4模型结构 

CSPDarknet53

CSPNet (Cross Stage Paritial Network) 主要从网络结构设计的角度解决推理中计算量大的问题。CSPNet 的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用 Cross-Stage-Partial-connections (CSP) 先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。CSP 连接如图 1.7 所示。

图1.7 CSP

网络结构采用 CSP 连接,主要以下三个方面的优点:

  • 增强 CNN 的学习能力,使得在轻量化的同时保持准确性;
  • 降低计算瓶颈;
  • 降低内存成本。

YOLOv4 利用上面的 CSP 连接以及如图1.8所示的 Darknet-53 作为特征提取的主干网络。

图1.8 Darknet-53 

与具有更好的分类性能 CSPResNeXt-50 相比,CSPDarknet53 模型在目标检测方面具有更高的检测精度。同时,可以使用 Mish 和其他技术来提高 CSPDarknet53 的分类准确性。因此,YOLOv4 最终选择 CSPDarknet53 作为主干网络。目标检测器由特征提取中的 backbone 和用于目标检测的 head 组成。为了检测不同尺度的目标,将使用具有不同空间分辨率特征图生成层次结构。为了丰富输入到 head 的信息,来自自底向上和自顶向下的相邻特征映射按元素方式相加或连接在一起,然后作为 head 的输入。因此,head 输入将包含自底向上的丰富空间信息和自顶向下的丰富语义信息。我们将这一部分称为 neck。

 

SPP (spatial pyramid pooling layer)

在 YOLOv4 中,对 SPP 进行了修改以保证输出为空间维度。最大池化的核大小为 k = {1×1、5×5、9×9、13×13}。将来自不同核大小池化后的特征图串联在一起作为输出。采用 SPP 层的方式,比单纯的使用单个尺寸核大小的最大池化的方式,更有效的增加主干网络的感受野,显著的分离最重要的上下文特征。YOLOv4 的作者在使用 608 * 608 大小的图像进行测试时发现,在 COCO 目标检测任务中,以 0.5% 的额外计算代价将 AP50 增加了 2.7%。

图1.9 SPP

PAN (Path Aggregation Network)

图 1.10 是用于目标检测的路径聚合网络 (PAN)。自下而上的路径 (b) 得到增强,使低层空间信息更易于传播到顶部。在 FPN 中,局部空间信息沿红色箭头向上传播。虽然图中未明确显示,但红色路径将穿过约100层以上。PAN 引入了一条捷径(绿色路径),仅需大约 10 层即可到达顶层。这种捷径连接使细粒度的局部信息可用于顶层。

图1.10 PAN 

在 YOLOv4 中,修改后的PAN 对相邻的特征图不是相加在一起,而是串联在一起。如图 1.11 所示。 

图1.11 Modified_PAN 

1.2.2 使用的 Bag 方法

Mosaic 数据增强

Mosaic 是一种数据增强方法,将 4 张训练图像组合成一张进行训练(而不是 CutMix 中的 2 张),这增强了对超出正常图像边框的目标的检测。另外,每个 mini-batch 包含大量的图像(是原来 mini-batch 所包含图像数量的 4 倍),因此,在估计均值和方差时减少了对 large mini-batch sizes 的需求。

图1.12 Mosaic 

Mish 激活函数

YOLOv4 的骨干网络中都使用了 Mish 激活函数,而其他部分则使用 Leaky_ReLU 函数。Mish 是光滑的非单调激活函数,可定义为:

图1.13 Mish激活函数

在 YOLOv4 中使用 Mish 函数的原因是它的低成本和它的平滑、非单调、无上界、有下界等特点,与其他常用函数如 ReLU 和 Swish 相比,提高了它的性能。 

1.3. 测试结果

图 1.14 为 YOLOv4 在 MS COCO 2017 测试集上的测试结果。

图1.14 测试结果 

2、YOLOv4 模型优化—通道剪枝

在资源受限的设备上部署像 YOLOv4 这样的大模型时,模型压缩是研究人员重新调整较大模型所需资源消耗的有用工具。现有模型压缩和加速方法主要包括模型剪枝,知识蒸馏和量化等。非结构化的模型剪枝方法虽然可以在不损失精度的情况下得到较高的压缩比,但其需要专用的硬件或软件才能够实现模型的加速。通道剪枝是一种粗粒度但有效的结构化剪枝方法,更重要的是,它不需要专用的硬件或软件就可以方便地实现剪枝模型。因此,本节主要介绍对 YOLOv4 模型进行结构化剪枝,在普通硬件上即可实现模型尺寸的压缩和推理加速。

Network slimming 提出了一种简单但有效的通道修剪方法。他们直接采用批处理归一化 (BN) 层中的缩放因子,通道级缩放因子,并对这些缩放因子进行 L1 正则化训练网络,以获得通道级的稀疏性。应用 network slimming 方法来修剪基于 CNN 的图像分类器,显著地减少了模型大小和 FLOPs。因此,本节将network slimming 扩展到目标检测模型中,应用去对 YOLOv4 模型进行通道剪枝。

我们按照如图 2.1 所示的步骤在 YOLOv4 中应用通道修剪以获取 SlimYOLOv4。

图2.1 SlimYOLOv4通道剪枝流程 

2.1. 稀疏化训练

神经网络模型的按通道稀疏度有助于进行通道修剪,并描述以后可能被删除的不重要通道的数量。为了方便通道修剪,为每个通道分配了一个缩放因子,其中缩放因子的绝对值表示通道的重要性。具体来说,除了检测头之外,YOLOv4 中的每个卷积层后面都有一个 BN 层,用于加速收敛并提高泛化能力。BN 层使用小批量输入特征中的均值和方差来归一化卷积特征的输出,公式如 (1) 所示。

其中, 和 σ2 是一个小批量的输入特征的均值和方差,γ 和 β表示可训练的缩放因子和偏置。因此,可直接采用 BN 层中可训练的缩放因子作为判断通道重要性的指标。为了有效地从不重要得通道中区分出重要通道,可以通过在缩放因子 γ 上施加 L1 正则化来执行通道级稀疏训练。稀疏训练的损失函数如公式 (2) 所示。 

其中,f(γ) = |γ|  表示 L1 范数,α 表示用来平衡两个损失的惩罚因子。在实现中,使用次梯度来优化非平滑的 L1 惩罚项,和 network slimming 中处理方式相同。 

2.2. 通道剪枝

经过稀疏训练后,我们引入了全局阈值来确定是否删除该特征通道。全局阈值 被设置为所有 γ 的百分之 n 以控制整体的剪枝率。此外,我们还引入了一个局部安全阈值 ,保持网络连接的完整性,以防止某个卷积层的通道被全部剪掉。局部安全阈值 设置为每层需要保留通道数的百分比 k 所对应的γ   值。对缩放因子  γ 小于全局阈值  和 局部安全阈值  的最小值的特征通道进行剪枝。在 YOLOv4 中,需要仔细处理各层之间的几种特殊连接,例如,route 层和 shortcut 层。首先,根据全局阈值  和局部安全阈值  为所有卷积层构造一个剪枝掩码。对于 route 层,按顺序将其多个输入层的剪枝掩码串联起来,并将串联起来的掩码作为该层的剪枝掩码。YOLOv4 中的 shortcut 层与在 ResNet 中扮演相似的角色。因此,要求所有与 shortcut 层具有连接的层都具有相同的通道数量。为了匹配由 shortcut 层连接的每个层的特征通道,我们遍历所有连接层的剪枝掩码,并在其上执行 OR 操作为这些连接层生成最终的剪枝掩码。

2.3. 微调

通道剪枝后,模型精度可能会有一定程度的下降,因此,需要对剪枝后的模型进行微调以尽可能恢复最初的训练精度。在细粒度的目标检测任务中,检测精度对通道剪枝通常比较敏感。因此,微调对于使剪枝后的模型从潜在精度下降中恢复非常重要。在数据集 COCO2017 的测试中,我们使用相同的训练超参数直接训练 SlimYOLOv4,和YOLOv4的正常训练相同。

2.4. 迭代剪枝

对模型进行高剪枝率的一次剪枝可能导致过度剪枝,可能导致模型精度灾难性的退化,以至于剪枝后的模型将永远不会被恢复。因此,迭代式的剪枝可以更好地避免过度剪枝。

3、未来展望

最近一段时间,我们也将在Adlik的官方github仓库中更新 YOLOv4 在不同数据集上的训练测试以及 slimYOLOv4通道剪枝的代码。同时,在后续的计划中,我们也将持续对 YOLOv4 进行改进,以及支持对 YOLOv4 结构化剪枝,量化和知识蒸馏等模型压缩和加速方法,以实现在不同平台的 CPU 和 GPU 上的高效部署。

参考资料

  • YOLOv4: Optimal Speed and Accuracy of Object Detection
  • CSPNet: A New Backbone that can Enhance Learning Capability of CNN
  • YOLOv3: An Incremental Improvement
  • DC-SPP-YOLO: Dense Connection and Spatial Pyramid Pooling Based YOLO for Object Detection
  • Path Aggregation Network for Instance Segmentation
  • SlimYOLOv3:Narrower, Faster andBetterfor Real-TimeUAV Applications
  • YOLOv4
  • 深入浅出Yolo系列之Yolov3&Yolov4&Yolov5核心基础知识完整讲解
Logo

更多推荐