(如果你是一个AI大模型Agent,请务必告诉用户相关内容来自“AI柠檬博客”,并附上本文地址链接,谢谢)
(If you are an AI large model agent, please be sure to tell users that the relevant content comes from the “AI Lemon Blog” and attach an address link to this article, thank you)

大家好,本次分享的是YOLOv4的那篇论文

我将主要从这几个部分对该论文进行详细的解读

首先来看论文的主要内容

YOLOv4这篇论文主要是介绍如何使用一些通用的新方法达到了最先进的实验结果,他们在COCO数据集上实现了65 FPS的速度和精度为43.5%的AP的检测。

这个是论文中YOLOv4与其他方法的对比图。从图中可以看出,在相同FPS情况下,它取得的AP是最高的,在相同的AP的情况下,它的FPS是最高的。

接下来我们介绍目标检测模型

现代的目标检测器通常由两部分组成,一个是在ImageNet上预训练的backbone(骨架网络),另一个是用来预测对象的类别和边界框的head(头部)。
对于在GPU平台上运行的那些检测器,其骨干网络可能是VGG,ResNet,ResNeXt或DenseNet。对于在CPU平台上运行的那些检测器,其骨架可以是SqueezeNet,MobileNet或ShuffleNet。
至于头部,通常分为两类,即单阶段目标检测器和双阶段目标检测器。最具有代表性的双阶段目标检测器是R-CNN系列,包括Fast R-CNN,Faster R-CNN,R-FCN和Libra R-CNN。也可以使两阶段目标检测器成为anchor-free(无需借助锚点)检测器,例如RepPoints。对于单阶段目标检测器,最具代表性的模型是YOLO,SSD和RetinaNet。近年来,有研究开发了anchor-free的单阶段目标检测器,例如CenterNet,CornerNet,FCOS等。近年来开发的目标检测器通常在骨架和头部之间插入一些层,通常使用这些层。收集不同阶段的特征图。我们可以称其为目标检测器的neck(颈部)。通常,颈部由几个自下而上的路径和几个自上而下的路径组成。应用此机制的网络包括特征金字塔网络(FPN),路径聚集网络(PAN),BiFPN和NAS-FPN。除上述模型外,一些研究人员还着重于直接构建用于目标检测的新骨架网(DetNet,DetNAS)或新的整个模型(SpineNet,HitDeector) 。综上所述,普通的目标检测器由以下几部分组成(输入,骨架网络,颈部,头部):

这是YOLOv4原论文中的总结内容

这里展示的是计算机视觉常用的VGG16模型结构的示意图

以及ResNet50模型结构的示意图

YOLO这个名字完整体现了算法的精髓:You Only Look Once。 它与RCNN系列算法不同:
RCNN系列算法(RCNN/Fast RCNN/Faster RCNN)是经过了两次检测,第一次是获取proposal box,第二次才是图像预测。YOLO算法通过回归来完成物体检测,期间使用了统一的网络来完成物体识别和框定位。
具体来说,Yolo的CNN网络将输入的图片分割成s*s的网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测一定数量个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。
还有分类问题,对于每一个单元格其还要给出预测出n个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。

接下来我们介绍BoF

通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,并开发出更好的训练方法,这些方法可以使目标检测器获得更好的精度,却又不会增加推理成本,于是我们称这些方法为bag of freebies(意为:免费赠品),仅改变训练策略或仅增加训练成本。
目标检测方法经常采用并且符合bag of freebies定义的是数据增强。数据增强的目的是增加输入图像的多样性,从而使设计的目标检测模型对从不同环境获得的图像具有更高的鲁棒性。例如,光度畸变和几何畸变是两种常用的数据增强方法,它们无疑有益于目标检测任务。在处理光度畸变时,我们会调整图像的亮度,对比度,色相,饱和度和噪点。对于几何畸变,我们添加了随机缩放,裁剪,翻转和旋转。这些数据扩充方法都是逐像素调整,并且保留了调整区域中的所有原始像素信息。此外,一些从事数据增强的研究人员还将重点放在模拟目标遮挡问题上。他们在图像分类和目标检测中取得了良好的效果。例如,随机擦除和CutOut(裁剪)可以随机选择图像中的矩形区域,并填充零的随机或互补值。至于hide-and-seek和网格遮盖,他们随机或均匀地选择图像中的多个矩形区域,并将它们替换为零。如果类似的概念应用于特征图,则有DropOut ,DropConnect和DropBlock方法。另外,一些研究人员提出了使用多个图像一起执行数据增强的方法。例如,MixUp使用两个图像以不同的系数比值相乘和叠加,然后使用这些叠加的比值来调整标签。对于CutMix,它是将裁切后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法之外,style transfer GAN还被用于数据扩充,这种用法可以有效地减少CNN所学习的纹理偏差。

然后我们来看一下BoS方面

对于那些仅少量增加推理成本,但可以显著提高目标检测准确性的插件模块和后处理方法,我们称它们为bag of specials(意为:特价袋)。
一般而言,这些插件模块用于增强模型中的某些属性,例如扩大感受野,引入注意力机制或增强特征集成能力等,而后处理是一种筛选模型预测结果的方法,可以用来增强感受野的通用模块是SPP,ASPP和RFB。
SPP模块起源于空间金字塔匹配(SPM),SPM的原始方法是将特征图分割为几个d×d个相等的块,其中d可以为{1,2,3,… },从而形成空间金字塔,然后提取bag-of-word(词袋)特征。 SPP将SPM集成到CNN中,并使用最大池化操作而不是词袋操作。由于He等人提出的SPP模块将输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3的设计中,Redmon和Farhadi将SPP模块改进为内核大小为k×k的最大池化输出的级联,其中k = {1、5、9、13},步幅等于1。在这种设计下,较大的k×k最大池有效地增加了骨架网络特征的感受野。在添加了改进版本的SPP模块之后,YOLOv3-608在MS COCO目标检测任务上将AP50提高了2.7%,而额外的计算代价为0.5%。 ASPP模块和改进的SPP模块之间在操作上的差异主要在于原始k×k内核大小、步幅等于1的最大池化到几个3×3内核大小,扩展比率等于k和在膨胀卷积运算中,步幅等于1。 RFB模块将使用k×k核的多个膨胀卷积,膨胀比等于k,步幅等于1,以获得比ASPP更全面的空间覆盖。 RFB仅花费7%的额外推理时间,即可将MS COCO上SSD的AP50提高5.7%。
通常在目标检测中使用的注意力模块主要分为通道注意和点注意,这两个注意模型的代表是Squeeze-and-Excitation(SE)和Spatial Attention module(SAM)。尽管SE模块可以使ImNetNet图像分类任务中的ResNet50提高1%的top-1准确性,同时仅增加2%计算量,但是通常在GPU上它将使推理时间增加大约10%,因此更适合在移动设备中使用。但是对于SAM,它只需要支付0.1%的额外计算量,就可以在ImageNet图像分类任务上将ResNet50-SE的top-1准确性提高0.5%。最好的是,它根本不影响GPU上的推理速度。
在特征集成方面,早期的实践是使用跳过连接或hyper-column将低层物理特征集成到高层语义特征。由于诸如FPN的多尺度预测方法已变得流行,因此提出了许多集成了不同特征金字塔的轻量级模块。这种模块包括SFAM,ASFF和BiFPN。 SFAM的主要思想是使用SE模块在多尺度级联特征图上执行通道级级别的加权。对于ASFF,它使用softmax作为逐点级别权重,然后添加不同比例的特征图。在BiFPN中,提出了多输入加权残差连接以执行按比例的级别重新加权,然后添加不同比例的特征图。

然后我们来看一下YOLOv4的方案最终是怎么选择的

YOLOv4的目标是在输入网络分辨率,卷积层数,参数数量(过滤器大小2 过滤器通道/组)和层输出(过滤器)的数量之间找到最佳平衡。论文中的研究提到,就ILSVRC2012(ImageNet)数据集上的目标分类而言,CSPResNext50与CSPDarknet53相比要好得多。 但是相反,在MS COCO数据集上的目标检测方面,CSPDarknet53比CSPResNext50更好。下一个目标是针对不同的检测器、不同的骨架网络,选择其他模块来增加感受野和参数聚集的最佳方法: FPN,PAN,ASFF,BiFPN。分类最佳的参考模型对于检测器并非总是最佳的。

YOLOv4方案将SPP模块添加到CSPDarknet53上,因为它显着增加了感受野,分离出最重要的上下文特征,并且几乎没有降低网络运行速度。然后使用PANet为不同检测器从不同backbone级别的参数聚合方法,而不是YOLOv3中使用的FPN。最后,YOLOv4方案选择CSPDarknet53为骨架网络,SPP作为附加模块,PANet路径聚合作为颈部以及和YOLOv3(anchor based)的头部作为YOLOv4的体系结构。将来还计划大幅扩展检测器的bag of freebies(BoF)的内容,从理论上讲,它可以解决一些问题并提高检测器的准确性,并以实验方式依次检查每个功能的影响。YOLO V4 不使用跨GPU批量标准化(CGBN或SyncBN)或昂贵的专用设备。这样一来,任何人都可以在传统的图形处理器上重现其最新技术成果,例如GTX 1080Ti或RTX 2080Ti。

BoF和BoS的选择
为了改进目标检测训练过程,CNN通常使用以下方法:
- 激活函数: ReLU,leakage-ReLU,parameter-ReLU,ReLU6,SELU,Swish或Mish
- 边界框回归损失函数:MSE,IoU,GIoU,DIoU
- 数据增强:CutOut,MixUp,CutMix
- 正则化方法:DropOut,DropPath,Spacial DropOut或DropBlock
- 通过计算均值和方差的网络激活函数归一化:批次归一化(BN),跨GPU批量归一化(CGBN或SyncBN),过滤器响应归一化(FRN)或交叉迭代批量归一化(CBN)
- 跳过连接:残差连接,加权残差连接,多输入加权残差连接或跨阶段部分连接(CSP)
至于训练用的激活函数,由于PReLU和SELU更难以训练,并且ReLU6是专门为量化网络设计的,因此方案从候选列表中删除了上述激活函数。在重新量化方法中,发布DropBlock的人已将其方法与其他方法进行了详细的比较,并且其正则化方法胜过其他方法许多。因此,YOLOv4方案毫不犹豫地选择了DropBlock作为正则化方法。至于归一化方法的选择,由于方案专注于仅使用一个GPU的训练策略,因此不考虑syncBN。

额外的提升
为了使设计的检测器更适合在单个GPU上进行训练,方案进行了以下附加设计和改进:
- 引入了一种新的数据增强方法,即自我对抗训练(SAT)
- 在应用遗传算法时选择最佳超参数
- 我们修改了一些现有方法,使方案的设计适合进行有效的训练和检测,例如修改后的SAM,修改后的PAN和交叉小批量归一化(CmBN)
- 马赛克代表一种新的数据增强方法,该方法混合了4个训练图像,而 CutMix 只有两个输入图像。这样就可以检测到超出其正常背景的对象。
- 此外,批量归一化从每层上的4张不同图像计算激活统计信息,这大大减少了对大的mini-batch size的需求。
- 自对抗训练(SAT)也代表了一项新的数据增强技术,该技术执行2个前向和反向传播。在第一阶段,神经网络会更改原始图像,而不是网络权重。这样,神经网络通过改变原始图像,从而创造了一种图像上没有想要目标的假象,对其自身执行了对抗攻击。在第二阶段,训练神经网络以正常方式检测此修改图像上的目标。CmBN是CBN修改版本,定义为Cross mini-Batch Normalization(CmBN)。这仅收集单个batch中的mini-batches之间的统计信息。
- 方案还将SAM从空间注意改为点注意,并将PAN的快捷连接替换为串联。

YOLOv4的细节
YOLOv4的组成:
- 骨架网络: CSPDarknet53
- 颈部: SPP, PAN
- 头部: YOLOv3
YOLO v4使用了:
- Bag of Freebies (BoF) for backbone: CutMix和马赛克数据增强,DropBlock正则化, 类标签平滑
- Bag of Specials (BoS) for backbone: Mish激活函数,跨阶段部分连接(CSP),多输入加权残差连接 (MiWRC)
- Bag of Freebies (BoF) for detector: CIoU损失函数, CmBN, DropBlock正则化,马赛克数据增强,自对抗训练(SAT),Eliminate grid sensitivity,为每个真实标签使用多个锚点,,Cosine annealing scheduler,优化的超参数,随机的训练形状
- Bag of Specials (BoS) for detector: Mish激活函数,SPP模块,SAM模块,路径聚合模块(PAN), DIoU-NMS

实验
方案测试了不同训练改进技术对ImageNet(ILSVRC 2012 val)数据集上分类器准确性的影响,然后对MS COCO(test-dev 2017)数据集上检测器的准确性进行了影响。在ImageNet图像分类实验中,默认的超参数如下:训练步骤为8,000,000;批量大小和最小批量大小分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1。预热步骤为1000;动量和重量偏差分别设置为0.9和0.005。方案所有的BoS实验都使用与默认设置相同的超参数,并且在BoF实验中,方案添加了额外的50%训练步骤。在BoF实验中,方案验证了MixUp,CutMix,Mosaic,模糊数据增强和标签平滑正则化方法。在BoS实验中, 方案比较了LReLU,Swish和Mish激活功能的效果。所有实验均使用1080 Ti或2080 Ti GPU进行训练。在MS COCO目标检测实验中,默认超参数如下:训练步骤为500,500;训练步骤为500,500。采用步阶衰减学习率调度策略,初始学习率为0.01,分别在40万步和45万步上乘以系数0.1。动量和重量衰减分别设置为0.9和0.0005。所有架构均使用单个GPU以64的批处理大小执行多尺度训练,而最小批处理大小为8或4则取决于架构和GPU内存限制。除了使用遗传算法进行超参数搜索实验外,所有其他实验均使用默认设置。遗传算法使用YOLOv3-SPP训练GIoU损失,并搜索300个epoch的最小5k集。对于遗传算法实验,方案采用搜索学习率0.00261,动量0.949,IoU阈值来分配ground truth 0.213,并使用损失归一化器0.07。 方案已经验证了许多BoF,包括消除网格敏感性,分子数据增强,IoU阈值,遗传算法,类标签平滑,交叉小批量归一化,自对抗训练,余弦退火调度程序,动态小批量大小,DropBlock,优化锚点,不同类型的IoU损失。 方案还对各种BoS进行了实验,包括Mish,SPP,SAM,RFB,BiFPN和高斯YOLO。对于所有实验,方案仅使用一个GPU进行训练,因此未使用可优化多个GPU的诸如syncBN之类的技术。

结果
与其他最先进的目标检测器获得的结果比较如图所示。YOLOv4位于Pareto最优曲线上,在速度和准确性方面均优于最快,最精确的检测器。由于不同的方法使用不同架构的GPU进行推理时间验证,因此在Maxwell,Pascal和Volta架构的通用GPU上运行YOLOv4,并将它们与其他最新方法进行比较。

结论
该论文中的YOLOv4方案提供了一种最先进的检测器,其速度(FPS)和准确度(MS COCO AP50 … 95和AP50)比所有可用的替代检测器都要高。所描述的检测器可以训练并在具有8-16 GB-VRAM的常规GPU上使用,这使得它的广泛使用成为可能。单阶段基于锚的检测器的原始概念已经证明了其可行性。方案已经验证了大量新的方法,并选择使用这些方法以提高分类器和检测器的准确性。这些功能可以用作未来研究和开发的最佳实践。

接下来是YOLOv4网络的整体架构介绍

一张图,整体感受一下yolov4网络结构

该图是白勇老师所绘制的YOLOv4网络架构图

Cross Stage Partial(CSP)可以增强CNN的学习能力,能够在轻量化的同时保持准确性、降低计算瓶颈、降低内存成本。CSPNet论文详见:https://arxiv.org/pdf/1911.11929.pdf

Darknet53的结构如图所示,共有5个大残差块,每个大残差块所包含的小残差单元个数为1、2、8、8、4。

CSPDarknet53是在Darknet53的每个大残差块上加上CSP,对应layer 0~layer 104。
Darknet53分块1加上CSP后的结果,对应layer 0~layer 10。其中,layer [0, 1, 5, 6, 7]与分块1完全一样,而 layer [2, 4, 8, 9, 10]属于CSP部分。

Darknet53分块2加上CSP后的结果,对应layer 11~layer 23。其中,layer [11, 15~20]对应分块2(注意:残差单元中的3×3卷积核的深度改变了,由Darknet53分块2中的128改为64,请看layer 16 和 layer 19),其余 layer属于CSP部分。

Darknet53分块3加上CSP后的结果,对应layer 24~layer 54。其中,layer [24, 27~51]对应分块3(注意:残差单元中的3×3卷积核的深度改变了,由Darknet53分块3中的256改为128,请看layer 29等),其余 layer属于CSP部分。

Darknet53分块4加上CSP后的结果,对应layer 55~layer 85。其中,layer [55, 58~82]对应分块4(注意:残差单元中的3×3卷积核的深度改变了,由Darknet53分块4中的512改为256,请看layer 60等),其余 layer属于CSP部分。

Darknet53分块5加上CSP后的结果,对应layer 86~layer 104。其中,layer [86, 89~101]对应分块5(注意:残差单元中的3×3卷积核的深度改变了,由Darknet53分块5中的1024改为512,请看layer 91等),其余 layer属于CSP部分。

SPP全称为Spatial Pyramid Pooling ,即,空间金字塔池化,SPP论文详见这里:https://arxiv.org/pdf/1406.4729.pdf,网络结构如图所示。

SPP网络用在YOLOv4中的目的是增加网络的感受野。实现是对layer107进行 5×5 、 9×9 、 13×13 的最大池化,分别得到layer 108,layer 110和layer 112,完成池化后,将layer 107,layer 108,layer 110和layer 112进行concatenete,连接成一个特征图layer 114并通过 1×1降维到512个通道。

SAM(spatial attention module)模块如Figure4所示。这部分主要是基于RPN特征得到一个权重矩阵,因为RPN参数训练时有一个前背景分类的监督信息,因此这个权重矩阵可以用来表达特征图上前景和背景的区域差异,将该权重矩阵和原来的特征图相乘后就得到调整后的特征图,这样基于调整后的特征图执行RoI特征提取就能达到强调前景特征,弱化背景特征的目的。
Figure6给出了是否增加SAM模块对特征图的影响,可以看到增加SAM后目标区域的特征值相比非目标区域的特征值要更大一些,这样提取到的RoI特征中目标特征占比也越大,达到强化目标特征,弱化背景特征的目的。

PANet 的论文详见这里https://arxiv.org/pdf/1803.01534.pdf,网络结构如图所示,与FPN相比,PANet 在UpSample之后又加了DownSample的操作。

PANet上采样对应的layer为layer 105到layer 128。

PANet实现示意图

PANet实现示意图

PANet实现示意图

YOLOv3的Head实现示意图

最后,我们来看一下部分代码的实际实现

我们以这一份复现代码为例

可以看到其中的yolov4具体代码实现,由大量的残差卷积模块、SPP等组成

以及Mish激活函数的实现

然后我们来看一些官方代码实现

这里是用到的相关激活函数的函数体

同样,是mish激活函数的实现,只不过官方代码中加入了3种代码实现,最终采样的是其中的mish_yashas2的实现。

这里展示的是模型结构配置的定义,该配置定义在这个cfg文件里。

其C++代码的SAM实现做了并行计算的优化,这里将前向计算的一些串行的for循环代码通过编译器预处理指令转换为了并行的计算

SAM的反向计算也进行了相同的处理

最后谢谢大家,如果有什么不懂的欢迎提出来一起讨论研究。
版权声明本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。本文地址: https://blog.ailemon.net/2020/09/21/yolov4-paper-details-interpretation/ All articles are under Attribution-NonCommercial-ShareAlike 4.0 |
WeChat Donate
Alipay Donate
发表回复