YOLOv4 怎么学,看完这一篇就够了!

写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与记录。如果您也对 深度学习、机器视觉、算法、Python、C++ 感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
我的Github项目地址是:【AI 菌】的Github
本教程会持续更新,如果对您有帮助的话,欢迎star收藏~


项目地址: https://github.com/AlexeyAB/darknet

一、YOLOv4简介

在深度学习中,有很多技巧可以提高卷积神经网络的检测精度。有些技巧只能针对特定的模型,而有些技巧适用于大多数模型、任务和数据集,比如batch-normalizationresidual-connections等。

所有的这些技巧只有通过实际的实验,才能证明其有效性。YOLOv4就对其中的一些常用技巧进行了大量的测试,最终选择了这些有用的技巧:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss。

YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。

性能对比:
YOLOv4的检测速度比EfficientDet快两倍,性能相当。将YOLOv3的AP和FPS分别提高10%和12%,具体性能对比可见下表:
在这里插入图片描述
YOLOv4的主要贡献:

  1. 开发了一个高效而强大的目标检测模型。它使每个人都可以使用1080ti或2080ti的GPU来训练一个超快速和精确的目标检测器。
  2. 在检测器的训练中,验证了最先进的BoF(免费包)和BoS(特殊包)对目标检测性能的影响。
  3. 对当前先进的目标检测方法进行了改进,使之更有效,并且更适合在单GPU上训练;这些改进包括CBN、PAN、SAM等。

YOLOv4的整体结构:
在这里插入图片描述
最简单清晰的表示:YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)

二、提出背景

2.1 目标检测模型

论文中总结了,一个普通的目标检测器由以下几个部分组成:
在这里插入图片描述

2.2 Bag of freebies(免费包)

目标检测器在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法称为“免费包”。比如数据增广就是这种方法,数据增广的目的是增加输入图像的可变性,使所设计的目标检测模型对不同环境下获取的图像具有更高的鲁棒性。
除此之外,边界框回归的目标函数也属于免费包。传统的目标检测器通常使用均方误差(MSE)直接对Bounding Box的中心点坐标和高度、宽度进行回归,即{xcenter,ycenter,w,h},或者对左上点和右下点坐标进行回归;基于锚(Anchors)的方法是估计相应的偏移量;最近有研究者提出了IoU损失,它考虑了预测Bounding Box区域和ground truth的覆盖。

2.3 Bag of specials(特色包)

对于那些只增加少量推理成本但能显著提高对象检测精度的插件模块和后处理方法,我们称之为“特殊包”。一般来说,这些插件模块用于增强模型中的某些属性,如扩大感受野引入注意机制增强特征整合能力等,后处理是筛选模型预测结果的一种方法。

(1)可用于增强感受野的常用模块有SPP、ASPP和RFB。

  • SPP模块源于空间金字塔匹配(SPM),SPMs最初的方法是将特征映射分成若干个d×d相等的块,其中d可以是{1,2,3,…},从而形成空间金字塔,然后提取bag-of-word的特征。SPP将SPM集成到CNN中,并使用最大池化操作代替bag-of-word操作。
  • 在YOLOv3的设计中,Redmon和Farhadi将SPP模块改进为最大池输出与核大小k×k的串联,其中k={1,5,9,13},步长等于1。在这种设计下,一个较大的k×k最大池化有效地增加了主干特征的感受野。在添加了SPP模块的改进版本后,YOLOv3-608在MS-COCO目标检测任务上将
    A P 50 AP_{50} 升级了2.7%,但增加了0.5%的计算量。
  • ASPP模块与改进的SPP模块在运算上的差异主要是源于原始的k×k核大小,在扩张卷积运算中,最大池化的步幅等于1到几个3×3核大小,扩张比等于k,步长等于1。
  • RFB模块是利用k×k核的几个展开卷积,展开比为k,步长为1,得到比ASPP更全面的空间覆盖。RFB[47]仅需7%的额外推理时间,即可将MS
    COCO上的SSD的AP50提高5.7%。

(2)目标检测中常用的注意模块主要分为通道式注意和点式注意。这两种注意模型的代表分别是:挤压与激励(SE)和 空间注意模块(SAM)

  • SE模块在ImageNet图像分类任务中可以将ResNet50的能力提高1%的top1精度。但在GPU上通常会增加10%左右的推理时间,因此更适合用于移动设备。

  • SAM模块只需要额外消耗0.1%的计算量,就可以提高resnet50se在ImageNet图像分类任务中的0.5%的top1精度。最重要的是,它根本不影响GPU上的推理速度。

(3)在特征集成方面,早期的方法是使用跳转连接(skip connection)或超列(hyper-column )将低级物理特征集成到高级语义特征。 随着FPN等多尺度预测方法的广泛应用,人们提出了许多集成不同特征金字塔的轻量级模块。这类模块包括SFAM、ASFF和BiFPN。

  • SFAM的主要思想是利用SE模块对多尺度级联特征映射进行通道级加权。
  • 对于ASFF,它使用softmax作为逐点加权,然后添加不同比例尺的特征地图。
  • BiFPN中,提出了多输入加权残差连接进行尺度层次加权,然后加入不同尺度的特征映射。

(4)一个好的激活函数可以使梯度更有效地传播,同时不会造成太多额外的计算开销。 2010年,Nair和Hinton提出ReLU来实质性地解决传统tanh和sigmoid激活函数中经常遇到的梯度消失问题。

随后又提出了LReLU、PReLU、ReLU6、标度指数线性单元(SELU)、Swish、hard Swish、Mish等,也被用来解决梯度消失问题。当梯度小于零的时候,首要的目的是解梯度小于零的问题。至于ReLU6和hard Swish,它们是专门为量化网络设计的。对于神经网络的自规范化,提出了SELU激活函数来满足这一目标。需要注意的是Swish和Mish都是连续可微的激活函数。

基于深度学习的目标检测中常用的后处理方法是非极大抑制(NMS),它可以用来过滤那些对同一目标预测不好的Bounding box,只保留响应较高的候选Bounding box,NMS试图改进的方法与优化目标函数的方法是一致的。

三、改进方法

基本目标是提高神经网络在生产系统中的运行速度和并行计算的优化,而不是低计算量的理论指标(BFLOP)。YOLOv4提供两种实时神经网络选项:
在这里插入图片描述

  • 对于GPU,我们在卷积层中使用少量的组(1-8):csprenext50/CSPDarknet53
  • 对于VPU,我们使用分组卷积,但避免使用挤压和激励模块(SE)。具体来说,这包括以下模型:EfficientNet-lite/MixNet/GhostNet/MobileNetV3

注:VPU(Video Processing Unit),视频处理单元。

3.1 网络结构的选择

我们的目标是找到输入网络分辨率、卷积层数、参数量和输出层卷积核数量的最佳平衡。例如,大量研究表明,在ILSVRC2012(ImageNet)数据集的目标分类方面,CSPResNext50比CSPDarknet53要好得多。然而,相反地,在检测MS-COCO数据集上的目标方面,CSPDarknet53比CSPResNext50更好。

接下来的目标是选择额外的block来增加感受野,并从不同的backbone水平选择参数聚集的最佳方法:如FPN、PAN、ASFF、BiFPN。

对于检测器来说,分类最理想的参考模型并不总是最优的。与分类器不同,检测器需要以下各项:
在这里插入图片描述

  • 更高的输入网络大小(分辨率),用于检测多个小尺寸的目标。
  • 更多的层,更大的感受场,以覆盖不断扩大的输入网络。
  • 更多的参数,使模型具有更大的能力来检测单个图像中不同大小的多个目标。

在这里插入图片描述
表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作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。

最终,YOLOv4的体系结构确定为:CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)

3.2 免费包和特殊包的选择

为了改进目标检测训练,CNN通常使用以下方法:
在这里插入图片描述
对于训练激活函数,由于PReLU和SELU更难训练,而ReLU6是专门为量化网络设计的,因此我们排除使用PReLU、SELU和ReLU6。在规范化方法方面,发表DropBlock的人们对其方法与其他方法进行了详细的比较,他们的正则化方法取得了很大的成功。因此,我们毫不犹豫地选择DropBlock作为我们的正则化方法。在规范化方法的选择上,由于我们只关注一个GPU的训练策略,所以没有考虑syncBN。

3.3 其它的改进

为了使所设计的检测器更适合在单个GPU上进行训练,我们进行了如下额外的设计和改进:
在这里插入图片描述

新的数据增广方法:

  • Mosaic。这种方法混合了训练集中四张不同图片的内容,如下图所示:
    在这里插入图片描述

  • 自我对抗训练(SAT)。它分为两个前后两个阶段。在第一阶段,神经网络改变原始图像而不是网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。

BN、CBN和CmBN的对比:
在这里插入图片描述
CmBN表示CBN修改版本,如上图所示,定义为跨小批量标准化(CmBN)。此操作仅在单个批次内的小批次之间收集统计信息。

除此之外,论文中将SAM从空间注意力机制修改为点注意机制,并将PAN的快捷连接(shortcut connection)替换为连接(concatenation),具体细节如下图5和图6所示:
在这里插入图片描述

3.4 YOLOv4

在这一部分,将详细介绍YOLOv4的组成,以及使用的免费包和特殊包。

YOLOv4的组成:
在这里插入图片描述
使用的免费包和特殊包:
在这里插入图片描述

四、实验与结论

YOLOv4主要做了两类实验:

  • 在ImageNet(ILSVRC 2012 val)数据集上测试了不同的改进技术对分类器精度的影响
  • 在MS-COCO(test dev 2017)数据集上测试了不同的改进技术对检测器精度的影响,以及与各种先进的目标检测方法进行了对比实验。

4.1 在ImageNet上的分类实验

(1) 训练方法

在ImageNet图像分类实验中,所有实验均采用 1080ti 或 2080ti GPU进行训练。默认的超参数为:训练步数为8000000;批大小为128;最小批大小为32;采用多项式衰减学习率调度策略,初始学习率为0.1;预热步数为1000;动量衰减和权重衰减分别设置为0.9和0.005。我们所有的BoS(特殊包)实验使用相同的超参数作为默认设置,并且在BoF(免费包)实验中,我们添加了额外的50%的训练步数。在BoF实验中,我们验证了MixUp、CutMix、Mosaic、Bluring data augmentation(模糊数据增强)和 label smoothing regularization(标签平滑正则化)方法。在BoS实验中,我们比较了LReLU、Swish和Mish激活函数的效果。

(2) 不同技巧对分类器训练精度的影响

YOLOv4 研究了不同技巧对分类器训练的影响,特别是类标签平滑 label smoothing、不同数据增强技术data augmentation、双边模糊bilateral blurring、混合MixUp、剪切混合CutMix和镶嵌Mosaic的影响;以及不同的激活函数,如Leaky ReLU(默认)、Swish和Mish下的影响,如下图所示:
在这里插入图片描述
选择CSPResNeXt-50和CSPDarknet-53作为主干网络分别进行实验,来探究各种BoF 和 Mish对分类精度的影响。如下表所示:

  • 下表是在CSPResNeXt-50上的实验。可以看出,同时使用免费包(BoF):CutMix、Mosaic、Label Smoothing和激活函数Mish,对CSPResNeXt-50分类精度提升最大。
    在这里插入图片描述
  • 下表是在CSPDarknet-53上的实验。可以看出,同时使用免费包(BoF):CutMix、Mosaic、Label Smoothing和激活函数Mish,也可以使得CSPDarknet-53的分类精度提升很多。
    在这里插入图片描述

4.2 在MS-COCO上的检测实验

(1) 训练方法

在MS-COCO目标检测实验中,YOLOv4 只使用一个GPU进行训练,没有使用syncBN等优化多个GPU的技术。默认的超参数如下:训练步数为500500;采用步进衰减学习率调度策略,初始学习率为0.01,在40万步和45万步分别乘以系数0.1;分别设置动量和权重衰减分别为0.9和0.0005。所有的体系结构都使用单个GPU来执行多尺度训练,批大小为64,而小批量大小为8或4,这取决于体系结构和GPU的内存限制。

除了使用遗传算法进行超参数搜索实验外,其他实验都使用默认设置。遗传算法采用YOLOv3-SPP进行带GIoU损失的训练,搜索300个周期的最小值5千组。遗传算法实验采用搜索学习率0.00261,动量0.949,分配ground truth的IoU阈值为0.213,损失归一化器为0.07。YOLOv4对大量的BoF进行了验证,包括网格敏感性消除、Mosaic数据增强、IoU阈值、遗传算法、类标签平滑、交叉小批量规范化、自对抗训练、余弦退火调度cosine annealing scheduler、动态小批量size、DropBlock、优化Anchors、各种IoU损失等。我们还对各种BoS进行了实验,包括Mish、SPP、SAM、RFB、BiFPN和Gaussian YOLO。

(2) 不同技巧对检测器训练精度的影响

1)首先,探究了不同的BoF对检测精度的影响(不改变检测速度的情况下),主要的一些BoF操作如下:
在这里插入图片描述
不同的BoF操作对检测器的精度影响如下表:
在这里插入图片描述
可以得出结论:在CSPResNeXt50-PANet-SPP(分辨率512x512)上使用这些BoF:S、M、IT、GA、OA 和 损失函数:GIoU/CIoU使得检测器精度最佳。
注: A P 50 AP_{50} 指检测器IoU阈值大于0.5的检测精度。

2)然后,又进一步探究了各种BoS(包括PAN、RFB、SAM、Gaussian YOLO(简写G)和ASFF)对检测器训练精度的影响,结果如下表所示:
在这里插入图片描述
可以得出结论:当使用PANet + SPP + SAM时,检测器的性能最好。

(3) 不同的backbones和预训练权重对检测器的影响

进一步实验发现,以最佳分类精度为特征的模型在检测器精度方面并不总是最好的。比如,虽然不同特性的CSPResNeXt50模型的分类精度比CSPDarknet53模型高,但CSPDarknet53模型在目标检测方面显示出更高的精度。

在CSPResNeXt50分类器训练中使用BoF和Mish可以提高分类器的分类精度,但是进一步将这些预先训练的权重用于检测器训练会降低检测器的精度。然而,在CSPDarknet53分类器训练中使用BoF和Mish可以提高分类器和使用该分类器预先训练权重的检测器的精度。所以最终结果是主干网络CSPDarknet53比CSPResNeXt50更适合于检测器。

在这里插入图片描述
实验如上表所示,可以得出结论:以CSPDarknet53为主干网络的模型,使用其分类器预先训练的权重,经过各种BoF和BoS的改进,可以得到更好的检测精度。

(4) batch_size对检测器训练精度的影响

采用不同的batch_size训练模型,结果如下表所示:

在这里插入图片描述
从上表可以得出结论:在加入BoF和BoS训练策略后,batch_size大小对检测器的检测性能几乎没有影响。换句话说,使用小的batch_size也能达到相当的检测精度,因此任何人使用一个普通的GPU(比如1080Ti或2080Ti)就能训练一个优秀的检测器(YOLOv4)。

五、性能表现

由于不同的模型算法使用不同体系结构的GPU进行推理时间验证,因此YOLOv4分别在Maxwell、Pascal和Volta架构的GPU上运行,并与其他最新的模型算法进行了比较。

本实验主要比较帧率在30fps以上的检测器。在测试时,没有使用TensorRT进行加速,并将batch设置为1。

5.1 在Maxwell架构的GPU下测试

Maxwell架构的GPU有:GTX Titan X (Maxwell) 和 Tesla M40 。在该类GPU下进行测试,得到各个先进检测算法与YOLOv4的性能对比图:
在这里插入图片描述
下图展示了,在Maxwell架构的GPU上测试,不同目标检测器在MS-COCO数据集上的速度和精度比较:
在这里插入图片描述

5.2 在Pascal架构的GPU下测试

Pascal架构的GPU有:Titan X (Pascal)、Titan Xp、GTX 1080 Ti、或者Tesla P100 GPU。在该类GPU下进行测试,得到各个先进检测算法与YOLOv4的性能对比图:
在这里插入图片描述
下图展示了,在Pascal架构的GPU上测试,不同目标检测器在MS-COCO数据集上的速度和精度比较:
在这里插入图片描述

5.3 在Volta架构的GPU下测试

Volta架构的GPU有:Titan V olta or Tesla V100 GPU。在该类GPU下进行测试,得到各个先进检测算法与YOLOv4的性能对比图:
在这里插入图片描述
下图展示了,在Volta架构的GPU上测试,不同目标检测器在MS-COCO数据集上的速度和精度比较:
在这里插入图片描述

六、总结

总结YOLOv4算法:

  • 与其它先进的检测器相比,对于同样的精度,YOLOv4更快(FPS);对于同样的速度,YOLOv4更准(AP)。
  • YOLOv4能在普通的GPU上训练和使用,比如GTX 1080Ti和GTX 2080Ti等。这使得它能广泛地被运用。
  • 通过大量的实验,选择了合适的BoF和BoS提高了分类器和检测器的精度。

最后,最最重要的,敲黑板!!!
YOLOv4的体系结构确定为:CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)

如果大家想对YOLO家族有更全面地了解,可以关注我的动态,后面我会整理出YOLOv1至YOLOv4的进阶干货!

最好的关系是互相成就,各位的「三连」就是【AI 菌】创作的最大动力,我们下期见!

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/107445791