YOLO的前世今生

目录

1、网格(grid cell)

2、边界框(bounding box)

 3、下图为YOLOv1的整体结构图

 4、损失函数

 4.1为什么要在计算损失时候对高和宽开平方

 5、存在的缺点

二、YOLOv2

1、Batch Nomalization(BN层)

2、High Resolution Classifier (高分辨率分类器)

3.Convolutional With Anchor Boxes(基于anchor的目标边界框检测)

4、Dimension Clusters(聚类得尺寸)

5、Direct location prediction(直接位置预测)

6、Fine-Grained Features(细粒度特征)

7、 Multi-Scale Training(多尺度训练)

8、BackBone---Darknet-19

三、YOLOv3

1、模型输出

2、模型的总体框架 

3、模型目标边界框的预测 

4、正负样本的匹配

5、损失计算

四、 YOLOv3 SPP

1、Mosaic(马赛克)图像增强

2、SPP模块

3、IoU的变化

 3.1、IoU的优缺点

 3.2、GIoU

3.3、DIoU Loss

3.4、CIoU Loss

 3.5、Focal Loss

五、YOLOv4

1、网格backbone-CSPDarknet53

 2、SPP结构

3、网络结构-PAN(Path Aggregation Network/路径聚合网络)

4、优化-Eliminate grid sensitivity(消除网格敏感度)

5、优化-Mosaic data augmentation(马赛克数据增强)

6、优化-IoU threshold(match posotive samples/匹配posotive样本)


一、YOLOv1

1、网格(grid cell)

将一张图像分成S×S个网格(grid cell),如果某个object的中心落在这个网格中心,则这个网格就负责预测这个object。

2、边界框(bounding box)

每个网格要预测B(一般为2)的bounding box,每个bounding box除了预测位置之外,还要附带预测一个cinfidence值,每个网格还要预测C个类别的分数。

YOLO的前世今生_第1张图片

 以Pascaal VOC为例S取7,B取2,C为20,我们可以得到一个7×7×30的预测向量

YOLO的前世今生_第2张图片

 每个网格对应30个数值,因为每个网格需要两个区域快(boundling box),每个bounding box需要预测五个数值五个数值当中包含四个坐标信息和一个confidence。其中x,y为中心坐标,坐标是相对gird cell而言的,w,h是高和宽,他是一个相对于整个图像的相对值。以上四个值都是处于0~1之间的值。confidence为Pr(Object)*IOU。

YOLO的前世今生_第3张图片

3、下图为YOLOv1的整体结构图

YOLO的前世今生_第4张图片

4、损失函数

YOLO的前世今生_第5张图片

 4.1为什么要在计算损失时候对高和宽开平方

在偏移相同的宽和高的情况下,大目标和小目标的IOU差距是很大的,如果不进行开方,我们会误以为他们的误差一样,为了相对减小大目标的损失,所以我们进行了开方

YOLO的前世今生_第6张图片

5、存在的缺点

  • 对一些群体性小目标效果差。
  • 目标出现新的尺寸,效果较差
  • 错误的主要原因是定位的不准确

二、YOLOv2

1、Batch Nomalization(BN层)

正则化提高2个百分点,可以去除dropout层,也可以达到避免过拟合效果

2、High Resolution Classifier (高分辨率分类器)

从224×224变为448×448,提高大概4%

3、Convolutional With Anchor Boxes(基于anchor的目标边界框检测)

基于anchor偏移的预测相比于直接预测目标坐标可以简化目标关键框预测的问题,可以使网络更容易训练和收敛。使用后,mAP有轻微的下降,但是召回率(recall)有明显的提升(81%-88%),召回率的增加表明模型有更大的提升空间

4、Dimension Clusters(聚类得尺寸)

通过k-means的方法对训练集中的bounding box进行聚类得到priors(先验框)

5、Direct location prediction(直接位置预测)

YOLO的前世今生_第7张图片

图中第一个网格(grid cell)的anchor在左上角,通过网络的预测我们会得到一个关于x,y的回归参数,公式一开始并没有限制tx和ty的值,我么将anchor的中心坐标加上我们预测的回归参数之后可能出现在图像的任何地方,如图,可能出现在图的右下角,但是这不是我们想要看到的,因为如果出现在右下角,也应该是由最下面这个网格去预测。

我们采用如下方法进行预测,这样每个anchor(prior)去负责预测目标中心落在某个grid cell区域内的目标。这样网络更容易 学习,并且更加稳定,这个改进提高了5%。下面式子中的\delta为sigmod函数。

YOLO的前世今生_第8张图片

6、Fine-Grained Features(细粒度特征)

YOLO的前世今生_第9张图片

上图为YOLOv2的总体构架,在图中可以看到,通过一个Pass Through Layer结构完成了两个特征层的融合,融合过程如下,通过将一个特征层分成四个特征层的形式完成高和宽在尺度上的统一,然后通过在通道方向的拼接完成特征的融合。通过高层特征与底层特征的融合,模型大概提高了1%。

YOLO的前世今生_第10张图片

7、 Multi-Scale Training(多尺度训练)

在训练时采用不同尺度的图像对模型进行训练,论文中提到每10个batches,网络就会改变一下输入图像的尺寸,选取的数值为{320,352,·······,608}中的一个,他们缩放因子为32=416/13。

8、BackBone---Darknet-19

网络的BackBone使用Darknet-19,其中Convolutional的结构如下图所示,包括一个Conv2d(因为后面有一个BN,所以这个卷积没有baies),BN和一个LeakRelu,

YOLO的前世今生_第11张图片

在VOC数据集上,每个网格我们会预测出5个boxes,每个有5个参数,分别是x,y,w,h,还有一个是confidentes 

三、YOLOv3

1、模型输出

如图,在YOLOv3中每张图像会被预测出N×N×(3*(4+1+80))个值,其中N×N为每张图像的网格数量,每个网格会预测3个目标,每个目标有85个值。

YOLO的前世今生_第12张图片

2、模型的总体框架 

在YOLOv3中会有三个不同的特整层,三个不同的特整层会对不同大小的目标进行预测,特整层拼接的方式为在深度方向进行拼接

导师 

下表是三个特征图和他们可预测边界框的尺寸的对应关系

YOLO的前世今生_第13张图片

3、模型目标边界框的预测 

下图中,对t_{x}t_{y}做了进一步处理,模型使用Sigmoid函数把边界框中心位置固定在了网格(cell)中,

YOLO的前世今生_第14张图片

 下图中,t_{x}t_{y}为边界框的中心位置,t_{w}t_{h}为宽和高,p_{w}p_{h}为先验框的宽和高因为每个cell都有三个尺寸不一样的先验框。

YOLO的前世今生_第15张图片

4、正负样本的匹配

训练时,每个ground truth object 会和一个bounding box匹配,匹配的标准为选取IOU的值最大的候选框和GT做匹配,如果某个候选框的值很大,但不是最大,而且又超过了某一值(0.5),模型就会把这个边界框丢弃 ,这时候其余样本为负样本。除正样本外,所有预测框既没有定位损失,也没有类别损失,只有objectness(confidence)损失。

以上为论文中的言论,下面看代码中的规则:在代码中,只要只要Anchor Template(锚定模板)与GT的IOU大于某一个值,我们就把这个模板看作是正样本。如下,我们把GT映射到网格中,他的中心点落到哪个网格中,我们就用这个网格产生的三个预测狂与这个GT做IOU计算。

YOLO的前世今生_第16张图片

5、损失计算

YOLO的前世今生_第17张图片

四、 YOLOv3 SPP

1、Mosaic(马赛克)图像增强

将图像进行拼接,默认使用四张图像进行拼接,

优点:

  • 增加数据多样性
  • 增加训练图像中目标的个数
  • 对网络中的BN使用有一定帮助,一张图像理论上可以做四张图像使用?

2、SPP模块

借鉴SPP网络中的SPP模块,但结构有差异

YOLO的前世今生_第18张图片

来源 

下面是在总体图上截取的SPP模块,在backbone之后,加入了SPP模块,图中除了一个没有经过变化的分支外,还并联了三个最大池化分支,因为步长为一,为了保证最大池化后的特征图尺寸不变,需要对原始特征图进行padding,在得到资格特征图后,我们会对特征图进行拼接,拼接的方式为深度拼接,通道数会变为原来的四倍。当我们在每个预测特征层前都加入一个SPP层时,他们的效果不大,所以只需加入一个SPP层

YOLO的前世今生_第19张图片

3、IoU的变化

如图,IoU的变化经历了四个过程

YOLO的前世今生_第20张图片

3.1、IoU的优缺点

优点

  • 能够更好的反应拟合程度
  • 具有尺度不变性

缺点:不相交时IoU为0

YOLO的前世今生_第21张图片

3.2、GIoU

下图中蓝色框的面积为Ac,两个框的并集的面积为u,当两个边界框完美重合时Ac=u,后面的一项将会消失。

YOLO的前世今生_第22张图片

YOLO的前世今生_第23张图片

 当两个边界框平行且相交的时候,GIoU会退化为传统的IoU。

3.3、DIoU Loss

针对IoU和GIoU存在的两个问题:

  • 收敛特别慢
  • 回归的不够准确

推出了收敛更快,定位精度更高的DIoU,如下图,DIoU可以更加准确的

YOLO的前世今生_第24张图片

 下图为DIoU的计算公式,其中ρ代表两个边界框b和bgt之间的欧氏距离,其中b代表预测边界框的中心点坐标bgt代表真实边界框的中心点坐标,公式中c代表两个边界框最小外接矩形的对角线长度。因为DIoU的范围在-1~1,所以DIoU的损失范围为0~2。

DIoU损失可以直接最小化两个boxes之间的距离,因此收敛速度较快

YOLO的前世今生_第25张图片

3.4、CIoU Loss

一个优秀的回归定位损失应该考虑到三种几何参数:重叠面积 中心点距离 长宽比 

YOLO的前世今生_第26张图片

3.5、Focal Loss

存在较大的争议,有的模型在使用后,效果会降低

此损失函数主要是针对One-stage模型所提出的,主要目的是为了应对正负样本不平衡问题(正样本只有十几个,负样本会有几万个)

cross entropy(CE) loss如下

YOLO的前世今生_第27张图片

YOLO的前世今生_第28张图片

 上式中的log实际为ln函数,当我们单独引入α,对于正样本α∈[0,1],对于负样本为1-α。他的作用是平衡正负样本的权重,但是他不能区分容易样本和困难样本。所以提出了一个公式,其可以把更多的权重放到比较难区分的样本,其通过(1-pt)γ实现

 最终Focal Loss实现如下所示:

五、YOLOv4

1、网格backbone-CSPDarknet53

CSP结构的作用

  • 增强CNN的学习能力
  • 移除计算瓶颈
  • 降低显存使用

原本的CSPDenseNet模块:

YOLO的前世今生_第29张图片

YOLOv4中的CSP模块,

YOLO的前世今生_第30张图片

下面时YOLOv4中CSPDenseNet的整体模型图,其中Mish为激活函数

Mish = x*tanh(ln(1+e^x))

 又去盗图啦

2、SPP结构

已将在YOLOv3 SPP中有过介绍,去上面看吧

YOLO的前世今生_第31张图片

3、网络结构-PAN(Path Aggregation Network/路径聚合网络)

YOLO的前世今生_第32张图片

 如图a部分是一个FPN结构,FPN结构将高层的语义信息向底层进行融合,b模块时由底层信息向高层融合,a和b共同组成了PAN模块,融合过程中,YOLOv4和原本的PAN结构采用了不同的策略,原始的PAN结构使用了相加的策略,YOLOv4采用拼接的策略

YOLO的前世今生_第33张图片

 下面,叫我们瞻仰一下总体结构图:

YOLO的前世今生_第34张图片

在上图的Derknet53中,采用Mish函数作为激活函数,在搭建PAN网络的时候,在模型之后的ConvSet模块中,采用LeakyRelu函数作为激活函数。在第一个52×52的特征图上的预测输出的通道数为(4+1+n_class)×3,其中,3代表每个网格(cell)会有三个anchor,其余两个特整层的输出类似。

4、优化-Eliminate grid sensitivity(消除网格敏感度)

 使用缩放因子sccale,然后再-(scale-1)/2,现在的主流方法中scale值为2,所有就有了下面的式子和函数曲线

YOLO的前世今生_第35张图片

YOLO的前世今生_第36张图片

5、优化-Mosaic data augmentation(马赛克数据增强)

将4张图像按照一定的规则拼接在一起。

6、优化-IoU threshold(match posotive samples/匹配posotive样本)

YOLO的前世今生_第37张图片

7、优化-Optimizered Anchor(优化锚点)

如下表,在YOLOv4中优化了大尺度的anchor模板,但是在YOLOv5中,又使用回了v3中的模板。

YOLO的前世今生_第38张图片

 8、优化-CIoU

在YOLOv3SPP中有提到

五、YOLOv5

 先来瞻仰一下总体结构

1、网络结构

Backbone:New CSP-Darknet53,与原本的网络有些许差异

Neck:SPP->SPPF,PAN->CSP-PAN

Head:和YOLOv3类似

YOLOv5在低版本中,使用了有一个名为Focus的模块,他的结构如下图所示,但在v5的6.0版本之后,此模块被换成了普通的卷积模块

YOLO的前世今生_第39张图片

在原本的SPP结构中,最大池化层时采用并联的结构,在SPPF的结构中,采用小池化核串联形式得到不同层次的特征,此处理的优点:减少运算时间

YOLO的前世今生_第40张图片

2、数据增强

2.1、Mosiaic

将四张图像拼接成一张图像,增加数据的多样性

2.2、Copy paste

将一幅实例分割的图像中的实例粘贴到另一张图像中,组成一张新的图像

2.3、Random affine(随机仿射)

Rotation,Scale,Translation,Shear(旋转,缩放,平移,措切)源码使用缩放和平移

2.4、MixUp

将两张图像按一定透明程度混合成一张新的图像(源码中启用率10%)

2.5、AIbumentations

AIbumentations为一个第三方包,默认不去使用,其中有对图像的滤波,直方图均衡化和改变图像质量等操作

2.6、Augment HSV(Hue,Saturation,Value)

改变图像的色度,饱和度和明度

2.7、Random horizontal flip(随机水平翻转)

3、训练策略

  • Multi-scale training(多尺度训练),和YOLOv3 SPP相似,尺度为640的倍数(0.5~1.5),但都为32(缩放因子)的倍数。
  • AutoAnchor,会根据数据集中的目标重新聚类生成新的Anchor
  • Warmup和Cosine LR scheduler,Warmup为在训练的初期将学习率从一个很小的值慢慢变大为设定值,Cosine LR scheduler为使用Cos的形式慢慢减小学习率
  • EMA(Exponential Moving Average),给学习变量加上一个动量,使模型在更新参数的过程中变得更加平滑
  • Mixed precision,混合精度训练,减少对GPU显存的占用,理论减半,速度加倍,但是GPU必须要支持

4、损失计算

YOLO的前世今生_第41张图片

 针对不同的预测特整层(P3,P4,P5)的obj损失使用了不同的权重,小目标的权重值大

YOLO的前世今生_第42张图片

如下优化已经在YOLOv4中提出

YOLO的前世今生_第43张图片

在YOLOv5中提出了一种新的对t_{w}t_{h}的处理方法。在之前的处理过程中,如果我们的t_{w}t_{h}很大,就会出现指数爆炸的情况,容易出现训练不稳定的情况,修改之后的函数的值域被限制在0~4之间

YOLO的前世今生_第44张图片

5、匹配正样本

之前的正样本匹配规则:将GT与Anchor模板左上角对齐,然后求IoU的值,如果IoU大于某一阈值,则正样本匹配成功。

现在的匹配规则:计算gt与at的比值,然后对高和宽分别求比值的最大值(如果为1,说明匹配成功),再对高和宽的最大值求就最大值,如果最大值大于4,则说明匹配失败。

YOLO的前世今生_第45张图片

 七、YOLOX

YOLOX不适合多尺度的图像,他的网络模型基于YOLOv5的5.0版本,最大的变化在Head部分。

拿来吧你

 1、网络结构

把耦合的检测头换成解耦的检测头(decoupled detection head),可以加速收敛,提升AP,特点是参数不共享,其在三个预测特征层的三个检测头,为三组不同的参数

YOLO的前世今生_第46张图片

如下图,是预测值计算得到预测框的过程,计算得到的预测框是相对预测特征层而言,如果想得到原图的尺寸还需与缩放比例做乘积。因其在计算过程中没有使用到anchor的长宽,所以这是一个anchor free网络

YOLO的前世今生_第47张图片

 2、损失计算

YOLO的前世今生_第48张图片

 3、正负样本匹配

你可能感兴趣的:(目标检测,人工智能,计算机视觉)