四、大神接棒:YOLOv4

4.1 简介

目前的检测模型通常由两部分组成:

  1. Backbone:在ImageNet上预训练的网络主干(pre-trained on ImageNet)

    • GPU:VGG、ResNet、ResNeXt、DenseNet
    • CPU:SqueezeNet、MobileNet、ShuffleNet
  2. Head:预测类别及目标边界框(predict classes and bounding boxes of objects)
    • Two-stage:faster R-CNN、Libra R-CNN
    • One-stage:YOLO、SSD、RetinaNet
    • anchor-free one-stage:CenterNet、CornerNet、FCOS

近几年发展起来的目标检测网络还会在Backbone和Head中间插入一些层,用于收集不同阶段的特征图

  1. Neck:由几个自下而上的路径和几个自上而下的路径组成(several bottom-up paths and several top- down paths.),如FPN、PAN、BiFPN、NAS-FPN

综上所述,通常目标检测由几个部分组成:

2020年YOLO系列的作者Redmon在推特上发表声明,出于道德方面的考虑,从此退出CV界。听到此消息的我,为之震惊!本以为YOLOv3已经是YOLO系列的终局之战。没想到就在今年,Alexey Bochkovskiy等人与Redmon取得联系,正式将他们的研究命名为YOLOv4。

YOLOv4对深度学习中一些常用Tricks进行了大量的测试,最终选择了这些有用的Tricks: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的独到之处在于:

  • 是一个高效而强大的目标检测网咯。它使我们每个人都可以使用 GTX 1080Ti 或 2080Ti 的GPU来训练一个超快速和精确的目标检测器。这对于买不起高性能显卡的我们来说,简直是个福音!
  • 在论文中,验证了大量先进的技巧对目标检测性能的影响,真的是非常良心!
  • 对当前先进的目标检测方法进行了改进,使之更有效,并且更适合在单GPU上训练;这些改进包括CBN、PAN、SAM等。

主要的改进思路如下所示:

  1. 输入端:在模型训练阶段,做了一些改进操作,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
  2. BackBone基准网络:融合其它检测算法中的一些新思路,主要包括:CSPDarknet53、Mish激活函数、Dropblock
  3. Neck中间层:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov4中添加了SPP模块、FPN+PAN结构
  4. Head输出层:输出层的锚框机制与YOLOv3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的DIOU_nms

4.2 网络结构

最简单清晰的表示: YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)


  上图展示了YOLOv4目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块。

  • 输入端-输入端表示输入的图片。该网络的输入图像大小为608*608,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv4使用Mosaic数据增强操作提升了模型的训练速度和网络的精度;利用cmBN及SAT自对抗训练来提升网络的泛化性能;
  • 基准网络-基准网络通常是一些性能优异的分类器种的网络,该模块用来提取一些通用的特征表示。YOLOv4中使用了CSPDarknet53作为基准网络;利用Mish激活函数代替原始的RELU激活函数;并在该模块中增加了Dropblock块来进一步提升模型的泛化能力 。
  • Neck网络-Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。YOLOv4利用SPP模块来融合不同尺度大小的特征图;利用自顶向下的FPN特征金字塔于自底向上的PAN特征金字塔来提升网络的特征提取能力。
  • Head输出端-Head用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv4利用CIOU_Loss来代替Smooth L1 Loss函数,并利用DIOU_nms来代替传统的NMS操作,从而进一步提升算法的检测精度

YOLOV4 基础组件:

  • CBM-CBM是Yolov4网络结构中的最小组件,由Conv+BN+Mish激活函数组成,如上图中模块1所示。
  • CBL-CBL模块由Conv+BN+Leaky_relu激活函数组成,如上图中的模块2所示。
  • Res unit-借鉴ResNet网络中的残差结构,用来构建深层网络,CBM是残差模块中的子模块,如上图中的模块3所示。
  • CSPX-借鉴CSPNet网络结构,由卷积层和X个Res unint模块Concate组成而成,如上图中的模块4所示。
  • SPP-采用1×1、5×5、9×9和13×13的最大池化方式,进行多尺度特征融合,如上图中的模块5所示。

完整的网络结构图如下:


YOLOv4的网络结构是由 CSPDarknet53、 SPP、 PANet、YOLOv3头部等组成,下面对各部分逐一讲解:

大家也可以点击Yolov4的netron网络结构图,

4.2.1 CSPDarknet53

在YOLOv4中,将CSPDarknet53作为主干网络。在了解CSPDarknet53之前,需要先介绍下CSPNet。
CSPNet来源于这篇论文:《CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN》
CSPNet开源地址: https://github.com/WongKinYiu/CrossStagePartialNetworks

CSPNet全称是Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用来解决以往网络结构需要大量推理计算的问题。作者将问题归结于网络优化中的重复梯度信息。CSPNet在ImageNet dataset和MS COCO数据集上有很好的测试效果,同时它易于实现,在ResNet、ResNeXt和DenseNet网络结构上都能通用。

CSPNet全称是Cross Stage Partial Networks,也就是跨阶段局部网络。CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸。如下图:

CSPNet实际上是基于Densnet的思想,复制基础层的特征映射图,通过dense block发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。CSPNet思想可以和ResNetResNeXtDenseNet结合,目前主要有CSPResNext50CSPDarknet53两种改造Backbone网络。

考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:

  • 更大的网络输入分辨率——用于检测小目标
  • 更深的网络层——能够覆盖更大面积的感受野
  • 更多的参数——更好的检测同一图像内不同size的目标

这样最终的CSPDarknet53结构就如下图:

CSPNet的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。

而在YOLOv4中,将原来的Darknet53结构换为了CSPDarknet53,其中包含了5个CSP模块。

每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用。

因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19

经过5次CSP模块后得到19*19大小的特征图。

CSP模块可以先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并起来,这样不仅减少了计算量,而且可以保证模型的准确率。它的优点包括:(1)增强CNN网络的学习能力,轻量化模型的同时保持模型的精度;(2)降低整个模型的计算瓶颈;(3)降低算法的内存成本。有关CSP模块的更多细节请看该论文。

这在原来的基础上主要进行了两项改变:

  • 将原来的Darknet53与CSPNet进行结合。在前面的YOLOv3中,我们已经了解了Darknet53的结构,它是由一系列残差结构组成。进行结合后,CSPnet的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。具体结构如下:

  • Mish激活函数-该激活函数是在2019年提出的,该函数是在Leaky_relu算法的基础上改进而来的,具体的比较请看下图。当x>0时,Leaky_relu与Mish激活函数基本相同;当x<0时,Mish函数基本为0,而Leaky_relu函数为λx。YOLOv4的Backbone中均使用了Mish激活函数,而后面的Neck网络中则使用了leaky_relu激活函数。总而言之,Mish函数更加平滑一些,可以进一步提升模型的精度。更多的细节请看该论文。

Mish是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU激活函数精度迅速下降,而Mish激活函数在训练稳定性、平均准确率(1%-2.8%)、峰值准确率(1.2% - 3.6%)等方面都有全面的提高。如下图:

Mish论文: https://arxiv.org/pdf/1908.08681.pd

4.2.2 SPP

SPP来源于这篇论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

SPP最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。如下图所示,就是SPP中经典的空间金字塔池化层。


在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化对上层输出的feature map进行处理。最大池化的池化核大小分别为13x13、9x9、5x5、1x1,其中1x1就相当于不处理。

  • SPP模块通过融合不同大小的最大池化层来获得鲁棒的特征表示,YOLOv4中的k={1*1,5*5,9*9,13*13}包含这4种形式。这里的最大池化层采用padding操作,移动步长为1,比如输入特征图的大小为13x13,使用的池化核大小为5x5,padding=2,因此池化后的特征图大小仍然是13×13。YOLOv4论文表明:(1)与单纯的使用k*k最大池化的方式相比,采用SPP模块的方式能够更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。(2)在COCO目标检测任务中,当输入图片的大小为608*608时,只需要额外花费0.5%的计算代价就可以将AP50提升2.7%,因此YOLOv4算法中也采用了SPP模块。

作者在SPP模块中,使用k={1*1,5*5,9*9,13*13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。

注意:这里最大池化采用padding操作,移动的步长为1,比如13×13的输入特征图,使用5×5大小的池化核池化,padding=2,因此池化后的特征图仍然是13×13大小。

4.2.3 PANet

论文链接:《Path Aggregation Network for Instance Segmentation》

这篇文章发表于CVPR2018,它提出的Path Aggregation Network (PANet)既是COCO2017实例分割比赛的冠军,也是目标检测比赛的第二名。PANet整体上可以看做是在Mask R-CNN上做多处改进,充分利用了特征融合,比如引入Bottom-up path augmentation结构,充分利用网络浅特征进行分割;引入Adaptive feature pooling使得提取到的ROI特征更加丰富;引入Fully-conneFcted fusion,通过融合一个前背景二分类支路的输出得到更加精确的分割结果。

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

下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。

  • FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
  • Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
  • Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
  • Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。

在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。

FPN+PAN-所谓的FPN,即特征金字塔网络,通过在特征图上面构建金字塔,可以更好的解决目标检测中尺度问题。PAN则是借鉴了图像分割领域PANet算法中的创新点,它是一种自底向上的结构,它在FPN的基础上增加了两个PAN结构,如下图中的2和3所示。(1)整个网络的输入图像大小为608*608;然后经过CSP块之后生成一个76*76大小的特征映射,经过下采样操作之后生成38*38的特征映射,经过下采样操作之后生成19*19的特征映射;(2)接着将其传入FPN结构中,依次对19*19、38*38、76*76执行融合操作,即先对比较小的特征映射层执行上采样操作,将其调整成相同大小,然后将两个同等大小的特征映射叠加起来。通过FPN操作可以将19*19大小的特征映射调整为76*76大小,这样不仅提升了特征映射的大小,可以更好的解决检测中尺度 问题,而且增加了网络的深度,提升了网络的鲁棒性。(3)接着将其传入PAN结构中,PANet网络的PAN结构是将两个相同大小的特征映射执行按位加操作,YOLOv4中使用Concat操作来代替它。经过两个PAN结构,我们将76*76大小的特征映射重新调整为19*19大小,这样可以在一定程度上提升该算法的目标定位能力。FPN层自顶向下可以捕获强语义特征,而PAF则通过自底向上传达强定位特征,通过组合这两个模块,可以很好的完成目标定位的功能。

对比Yolov3\Yolov说明

Yolov3结构:

我们先来看下Yolov3中Neck的FPN结构

可以看到经过几次下采样,三个紫色箭头指向的地方,输出分别是76*76、38*38、19*19。

以及最后的Prediction中用于预测的三个特征图①19*19*255、②38*38*255、③76*76*255。[注:255表示80类别(1+4+80)×3=255]

我们将Neck部分用立体图画出来,更直观的看下两部分之间是如何通过FPN结构融合的。

如图所示,FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。

Yolov4结构:

而Yolov4中Neck这部分除了使用FPN外,还在此基础上使用了PAN结构:

前面CSPDarknet53中讲到,每个CSP模块前面的卷积核都是3*3大小步长为2,相当于下采样操作。

因此可以看到三个紫色箭头处的特征图是76*76、38*38、19*19。

以及最后Prediction中用于预测的三个特征图:①76*76*255,②38*38*255,③19*19*255。

我们也看下Neck部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的。

和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。

其中包含两个PAN结构。

这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,这样的操作确实很皮。

FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。

不过这里需要注意几点:

注意一:

Yolov3的FPN层输出的三个大小不一的特征图①②③直接进行预测

但Yolov4的FPN层,只使用最后的一个76*76特征图①,而经过两次PAN结构,输出预测的特征图②和③。

这里的不同也体现在cfg文件中,这一点有很多同学之前不太明白,

比如Yolov3.cfg最后的三个Yolo层,

第一个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。

第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。

第三个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。

而Yolov4.cfg则恰恰相反

第一个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。

第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。

第三个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。

注意点二:

原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat(route)操作,特征图融合后的尺寸发生了变化。

这里也可以对应Yolov4的netron网络图查看,很有意思。

4.2.4 YOLOv3 Head

在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。YOLOv3的完整结构在上文已经详细介绍,下面我们截取了YOLOv3的Head进行分析:

YOLOv4学习了YOLOv3的方式,采用三个不同层级的特征图进行融合,并且继承了YOLOv3的Head。从上图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值(,),所以有:3 x (80+5)=255 。

4.3 各种Tricks总结

作者将所有的Tricks可以分为两类:

  • 在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法,作着称之为 “免费包”(Bag of freebies);
  • 只增加少量推理成本但能显著提高目标检测精度的插件模块和后处理方法,称之为“特价包”(Bag of specials)

下面分别对这两类技巧进行介绍。

4.3.1 免费包

以数据增强方法为例,虽然增加了训练时间,但不增加推理时间,并且能让模型泛化性能和鲁棒性更好。像这种不增加推理成本,还能提升模型性能的方法,作者称之为"免费包",非常形象。下面总结了一些常用的数据增强方法:

常见的正则化方法有:

  • 随机缩放
  • 翻转、旋转
  • 图像扰动、加噪声、遮挡
  • 改变亮度、对比对、饱和度、色调
  • 随机裁剪(random crop)
  • 随机擦除(random erase)
  • Cutout
  • MixUp
  • CutMix
  • GAN 样式转移GAN还用于数据增强,这样的使用可以有效地减少CNN学习到的纹理偏差。
  • GAN
  • DropOut
  • DropConnect
  • DropBlock

平衡正负样本的方法有:

  • Focal loss
  • OHEM(在线难分样本挖掘)

除此之外,还有回归 损失方面的改进:

  • GIOU
  • DIOU
  • CIoU

4.3.2 特价包

增大感受野技巧:

  • SPP
  • ASPP
  • RFB
  • ASPP(不同大小的空洞卷积)

  • RFB(空洞卷积+inception):RFB[47]仅需7%的额外推断时间,即可将MS-COCO上SSD的AP50提高5.7%。

注意力机制:

Squeeze-and-Excitation (SE) :虽然SE模块可以在ImageNet图像分类任务中以仅增加2%的计算量为代价提高ResNet50的功率1%top-1精度,但在GPU上,它通常会增加约10%的推理时间,因此更适合在移动设备中使用。

Spatial Attention Module (SAM):0.1%的额外计算,并且它可以提高ResNet50 SE 0.5%在ImageNet图像分类任务中的top-1精度。最重要的是,它根本不影响GPU上的推理速度。

特征融合集成:

  • FPN
  • SFAM:用SE模块对多尺度级联特征映射进行通道级重加权。

  • ASFF:使用softmax作为逐点重加权,然后添加不同尺度的特征映射。

  • BiFPN (出自于大名鼎鼎的EfficientDet)提出了多输入加权残差连接来进行尺度层次的加权,然后加入不同尺度的特征映射。

MiWRCMulti-input weighted residual connections的简称, 在BiFPN中,提出了用MiWRC来执行标尺度级重加权,添加不同尺度的特征映射。我们已经讨论了FPNPAN作为例子。下面的图(d)显示了另一种被称为BiFPNneck设计,根据BiFPN的论文,该设计具有更好的准确性和效率权衡。

上图中 (a)FPN引入自顶向下的路径,将多尺度特征从3级融合到7级(P3-P7);(b)PANETFPN之上增加一个额外的自下而上的路径;(c)NAS-FPN使用神经网络搜索找到一个不规则的特征拓扑网络,然后重复应用同一块拓扑结构;(d)是这里的BiFPN,具有更好的准确性和效率权衡。将该neck放到整个整个网络的连接中如下图:

上图采用EfficientNet作为骨干网络,BiFPN作为特征网络,共享class/box预测网络。 基于不同的资源约束,BiFPN层和类/盒网层都被重复多次。

更好的激活函数:

  • ReLU
  • LReLU
  • PReLU
  • ReLU6
  • SELU
  • Swish
  • hard-Swish

后处理非极大值抑制算法:

  • greedy NMS
  • soft-NMS
  • DIoU NMS

想具体了解作者通过大量实验,选择了哪些Tricks?可戳我上一篇文章:YOLOv4 怎么学,看完这一篇就够了!

4.3.3 Dropblock

Dropblock是一种解决模型过拟合的正则化方法,它的作用与Dropout基本相同。Dropout的主要思路是随机的使网络中的一些神经元失活,从而形成一个新的网络。如下图所示,中间图表示经过Dropout操作之后的结果,它使得图像中的一些位置随机失活,随机删除减少神经元的数量,使网络变得更简单。

Dropblock的作者认为:由于卷积层通常是三层结构,即卷积+激活+池化层,池化层本身就是对相邻单元起作用,因而卷积层对于这种随机丢弃并不敏感。除此之外,即使是随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。最右边表示经过Dropblock操作之后的结果,我们可以发现该操作直接对整个局部区域进行失活(连续的几个位置)。

  Dropblock是在Cutout数据增强方式的基础上改进而来的,Cutout的主要思路是将输入图像的部分区域清零,而Dropblock的创新点则是将Cutout应用到每一个特征图上面。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。与Cutout相比,Dropblck主要具有以下的优点:(1)实验效果表明Dropblock的效果优于Cutout;(2)Cutout只能应用到输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上面;(3)Dropblock可以定制各种组合,在训练的不同阶段可以灵活的修改删减的概率,不管是从空间层面还是从时间层面来讲,Dropblock更优一些。

4.3.4 CIOU_loss

CIOU_loss-目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成,回归损失函数的发展过程主要包括:最原始的Smooth L1 Loss函数、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函数。
1、IoU Loss-所谓的IoU Loss,即预测框与GT框之间的交集/预测框与GT框之间的并集。

IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。

这种损失会存在一些问题,具体的问题如下图所示,(1)如状态1所示,当预测框和GT框不相交时,即IOU=0,此时无法反映两个框之间的距离,此时该 损失函数不可导,即IOU_Loss无法优化两个框不相交的情况。(2)如状态2与状态3所示,当两个预测框大小相同时,那么这两个IOU也相同,IOU_Loss无法区分两者相交这种情况。

2、GIOU_Loss-Generalized IoU 为了解决以上的问题,GIOU损失应运而生。GIOU_Loss中增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时存在的一些问题。

考虑到,当检测框和真实框没有出现重叠的时候IoUloss都是一样的,因此GIoU就加入了C检测框(C检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。但是当检测框和真实框之间出现包含的现象的时候GIoU就和IoU loss是同样的效果了。



但是这种方法并不能完全解决这种问题,仍然存在着其它的问题。具体的问题如下所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
3、DIOU_Loss-Distance IoU

DIoU计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU包含出现的问题。

好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。

针对IOU和GIOU存在的问题,作者从两个方面进行考虑

一:如何最小化预测框和目标框之间的归一化距离?

二:如何在预测框和目标框重叠时,回归的更准确?

针对IOU和GIOU损失所存在的问题,DIOU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIOU_Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss的收敛速度更快一些。

 是指predict boxGT box中心点的距离的平方,而c2是指刚好能包含predict boxGT box的最小box的对角线长度平方。


如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。为了解决这个问题,CIOU_Loss应运而生。

4、CIOU_Loss-Complete IoU在DIOU_Loss的基础上增加了一个影响因子,将预测框和GT框的长宽比也考虑了进来。具体的计算方法如下式所示,即CIOU_Loss将GT框的重叠面积、中心点距离和长宽比全都考虑进来了。

CIOU只是在DIOU基础上增加了一项αv


其中v是衡量长宽比一致性的参数,我们也可以定义为:


 再来综合的看下各个Loss函数的不同点:

IOU_Loss:主要考虑检测框和目标框重叠面积。

GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。

DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。

CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些

4.3.3 DIOU_NMS

Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,

Yolov4则借鉴上面D/CIOU loss的论文:https://arxiv.org/pdf/1911.08287.pdf

将其中计算IOU的部分替换成DIOU的方式:

DIOU_NMS-如下图所示,对于重叠的摩托车检测任务而言,传统的NMS操作会遗漏掉一些中间的摩托车;由于DIOU_NMS考虑到边界框中心点的位置信息,因而得到了更准确的检测结果,适合处理密集场景下的目标检测问题。

在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。

因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms

注意:有读者会有疑问,这里为什么不用CIOU_nms,而用DIOU_nms?

答:因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。

但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可

4.4 改进方法

为了改进对象检测训练过程,CNN通常使用以下方法:

  • 激活函数:ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish
  • 边界框损失函数:MSE, IoU, GIoU, CIoU, DIoU
  • 数据增强:CutOut, MixUp, CutMix
  • 正则化方法:DropOut, DropPat,Spatial DropOut, or DropBlock
  • Normalization:Batch Normalization (BN) , Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN) , or Cross-Iteration Batch Normalization (CBN)
  • Skip-connections:Residual connections, Weighted residual connections, Multi-input weighted residual connections, or Cross stage partial connections (CSP)

对于激活函数,PReLU和SELU难以训练,ReLU6是专门为量化网络设计,因此我们从候选列表中删除了这些激活函数。

对于正则化方法,DropBlock的作者已经和其他方法进行了比较,并且优于其他方法,因此我们直接选择DropBlock作为我们的正则化方法。

对于Normalization,我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。

除了下面已经提到的各种Tricks,为了使目标检测器更容易在单GPU上训练,作者也提出了5种改进方法:

4.4.1 Mosaic

  • YOLOv4中在训练模型阶段使用了Mosaic数据增强方法,该算法是在CutMix数据增强方法的基础上改进而来的。CutMix仅仅利用了两张图片进行拼接,而Mosaic数据增强方法则采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成,具体的效果如下图所示。这种增强方法可以将几张图片组合成一张,这样不仅可以丰富数据集的同时极大的提升网络的训练速度,而且可以降低模型的内存需求。

4.4.2 SAT自对抗训练Self-Adversarial Trainin

SAT为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测.

Self-Adversarial Training是在一定程度上抵抗对抗攻击的数据增强技术。CNN计算出Loss, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。

4.4.3 CmBN策略

BN就是仅仅利用当前迭代时刻信息进行norm,而CBN在计算当前时刻统计量时候会考虑前k个时刻统计量,从而实现扩大batch size操作。同时作者指出CBN操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些,比GN还慢。

CmBNCBN的改进版本,其把大batch内部的4mini batch当做一个整体,对外隔离。CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,不再滑动cross,其仅仅在mini batch内部进行汇合操作,保持BN一个batch更新一次可训练参数。

CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:

BN:无论每个batch被分割为多少个mini batch,其算法就是在每个mini batch前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行NomalizationBN数据与其他mini batch的数据无关。CBN:每次iteration中的BN数据是其之前n次数据和当前数据的和(对非当前batch统计的数据进行了补偿再参与计算),用该累加值对当前的batch进行Nomalization。好处在于每个batch可以设置较小的sizeCmBN:只在每个Batch内部使用CBN的方法,个人理解如果每个Batch被分割为一个mini batch,则其效果与BN一致;若分割为多个mini batch,则与CBN类似,只是把mini batch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿。

4.4.3 修改过的SAM

注意力机制在DL设计中被广泛采用。在SAM中,最大值池化和平均池化分别用于输入feature map,创建两组feature map。结果被输入到一个卷积层,接着是一个Sigmoid函数来创建空间注意力。

YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化。
作者在原SAM(Spatial Attention Module)方法上进行了修改,将SAM从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的feature map,得到两组shape相同的feature map,再将结果输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。

将SAM(Spatial Attention Module)应用于输入特征,能够输出精细的特征图。


在YOLOv4中,对原来的SAM方法进行了修改。如下图所示,修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力。作者认为,采用这种方式创建的是点注意力。

(5)修改过的PAN
作者对原PAN(Path Aggregation Network)方法进行了修改, 使用张量连接(concat)代替了原来的快捷连接(shortcut connection)。如下图所示:

注:想具体了解原PANet网络结构,可参考上文中的PANet介绍部分。

4.5 性能表现

如下图所示,在COCO目标检测数据集上,对当前各种先进的目标检测器进行了测试。可以发现,YOLOv4的检测速度比EfficientDet快两倍,性能相当。同时,将YOLOv3的AP和FPS分别提高10%和12%,吊打YOLOv3!

综合以上分析,总结出YOLOv4带给我们的优点有:

  • 与其它先进的检测器相比,对于同样的精度,YOLOv4更快(FPS);对于同样的速度,YOLOv4更准(AP)。
  • YOLOv4能在普通的GPU上训练和使用,比如GTX 1080Ti和GTX 2080Ti等。
  • 论文中总结了各种Tricks(包括各种BoF和BoS),给我们启示,选择合适的Tricks来提高自己的检测器性能。

5.YoloV4相关代码

5.1 python代码

代码地址:https://github.com/Tianxiaomo/pytorch-Yolov4

作者的训练和测试推理代码都已经完成

5.2 C++代码

Yolov4作者Alexey的代码,俄罗斯的大神,应该是个独立研究员,更新算法的频繁程度令人佩服。

在Yolov3作者Joseph Redmon宣布停止更新Yolo算法之后,Alexey凭借对于Yolov3算法的不断探索研究,赢得了Yolov3作者的认可,发布了Yolov4。

代码地址:https://github.com/AlexeyAB/darknet

5.3 python版本的Tensorrt代码

目前测试有效的有tensorflow版本:weights->pb->trt

代码地址:https://github.com/hunglc007/tensorflow-Yolov4-tflite

5.4 C++版本的Tensorrtrt代码

代码地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov4

作者自定义了mish激活函数的plugin层,Tensorrt加速后速度还是挺快的。

6. Yolov5核心基础知识完整讲解

因为Yolov5的核心基础知识点也很多,可以查看大白的另一篇文章。

江大白:深入浅出Yolo系列之Yolov5核心基础知识完整讲解2004 赞同 · 379 评论文章正在上传…重新上传取消

7. Yolov5之自有数据集训练超详细教程

大白使用人头数据集,对于Yolov5进行训练,并记录成超级详细的训练教程。

江大白:深入浅出Yolov5之自有数据集训练超详细教程27 赞同 · 0 评论文章正在上传…重新上传取消

8.Yolox核心基础知识完整讲解

旷视科技发布的Yolox有很多干货,可以查看大白的另一篇Yolox文章。

江大白:深入浅出Yolo系列之Yolox核心基础完整讲解565 赞同 · 166 评论文章正在上传…重新上传取消

9. Yolox之自有数据集训练超详细教程

对于Yolox,大白也使用人头数据集,对于Yolox进行训练,并记录成超级详细的训练教程。

江大白:深入浅出Yolox之自有数据集训练超详细教程141 赞同 · 50 评论文章正在上传…重新上传取消

10.相关数据集下载

人工智能行业,除了算法,数据是非常重要的金矿。

比如在目标检测项目中,需要检测人体,那我们就需要人体数据集。当需要检测车辆,就需要车辆数据集。

为了便于大家查找相关数据集,大白将梳理的所有的数据集进行汇总,便于大家对应查看。

(1)260+各类公开数据集

可以根据不同的需求,筛选出自己需要的数据集,在官网中进行下载。

数据集链接:点击查看

(2)数十个可下载数据集

大白将一些收集的数据集,以及购买的部分数据集,都放在百度网盘中,可以进行下载。

下载链接:点击查看

(3)花费过万购买的数据集

在从事AI行业的这三年中,大白零零散散,花费了一万多,购买了各类项目中所需要的数据集。

而且为了便于大家了解不同的数据集,算法功能、类别标签等详细信息,大白还制作了数据集管理文档,甚至在每行最后贴上了数据集图片,可以直接点击打开,查看是否自己需要的数据。

数据集管理文档清单链接:点击查看

数据集下载方式:点击查看

参考原文:

深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎

YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)_不积跬步,无以至千里!-CSDN博客_yolov1到yolov4

YOLOv4算法详解_WZZ18191171661的博客-CSDN博客_yolov4算法

YOLOv4 介绍及其模型优化方法 - 知乎

目标检测算法YOLOv4详解 - 云+社区 - 腾讯云

深度学习之学习(3-4)YOLOV4相关推荐

  1. DSML:深度子空间相互学习模型(用于癌症亚型预测)

    目录 背景描述 模型架构 数据表示 Single level omics data representation learning model(单级组学数据表示学习模型) Multi-level om ...

  2. 2020人工智能课程超级大列表:深度学习-强化学习-图神经网络-自然语言处理等...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本篇博文主要为大家介绍一个课程网站,汇集了机器学习,深度学习.强化学习的各个方面, ...

  3. 深度强化元学习教程---元学习概述

    深度强化元学习是近期深度学习技术的一个另人瞩目的新兴领域,其利用元学习,解决了深度学习需要大数据集的问题,以及强化学习收敛慢的问题.同时元学习还可以适用于环境不断改变的应用场景,具有巨大的应用前景. ...

  4. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  5. reddit高赞资源:20h系统性深度学习强化学习课程,视频、PPT、代码全都有 | 免费...

    子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 告别"拼图式"学习! 最近,一套深度学习和强化学习的免费课程在reddit上引起网友关注,获赞690+. 只因其不仅形式 ...

  6. 【原创】分享一些机器学习和深度学习的学习资料

    如果你还在苦苦寻找机器学习和深度学习入门资料的话,或许可以看看本文我的一些推荐,这些材料我自己都学过一遍,分享一下点评,希望对你有帮助.注意,本文只是点评这些资源,不提供任何资源的盗版下载,所有资源我 ...

  7. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(八)

     Deep Learning(深度学习)学习笔记整理系列之(八) 分类: Deep Learning 机器学习 Linux驱动2013-04-10 11:4257652人阅读评论(25)收藏举报 ...

  9. 爱奇艺深度语义表示学习的探索与实践

    导读:基于学术界和工业界经验,爱奇艺设计和探索出了一套适用于爱奇艺多种业务场景的深度语义表示学习框架.在推荐.搜索.直播等多个业务中的召回.排序.去重.多样性.语义匹配.聚类等场景上线,提高视频推荐的 ...

  10. Deep Learning(深度学习)学习笔记整理系列三

    Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明 ...

最新文章

  1. Lambda表达式介绍
  2. dfs题目这样去解题,秒杀leetcode题目
  3. 你认识的python有你想的那么神吗_Python的10个神奇的技巧
  4. 【2017年第1期】基于征信数据观中国近10年产业间信贷资源的调整路径
  5. C/C++ Native 包大小测量
  6. 深度学习入门(一):LeNet-5教程与详解
  7. Jenkins+git 实现代码自动发布
  8. swing tree 去掉双击默认展开 关闭_如何保护自己的电脑,关闭危险端口(一)
  9. 在计算机网络中vc是,计算机网络——第一章 体系
  10. java 日期年度 35变2035_连接IBM MQ原因码报2035的错误解决办法
  11. Network 第三篇 - STP生成树协议
  12. php pathinfo 解析,php 解析pathinfo 类
  13. JavaScript字符编码
  14. JAVA 分布式 - 分布式介绍
  15. 想让Word文档更整齐,这五个Word排版技巧少不了
  16. 胖哥和几个群友写了个好用的OAuth2授权服务器
  17. 百度地图添加家的位置图文教程
  18. 我来侃手机--连载二之四十岁的女人,风韵犹存
  19. 汽车重点转向驾驶员监控系统
  20. python入门简单教学

热门文章

  1. Android自定义锁屏的实现
  2. 麻将开金算法java代_通用麻将胡牌算法
  3. 输入一个n维矩阵,输出它的转置矩阵
  4. 【汇正财经】股票开盘价收盘价是什么?最高价和最低价呢?
  5. 《IDSSIM:基于改进的疾病语义相似度方法的lncRNA功能相似度计算模型》论文梳理
  6. Oracle analytics server(OAS) 支持 mysql 社区版配置
  7. 7-38 数列求和-给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
  8. 结巴分词 java_Java版结巴分词自定义词库
  9. 2、进入缓冲区(缓存)的世界,破解一切与输入输出有关的疑难杂症(转载自C语言中文网,仅作学习笔记)
  10. [LLVM]LLVM入门 ---llvm 代码结构