Yolov4学习笔记

前言

2020年4月,Alexey Bochkovskiy接过YOLO之父Joseph Redmon的大旗,发布了Yolo的第四个版本,Yolov4。可以看出,yolo的更新速度是真的快,其准确率和速度涨的也是飞起。

coco数据集上的平均精度AP和帧率精度FPS分别提高了10%和12%,也得到了Redmon的认可,也是当年最强的实时对象检测模型之一。

论文题目:YOLOv4: Optimal Speed and Accuracy of Object Detection
论文链接:https://arxiv.org/abs/2004.10934

整篇文章一共17页,相当多了,但其实参考文献和实验结果就占用了7页,整篇文章的实验相当充实,总结了大部分的检测技巧,经过筛选,排列组合的方式选择最有效的方法。

整篇文章看下来,感觉是有点乱的,乱的感觉应该是内容太多,看着看着不知道看到哪儿了。老规矩,先放yolov4整体结构图

Yolov4学习笔记_第1张图片
是不是看起来跟yolov3很像,只不过变换了其中的一些模块,因此就像搭积木一样,但是怎么让积木搭建完更好用,就是需要研究的了。

这里先总结一下基本的组件:
组件一:CBM = Conv + Bn + Mish
组件二:CBL = Conv + Bn + Leaky relu
组件三:Res Unit = (to add)CBM + CBM – add
组件四:CSPX: 由卷积层和X个Res Unit模块Concate组成
组件五:SPP采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

从整体图看起来,输入图像,最后输入三个尺度的特征图,这就是跟yolov3一毛一样,但是为啥性能更好呢。

论文简述

在说创新点前,先总结下整篇文章。

  1. 引言
    作者最重要的说了一点,”任何使用传统GPU进行训练和测试的人都可以获得实时、高质量和令人信服的目标检测结果“。

也就是说,大家能用买得起的机器就能在实际中应用,这点我是非常赞同的,你当然可以直接上最好的计算显卡训练做实验发论文,但实际中考虑到成本问题,又怎么落地呢。比如现在想要一块4090的我。

引言最后,作者总结了本文贡献也说明了这一情况。

(1)开发了一个高效、强大的目标检测模型。使用单个1080 Ti或2080 Ti GPU就能训练一个超级快速和精确的目标探测器。
(2)验证了在检测器训练过程中,最先进的Bag-of-Freebies 和Bag-of-Specials对目标检测方法的影响。
(3)修改了最先进的方法,使其更有效,更适合于单GPU训练,包括CBN[89]、PAN[49]、SAM[85]等。。

这里Bag-of-FreebiesBag-of-Specials在后续有详细的介绍。

  1. 相关工作
    2.1 目标检测模型
    这部分总结了目标检测两阶段和单阶段算法的基本结构。

两阶段算法:R-CNN ,fast R-CNN , faster R-CNN ,R-FCN, and Libra R-CNN
单阶段算法:YOLO, SSD , and RetinaNet
无锚框的单阶段算法:CenterNet , CornerNet , FCOS

整体的文字性总结如下:
Input: Image, Patches, Image Pyramid
Backbones: VGG16 , ResNet-50, SpineNet, EfficientNet-B0/B7 , CSPResNeXt50 , CSPDarknet53
Neck:
• Additional blocks: SPP,ASPP , RFB, SAM
• Path-aggregation blocks: FPN , PAN, NAS-FPN , Fully-connected FPN, BiFPN ,ASFF , SFAM
Heads:
Dense Prediction (one-stage): RPN , SSD , YOLO, RetinaNet (anchor based)
◦ CornerNet, CenterNet , MatrixNet , FCOS (anchor free)
• Sparse Prediction (two-stage): ◦ Faster R-CNN , R-FCN , Mask RCNN (anchor based)
◦ RepPoints (anchor free)

有些看上去是不是有些很熟悉,很多分类网络,很多特征融合结构,很多检测方法。

作者总结了目标检测一般性的结构图,其实就是输入,主干网络,颈部网络,检测头
Yolov4学习笔记_第2张图片
2.2 Bag of freebies 免费赠品
作者在这里强调了,”通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。“

因此,将只改变培训策略或只增加培训成本的方法称为“免费包”

免费包策略大致总结:

数据增强:
数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性
光度失真photometric distortions:brightness, contrast, hue, saturation, and noise of an image调整图像的亮度、对比度、色调、饱和度和噪点
几何失真geometric distortions:scaling, cropping, flipping, and rotating
模拟物体遮挡:random erase 、CutOut、hide-and-seek、grid mask、MixUp、CutMix

数据不平衡问题
在两阶段目标检测器中的方法:hard negative example mining和online hard example mining
适用于单阶段的方法:focal loss

不同类别关联程度的关系的one-hot问题:
label smoothing,knowledge distillation

BBOX的目标函数的回归 objective function of Bounding Box (BBox) regression
传统方法一般是MES计算BBOX的中心点坐标和宽,高,x_center,y_center,w,h

后续的方法:IOU loss、GIoU loss、DIoU loss、CIoU loss

这里可以看出许多现在常用的方法。

当然,除了免费的,还有特殊的。

当然这里免费和特品翻译是不准确的,不过大致是那个意思。

2.3 特品包策略Bag of specials大致总结:

对于那些只增加少量推理成本,却能显著提高目标检测精度的插件模块和后处理方法,我们称之为“特品包”。

增强感受野的模块
SPP , ASPP, and RFB

注意力机制 attention module
channel-wise attention:Squeeze-and-Excitation (SE)
pointwise attention:Spatial Attention Module (SAM)

功能集成方面feature integration

early practice早期方法:skip connection or hyper-column(将低级物理特征集成到高级语义特征)
随着FPN等多尺度预测方法的普及,许多集成了不同特征金字塔的轻量化模块应运而生:
SFAM , ASFF , and BiFPN

激活函数good activation function
一个好的激活函数可以使梯度更有效地传播,同时不会造成过多的额外计算开销

ReLU(2010)、LReLU , PReLU , 、Linear Unit (SELU) , Swish , and Mish ReLU6 、 hard-Swish

基于深度学习的目标检测中常用的后处理方法是NMS,它可以过滤掉对同一目标预测不好的bbox,只保留响应较高的候选bbox
greedy NMS、soft NMS、The DIoU NMS

从上面可以看出,Bag of freebies和Bag of specials的种类是非常多的,适用于不同的情况。

而且内容是非常非常多的,所以想真正了解还需要去实际了解每个策略的方法才能懂的。

从第三章开始,作者就从不同方面组合实验,并且提出了新的不同的方法进行改进,之后就是丰富的实验,分析,结论,内容是非常多的,因此这里简述论文就结束,下面直接看作者的改进点吧。

作者的改进点也是非常多的,可以说借鉴了大量顶尖会议的顶尖策略做了大量实验,这工作量牛了。

YOLOv4的改进

改进一:Mosaic数据增强、cmBN、SAT自对抗训练,Class label smoothing

1.Mosaic数据增强方式:借鉴了CutMix的思想(混合了两张图像),这里提出的Mosaic随机混合四张图像,随机缩放、随机裁剪、随机排布。四张不同图像的上下文信息被混合,这样在BN在计算信息时候,也就减少了mini-batch的尺寸,进而对与单张GPU运算有好处。

Yolov4学习笔记_第3张图片
2.自我对抗训练(SAT)
代表了一种新的数据增强技术,它分为两个向前和向后的阶段。在第一阶段,神经网络改变原始图像,而不是改变网络权重。通过这种方式,神经网络对自己进行对抗性攻击,改变原始图像以制造图像上没有期望对象的欺骗。在第二阶段,训练神经网络以正常方式检测修改后的图像上的物体。

这里作者并没有过多的解释,让gpt来解释下具体过程:

其实现方式通常可以分为以下几个步骤:

训练一个基本的分类器网络,如卷积神经网络(CNN)或全连接神经网络(FCN),用于解决一个特定任务。
在训练过程中,引入随机扰动或正则化项来增加模型输出的不确定性。这通常可以通过添加dropout、噪声注入或权重衰减等方法来实现。
对模型输出进行扰动,产生对抗样本。通常可以使用FGSM(Fast Gradient Sign Method)或PGD(Projected Gradient Descent)等方法来生成对抗样本。
使用这些对抗样本重新训练模型,以增加模型鲁棒性。这一步通常称为“对抗训练”。
可以反复执行步骤3和步骤4,直到模型在对抗样本上表现出足够的鲁棒性。

需要注意的是,使用自对抗训练可以提高模型的鲁棒性,但同时也会降低模型的准确率。因此,需要根据具体任务和数据集的特点,权衡准确率和鲁棒性之间的取舍。

通过解释可以发现,主要是增加扰动来增加对抗样本,以增强鲁棒性,但准确度会打折扣。

3.CmBN:
CmBNCBN的进一步改进,
BN是在YOLOV2中开始使用的方法,主要是为了解决:在训练迭代过程中,由于网络参数的更新,网络激活的分布会发生变化。这种转变通常被认为是对网络训练的破坏,BN通过在每次迭代中通过在小批量内的样本计算出的网络激活的均值和方差,进行标准化来缓解这个问题。例如每个batch中有五个样本,那么经过第一个神经元输出后,就对当前层的进行BN处理。但缺陷是只在batch size大的时候才起作用。

CBN 和 CmBN 所做的就是如何使用多个独立的 mini-batch 的数据获得一个近似于更大 batch 的统计量以提升学习效果。

**CBN:**为了解决小Batch size时候,让BN使用更加有效,是一种补偿迭代过程中网络权值变化的方法。Cross-Iteration Batch Normalization (CBN) 的动机是观察到由于随机梯度下降(SGD)的迭代性质,网络权值在连续训练迭代之间逐渐变化,而不是突然变化。因此,针对当前网络权重,最近迭代的样本的均值和方差可以通过一个低阶泰勒多项式很好地逼近。将最近多次迭代的补偿均值和方差与当前迭代的均值和方差进行平均,以产生更好的统计估计。每次iteration中的BN数据是其之前n次数据和当前数据的和,用该累加值对当前的batch进行Nomalization。这样的话就可以设置小一点的batch size。CBN这里是对当前以及当前往前数3个mini-batch的结果进行归一化。

而本文中的CmBN: CmBN 在整个批次中使用CBN收集统计数据,而非在单独的mini-batch中收集统计数据。每个Batch分成多个mini batch,则与CBN类似,只在自己Batch内部进行,权重的信息是相同的。

Yolov4学习笔记_第4张图片
4.Class label smoothing
Label Smoothing 标签平滑,常常被用在分类网络中来作为防止过拟合的一种手段,整体方案简单易用,在小数据集上可以取得非常好的效果
它主要怎么解决问题呢,举个例子。
如在硬标签中,设置猫咪、狗的标签为[0,1],如果此时计算预测,那么这种预测对于狗的自信程度是100%。
但如果训练数据中存在了错误数据,就会导致上面这种方法出现偏差。
因此引入Label Smoothing,让标签变得平滑些,其中引入一个因子factor,让标签变得平滑,如0.1
则标签变成[0.05,0.9]。此时再去计算损失函数时,其正确和错误的影响都将变小。

Yolov4学习笔记_第5张图片

改进二:CSPDarknet53,Mish, DropBlock regularization

在选择Backbone时,作者做了很多实验。
1.CSPDarknet53
首先,在ILSVRC2012 (ImageNet)数据集上,CSPResNext50在对象分类方面比CSPDarknet53要好得多。
其次,CSPDarknet53在检测MS COCO数据集上的对象方面比CSPResNext50更好。

同时,从更高的输入网络大小(分辨率)-用于检测多个小尺寸对象、更多的层、更多参数以检测不同大小物体方面考虑,通过对比实验,如表一,最终选择了CSPDarknet53。
Yolov4学习笔记_第6张图片
这里作者借鉴了2019CVPR的CSPNet模型的思想,将CSP模块引入到Darknet53中,而CSPNet解决了梯度信息重复问题,并获取更丰富的梯度融合信息并降低计算量。

在CSPNet原文中在ImageNet数据集上以同等甚至更高的精度减少了20%的计算量,并且在MS COCO目标检测数据集上的AP50方面显著优于最先进的方法。这个计算量的减少也太牛了。
简单来说,网络更轻量化而准确度不减

CSP的好处,原文中是这样描述的:
1.Strengthening learning ability of a CNN 加强CNN的学习能力
2.Removing computational bottlenecks 消除计算瓶颈
3.Reducing memory costs 降低内存成本

原文中设计的是b图。其实仔细对比YOLOV3中的结构图发现,这里只是构造了新的CSP模块,其中同样借鉴了ResNet短连接的思想,但这样的模块却起到了很好的效果。
Yolov4学习笔记_第7张图片

Yolov4学习笔记_第8张图片
2.Mish激活函数
从整体网络结构图中的CBM模块可以发现,最后利用了Mish激活函数进行了替换(原YOLOV3是Leaky Relu)。那么它有什么好处吗?

Mish是光滑的非单调激活函数,可定义为:

f(x) = x・tanh(ς(x))

其中, ς(x) = ln(1+e^x)

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

在YOLOV4中实验结果也证明了这一点。
Yolov4学习笔记_第9张图片
Yolov4学习笔记_第10张图片
3.DropBlock regularization
这种方法主要针对原Dropout进行了改进,原Dropout是随机丢弃神经元信息,而DropBlock是选择区域丢弃,来起到减少参数的作用。
在DropBlock: A regularization method for convolutional networks一文中,用下图阐释了原因。主要目的是删除语义信息,来去除狗狗的头或者脚,这样做,强制剩余单元来学习分类的特征。这确实有点太粗暴了,不过是为了让网络分类更聪明。
Yolov4学习笔记_第11张图片

改进三:SPP,PAN,SAM

SPP Spatial Pyramid Pooling,恺明大神提出的方法,原文题目是Spatial pyramid pooling in deep convolutional networks for visual recognition,空间金字塔池化,从字面理解就是不同的池化层进行pooling,最终累积成相同尺寸的特征图输出,由于不同特征图尺寸不同,类似于金字塔一样。所谓的空间金字塔池化层,就是利用多个不同大小的池化核提取出固定大小的特征数

从总的结构图中可以发现,SPP加在了backbone后面,这样可以方便后面的Concat。

SPP也在YOLOV3中被改进应用过,即YOLOV3-SPP。

而SPP解决了CNN要求输入固定尺寸大小的图片的问题,原文中示意图如下。
Yolov4学习笔记_第12张图片
相比起来。下图中理解模块更加容易:
Yolov4学习笔记_第13张图片
PAN: Path aggregation network for instance segmentation.用于实例分割的路径聚合网络。
PAN也是对FPN特征融合的一种改进;一是针对底层特征流向高层特征的路线过长的问题,加入了Bottom-up的短线路;二是针对proposal只在一个特征层上进行预测的问题,提出了 adaptive feature pooling,进行特征融合。

在(a)中是FPN网络,从低层到高层的传播信息在逐渐减少,当网络层数多的时候,如100多层,那么低层的定位信息将损失很多,因此额外引出一条绿线,低层的P2仅仅经过几个卷积N2-N5就可以完成位置信息的传播。
Yolov4学习笔记_第14张图片
而Ni和Pi+1的融合是通过如下方式,每个特征图Ni首先经过一个3×3的卷积层,步长2,以减小空间大小。然后将特征图Pi+1和下采样图的每个元素通过横向连接相加。融合后的特征图再经过另一个3×3卷积层处理,生成Ni+1,用于以下子网络。
Yolov4学习笔记_第15张图片
而作者在这里修改了Ni和Pi+1的传播,由原来的相加add改为concate。这里左边最终生成一块,而右面是堆叠的两块,这样做的好处是不改变图像原像素(原来的add由于直接相加,两个数字变成一个数字改变了原有位置的像素),保留了原始特征信息
Yolov4学习笔记_第16张图片
SAM:
这个的起源是Convolutional Block Attention Module,这是网络设计关注的另外一个因素,注意力
通过注意力机制来增加网络的表征力:关注重要特征,抑制不必要特征

卷积运算是通过将 跨通道信息和空间信息混合 在一起来提取信息特征的 ;
因此提出了 CBAM 来强调通道轴和空间轴这两个主要维度上的有意义特征 ;
并对此依次应用了 Channel Attention Module (通道注意模块) 和 Spatial Attention Module (空间注意模块)

下图是CBAM模块,模块轻量化,可以说拿来放在网络任何处都可以。
Yolov4学习笔记_第17张图片

这里可以看出,CBAM主要又由两个模块组成,CAM和SAM。
Yolov4学习笔记_第18张图片
CAM是经过了MxaPool和AvgPool(经过验证,这样做更有效),主要将原始特征图(CHW)通过平均池化和最大池化处理并变换尺寸得到(C,H*W),之后通过MLP得到通道注意力权重,再通过Sigmoid函数获得归一化注意力权重,最终通过乘法逐通道的加权到原始输入特征图上,完成通道注意力对原始特征的标定。

SAM与通道注意模块不同的是,空间注意模块关注的是信息部分 “在哪里” ,作为通道注意模块的补充 ;主要流程上,首先将原始特征(b,c,h,w)(batch size,channel,heigth,weight)在通道维度采取平均和最大池化(b,1,h,w),然后将两者拼接(concat)(b,2,h,w),使得通道数为2,然后再拼接后的特征图上使用卷积(7x7)操作降维(b, 1, h, w),最终经过sigmoid激活函数标来产生空间注意力权重,对特征图进行标定

这里可以看出CAM和SAM的关注点是不一样的,一个更加关注通道,一个更加关注空间

而在YOLOV4中,作者又对SAM进行了更改,直接卷积操作,取消了最大池化和平均池化。
Yolov4学习笔记_第19张图片

改进四:anchor偏移机制、IOU

Yolov3中已经进行了anchor的边界限制,而sigmoid函数在x趋近于正负无穷的时候才能无限接近于1,导致某些中心点在网格顶点的目标无法较好的被预测到,因此添加了相应因子,消除网格敏感度。这里添加了scale,后面总结中,代号简称S

Yolov4学习笔记_第20张图片
2. IOU方法对比
文章对比了不同的IOU方法:

MSE是均方误差(Mean Squared Error)的缩写,用来衡量预测值与真实值之间的误差。计算方式为预测值与真实值之差的平方值的平均数

IOU是交并比(Intersection Over Union)的缩写,用来衡量两个物体框之间的重叠程度。计算方式为两个框的交集面积除以它们的并集面积
缺点:1.如果两个目标没有重叠,则无法计算损失;2.重叠面积相同,但无法反应真实重合度情况。如下图。

Yolov4学习笔记_第21张图片
GIOU是广义交并比(Generalized Intersection Over Union)的缩写,是一种改进的交并比计算方法,将IOU的缺陷进行了修正,可以更为准确地评估两个物体框之间的重叠程度

GIOU在IOU后面增加了一项,计算两个框的最小外接矩形C,从而解决梯度为零的情况。

这里如果没有重叠,则IOU=0,离得越远,接近-1;重合则为0;
Yolov4学习笔记_第22张图片
Yolov4学习笔记_第23张图片
缺点:
1.两个框是包含关系的时候,退化成IOU。
Yolov4学习笔记_第24张图片
2.当无重合,两个框水平距离相同,但在垂直方向移动的时候,仍然无法对于损失起到很大的作用。
Yolov4学习笔记_第25张图片
DIOU是距离交并比(Distance Intersection Over Union)的缩写,是GIOU的扩展,在计算时考虑了物体框之间中心点的距离,可以比GIOU更为准确地衡量目标检测的性能

考虑到GIOU的损失计算仍然不够科学,DIOU代替了最小外接框方法,使用了最小化两个BBox中心点的标准化距离,即欧氏距离。d是最小化框的对角线长度。

Yolov4学习笔记_第26张图片
Yolov4学习笔记_第27张图片
即使如此,仍然没有考虑到相同面积下,长宽纵横比的情况。即相交中心点,面积相同,但长宽比例不同
Yolov4学习笔记_第28张图片
CIOU是完整性交并比(Complete Intersection Over Union)的缩写,是DIOU的扩展,可以同时考虑目标检测框的大小、位置和形状,比DIOU更为准确

CIOU在DIOU基础上,增加权重系数α和宽高比v。
Yolov4学习笔记_第29张图片
Yolov4学习笔记_第30张图片
简单总结:
IOU:交并比面积;
GIOU:最小边界框解决不重合。
DIOU:两个框中心点欧式距离,收敛速度更快。
CIOU:考虑框的长宽比例。

后续还有EIOU

对比实验总结:

上述改进,都是作者经历了大量的对比实验才最终选择的,最后在不同GPU(Maxwell/Pascal/Volta)型号上进行了对比实验,那么都对比了哪些,最终选择了哪些呢。

1.数据增强方面:MixUp,CutMix,Mosaic,Blur,Crop,Rotation,Flip,Hue,Saturation,Exposure,Aspect。
最终方案:CutMix,Mosaic,Label Smoothing, Mish。
2.S(消除网格敏感)、M(Mosaic)、IT( IoU threshold)、GA: Genetic algorithms(遗传算法前10%时间选择参数)、LS( Class label smoothing)、CBN、CA(余弦退火方法选择学习率)、DM:(Dynamic mini-batch size)、OA:(Optimized Anchors)、不同损失函数GIoU, CIoU, DIoU, MSE - using different loss algorithms for bounded box regression
最终方案:S、M、IT、GA、OA、CIOU
3.PAN, RFB, SAM, Gaussian YOLO (G), and ASFF
最终方案:SPP, PAN, and SAM.
4.CSPResNeXt50、CSPDarknet53
最终方案:CSPDarknet53
5.DropBlock:原DropBlock的文章已经进行了对比实验,其效果最佳,因此选择了DropBlock。
6. 最终方案:改进了SAM,PAN,CBN
引入上述方案后对mini-batch size的影响结论是:没有影响。

讲道理,改进是真的多,排列组合也是真好使。

参考:
Lable smoothing
Mish激活函数
Dropblock
Yolov4解读
Yolov4解读
Yolov4解读
SPPNet网络
CBAM学习
CBAM学习
不同IOU的比较

你可能感兴趣的:(YOLO,学习,笔记)