目标检测学习笔记12——Yolo系列梳理学习

一、Yolov1

1.检测框架

如下图所示,很简单,输入图像,经过一个网络,最终直接输出检测框的位置和类别,经过NMS处理后得到最终的目标检测结果。
在这里插入图片描述

2.网络实现

在这里插入图片描述

  • 卷积层提取特征,全连接层去进行预测和输出分类概率和坐标。
  • 使用GoogleNet模型进行图片分类预训练。有24层卷积层,后接2个全连接层。不用GoogleNet中所使用的inception module,直接在1×1的reduction layer后接3×3卷积层。
  • 最终输出的4096reshape成7 * 7 * 30。30代表4+1+4+1+20,两个预测框的坐标和置信度以及20类的类别概率。

3.训练阶段

  • 在ImageNet 1000类数据集上预训练一个分类模型,使用网络结构的前20层卷积层,接1个average-pooling 层和1个全连接层。
  • 保留这个权重再去训练目标检测模型。
  • 在训练好的模型上加4个卷积层和两个全连接层(这些层的参数随机初始化)
  • 检测一般需要细粒度的视觉信息,且全连接层的神经元个数是固定的,因此我们将输入的分辨率从224×224 统一resize提升到448×448.
  • 网络输出预测框坐标和概率。最后一层用线性激活函数,其他层都用leaky rectified linear activation(该激活函数如下图所示)。
    在这里插入图片描述

将图像划分为7×7的网格,每个网格都要产生2个预测框,所以一共98个预测框。因为训练数据集是有标签的,所以某目标的GT框的中心点落在哪个网格里了,这个网格就得负责预测这个目标。意思如下图所示,将该网格的标签真实值设置为如下。

4.损失函数

在这里插入图片描述
共有5个损失组成:

  • 负责检测物体的候选框的中心点位置误差;
  • 负责检测物体的候选框的宽高定位误差;
  • 负责检测物体的候选框的置信度误差;(置信度的标签值是该候选框与GT的IOU)
  • 不负责检测物体的候选框的置信度误差;(标签值为0,因为本来就不应该有它)
  • 负责检测物体的网格的分类误差。

注意,宽高误差加了根号是因为这个误差对小物体影响大,对大物体影响小。所以加根号可以中和两者误差的差距。因为更重视坐标误差,所以λ=5。不负责检测物体的候选框的置信度误差λ=0.5。

5.测试阶段

很简单,图像输入网络,得到7 * 7 * 30的向量。

  • 对98个候选框进行筛选,取置信度大于0.1的,并且取同一网格中分较大的那个。
  • 对筛选后的检测框进行nms,去除重复框即可。

6.实验数据

yolov1速度快,但准确度与Fast RCNN、Faster RCNN有差距。

在这里插入图片描述
在这里插入图片描述

7.缺点

产生的候选框只有98个,太少了,而且只能预测49个物体,限制了能预测重叠或邻近物体的数量。由于下采样操作,细节信息丢失,对于检测框的精度也不如fast-rcnn。对大物体检出能力强,但是检测小物体不好。

二、Yolov2

相对yolov1,yolov2有以下的变动

1. BN层

每个卷积层后均使用Batch Normalization操作,可以提升模型收敛速度、起到一定正则化效果,降低模型的过拟合。

2. 高分辨率分类模型

如图所示,先在ImageNet上使用224 * 224的图像预训练模型,训练得准确率还不错后,再使用448 * 448的ImageNet图像训练10轮微调模型;这可以使得模型在目标检测数据集上finetune之前已经适用高分辨率输入。
在这里插入图片描述

3. Anchor框

借鉴Faster RCNN的anchor box,输出有13 * 13个网格,每个网格预测5个框,然后包含类别数概率和坐标位置和置信度。
在这里插入图片描述

4. Dimension Clusters

如何确定出第3点的每个网格有5种anchor box,是通过K-means聚类得到的。
在这里插入图片描述

5. 产生预测框的位置

YOLO1时,预测框的位置是野蛮生长,会出现模型不稳定,尤其是在早期。这个不稳定来源于预测x和y。
引入Sigmoid函数预测offset,解决了anchor boxes的预测位置问题,采用了新的损失函数。

作者借鉴了RPN网络使用的anchor boxes去预测bounding
boxes相对于图片分辨率的offset,通过(x,y,w,h)四个维度去确定anchor
boxes的位置,但是这样在早期迭代中x,y会非常不稳定,因为RPN是一个区域预测一次,但是YOLO中是13 *
13=169个网格一起预测,处于A gird cell 的x,y可能会跑到B gird
cell中,到处乱跑,导致不稳定。作者巧妙的引用了sigmoid函数来规约x,y的值在(0,1)轻松解决了这个offset的问题。关于w,h的也改进了YOLOv1中平方差的差的平方的方法,用了RPN中的log函数。

在这里插入图片描述

t

x

t_x

tx

t

y

t_y

ty是要学习的参数。由于

t

x

t_x

tx

t

y

t_y

ty 的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO2调整了预测公式,将预测边框的中心约束在特定gird网格内。公式如下:
在这里插入图片描述

c

x

c_x

cx

c

y

c_y

cy是当前网格左上角到图片左上角的距离,网格的大小要归一化为1 * 1.
在这里插入图片描述
限制函数都是sigmoid函数,

t

t

t 都是要学习的参数。所以根据上面的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。

6. 细粒度特征

使用passthrough层检测细粒度特征,mAP提升了1%。

  • 对象检测面临的一个问题:图像中对象有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416 * 416 经过卷积网络下采样最后输出是 13 * 13),较小的对象可能特征已经不明显甚至被忽略掉了。
  • 为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。

YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。在最后一个pooling之前,特征图的大小是26 * 26 * 512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
在这里插入图片描述
但根据YOLO2的代码,和论文中不一样,特征图先用1 * 1卷积从 26 * 26 * 512 降维到 26 * 26 * 64,再做1拆4并passthrough。

7. DarkNet19

为了进一步提升速度,YOLO2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。

和VGG类似,大部分卷积核都是3 * 3,每次池化操作后卷积核数量都加倍。1 *1 卷积核置于3 * 3卷积核之间,可以达到压缩特征的目的。去掉了全连接层,使用GAP层(global average pooling)。使用BN层加快收敛、保证训练稳定、正则化模型。
在这里插入图片描述

  • 用Darknet-19在标准1000类的ImageNet上训练,在224×224的图片上训练160轮
  • 微调输入为448×448,训练10轮,微调这个模型

在以上训练所得分类模型的基础上:

  • 去掉最后一个卷积层、GAP和Softmax
  • 加3个卷积层,每层1024个卷积核
  • 增加一个passthrough层
  • 最后一个1 * 1卷积层,输出的channels数为:num_anchors * (5+num_classes)

结构图如下

  • 22、23、24是增加的3层;

  • 25层将16层输出作为输入,也就是细粒度,经过26层的64个卷积核卷积,输出38 * 38 * 64;

  • 27层将38 * 38 * 64划分为4份并拼接,得到19 * 19 * 256

  • 28层将27层输出与24层输出拼接,得到19 * 19 * 1280

  • 经过3 * 3 卷积和1 * 1卷积,得到19 * 19 * 425
    在这里插入图片描述
    或者看这个图
    在这里插入图片描述

  • 综上所述,虽然YOLO2做出了一些改进,但总的来说网络结构依然很简单,就是一些卷积+pooling,从4164163 变换到 13135*25。稍微大一点的变化是增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框。

  • 对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13 * 13 * 5 * 25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。

8.损失函数

误差包含3个部分:

  • 置信度误差
  • 位置误差
  • 分类误差

在这里插入图片描述

  1. 第一行:置信度误差。与GT框的IOU小于某阈值的置信度误差。这里需要计算各个预测框和所有的ground truth之间的IOU值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为background。此处的IOU计算是将中心点重合。因此只看形状,不看位置。
  2. 第二行:前12800次迭代,预测框与anchor的位置误差,使模型更快学会预测anchor位置,t的四个参数就会更加稳定。这一项应该是促进网络学习到Anchor的形状。
  3. 第三、四、五行:计算与GT的IOU最大的Anchor。
    (1)标注框与预测框的定位误差:首先要计算其中心点落在哪个cell上,然后计算这个cell的5个先验框和grond truth的IOU值,计算IOU值的时候不考虑坐标只考虑形状,所以先将Anchor boxes和ground truth的中心都偏移到同一位置,然后计算出对应的IOU值,IOU值最大的先验框和ground truth匹配,对应的预测框用来预测这个ground truth。
    (2)Anchor和标注框的IOU 与 预测置信度误差
    (3)标注框类别与预测类别的分类误差。

9.实验结果

在这里插入图片描述
在这里插入图片描述

三、Yolov3

YOLO3是在YOLO1和YOLO2基础上进行改进的。

  1. 调整了网络结构;
  2. 利用多尺度特征进行对象检测;
  3. 对象分类用Logistic取代Softmax;

1. 网络结构——Darknet-53

2018年提出。包含Darknet-53网络结构、anchor锚框、FPN等非常优秀的结构。

该网络用于图像提取特征,有53个卷积层,借鉴了残差网络(Residual Network),在一些层之间设置了快捷链路(shortcut connections),其结构如下图所示:

在这里插入图片描述

  • 网络输入:256 * 256 * 3
  • 左侧数字1、2、8、8、4代表有这样多个重复的残差组件每个残差组件有两个卷积层和一个快捷链路,示意图如下:
    在这里插入图片描述

2.整体网络结构示意图

在这里插入图片描述

YOLO3在YOLO2采用passthrough检测细粒度特征的基础上,采用了3个不同尺度的特征图来进行对象检测:

  1. 在第79层,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416 * 416的话,这里的特征图就是13 * 13了。由于下采样倍数高,这里特征图的感受野较大,因此适合检测图像中尺寸比较大的对象

  2. 为了实现细粒度的检测,第79层的特征图又作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。

  3. 第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。

在网上看到一个博主画出了一个这样的图,感觉也很清晰明了!
在这里插入图片描述

在这里插入图片描述

如上表可见,Darknet-53是综合平衡了速度与准确率。

3. 9种尺度先验框

由于特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO3延续YOLO2采用K-means聚类的方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。

在这里插入图片描述
感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框是GT框,红框是对象中心点所在的网格。
在这里插入图片描述

4. Logistic

预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。
在这里插入图片描述
3种尺度的特征图,各有3个先验框,因此总共有 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。

对比一下,YOLO2采用13135 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。

5. 小结

  • YOLO3借鉴了残差网络结构,形成更深的网络层次;
  • 多尺度检测,提升了mAP及小物体检测效果。

如果采用COCO mAP50做评估指标(不是太介意预测框的准确性的话),YOLO3的表现相当惊人,如下图所示,在精确度相当的情况下,YOLOv3的速度是其它模型的3、4倍。

在这里插入图片描述
不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。
在这里插入图片描述

四、Yolov4

2020年4月提出。

1. 网络结构

网络结构如下所示,虽然看起来很复杂,很陌生,但是其实分解开来理解后会发现其实很熟悉。
在这里插入图片描述
接下来一一介绍里面的组件:

  1. CBM:Conv+BN+Mish激活函数
  2. CBL:Conv+BN+Leaky relu激活函数
  3. Res unit:支路1:输入,支路2:CBM+CBM,然后支路1和支路2进行add操作
  4. CSPX:CBM,支路1:CBM+X个Res unit+CBM,支路2:CBM,然后支路1和支路2进行Concat操作,再CBM
  5. SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

Concat: 张量拼接,维度会扩充。
add: 张量相加,不会扩充维度。

2.输入端

主要包括Mosaic数据增强、cmBN、SAT自对抗训练.

2.1 Mosaic数据增强

Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
在这里插入图片描述

  • 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
  • 减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。

3. Backbone

相当于是CBM+CSP1+CSP2+CSP8+CSP8+CSP4.
在这里插入图片描述
所以卷积层有:1+(5 + 2 * 1)+(5 + 2 * 2)+(5 + 2 * 8)+(5 + 2 * 8)+(5 + 2 * 4)=72个卷积层。

3.1 CSP模块

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

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

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

CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。

CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。

因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。

3.2 Mish激活函数

Mish激活函数的公式和图如下
在这里插入图片描述
Yolov4作者实验测试时,使用backbone网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些。
在这里插入图片描述

3.3 Dropblock

大家应该都很熟悉dropout,随机丢弃一些神经元,Dropblock与之区别如下图所示。
在这里插入图片描述

Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。

因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。

所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。

4. Neck

主要就是一些CBL模块,和上采样后进行Concat操作,以及SPP。
在这里插入图片描述

4.1 SPP

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

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

以下是这部分SPP所对应的输入输出。

4.2 FPN

下图中标出来的76 * 76,38 * 38,19 * 19的地方就是一个FPN结构。
在这里插入图片描述
再具体一点就是这样的结构。
在这里插入图片描述

4.3 PAN

PAN结构实际上是在FPN结构之后的处理操作。
在这里插入图片描述
本论文中是对PAN有一些修改,不是直接add,而是Concat。
在这里插入图片描述

5. Prediction

5.1 CIOU_loss

在此之前,有用过以下几种loss。
①IOU_Loss
公式:1-A/B(A是交集,B是并集)
在这里插入图片描述
问题:如果A=0,那么导数为0,损失函数不可求导。另外如果当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。


②GIOU_Loss
公式:1-(IOU-差集/最小外接矩阵)
在这里插入图片描述
问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
在这里插入图片描述
③DIOU_Loss
考虑了重叠面积、中心点距离
公式如下图所示。
在这里插入图片描述
问题:目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。
在这里插入图片描述
④CIOU_Loss
应考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
CIOU_Loss和DIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。

在这里插入图片描述
v是衡量长宽比一致性的参数,我们也可以定义为:
在这里插入图片描述

5.2 DIOU_nms

效果会比普通的IOU nms好。

6.总结

想要知道yolov4的具体网络结构,可在这个网址中查看详细。
https://blog.csdn.net/nan355655600/article/details/106246422

五、Yolov5

在这里插入图片描述

未完待续。。。。。。。

版权声明:本文为CSDN博主「Shadownow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Shadownow/article/details/122630671

Shadownow

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐