YOLOv3原理详解(绝对通俗易懂)2021-07-01

1、YOLOV3框架

在这里插入图片描述YOLOV3框架如上图所示,其实,整个框架可划分为3个部分:分别为Darknet-53结构、特征层融合结构(上图concat部分)、以及分类检测结构(上图未画出)。那这三个部分有啥作用或者说怎样工作的呢?

下面从网络结构的输入说起,给一张图像x(大小:416×416)输入到Darkenet-53网络结构,进行一系列的卷积以及参差网络,分别得到原图像1/8(大小:52×52)、1/16(大小:16×26)、1/32的特征图(即feature map),这个过程就是所谓的特征提取过程;在上图也可以看到经过Darkenet-53网络之后有3个分支,分别对应的就是3个不同尺寸的feature map。可能大家想问得到这3个不同尺寸的feature map有什么用呢?为什么要分3个featrue map?(这里不说明,后面原理讲解部分再做解释)

有了3个不同尺寸的feature map,本应该直接利用这些特征进行分类检测的,但考虑到这样的特征层可能表现能力不够,或者说,提取的这些特征不能充分的反应原图中的目标信息。所以接下来需要将3个特征图进行特征融合,以获得更强的特征表现力,从而达到更好的效果;其中由于尺寸不一样,中间需要进行上采样以及下采样(其实就是卷积),使特征图变成相同大小,然后进行堆叠、融合及相应的卷积等操作后,得到最终的3个特征层,即上图中的13×13×255(Y1)、26×26×255(Y2)、52×52×255(Y3),这3个特征图恰好分别为原图像x的1/32、1/16、1/8.

到这,其实整个YOLOV3的框架的核心基本上就讲完了,分类检测结构上图没有画出,后面以原理的形式讲解。

综上所述,对于整个框架,我们抛开其他的细节不看,其实就是将一张大小为416×416×3的输入图像x,经过大量的卷积操作,变成了比它小得多的特征图。下面进行原理讲解

2、YOLOV3原理讲解


首先看下面这张图:

YOLOv3原理详解(绝对通俗易懂)2021-07-01_第1张图片一张大小为416×416×3的原图经过YOLOV3框架卷积后,假设得到一张7×7×255的特征图(为了说明方便,这里没有采用13、26、52的尺寸),原图中可以直观的看到很多的目标,比如有:狗、自行车、小车、树等等;而经过卷积特征提取之后,就变成了不可见的、只有特征点的特征图,其中的每个特征点就反映原图中某个部分的特征,这个特征图就是用来做目标检测与分类的。那具体怎么理解呢???请看下面
形象理解如下图:原图像素大小不是为416×416嘛,经过大量卷积操作后像素大小变为7×7的了(或者是其他大小的),好像实现了图像的浓缩;那如何理解这个浓缩过程呢?其实,可以看成为将原图 划分了 7×7个大小的块(或区域),即7×7 = 49个块(如下 左图),每个块的大小大约为59.4×59.4,而这些块经过卷积特征提取后 就一一对应为右图中相对应点的特征向量(右图中每个点都有很多通道,比如:128);比如原图第一个块变为右图14特征点,原图第二块变为右图25特征点(这里特征点不是单纯的一个点,而是255维的特征向量,这里说成特征点便于理解);这样,特征图的每个特征点(向量)就负责原图中对应块的目标检测;怎么个目标检测请往后面看;至于为什么要划分为不同尺寸的特征图,是为了让YOLO算法能适应不同大小目标的检测;比如:13×13×255的特征图,其一个特征点就对应原图大小为32×32(416/13=32)的块的检测,适合于大目标的检测;而52×52×255的特征图,其一个特征点对应原图大小为8×8(416/52)的块的检测。适合与小目标的检测,同理26×26×255适合于中目标的检测。
YOLOv3原理详解(绝对通俗易懂)2021-07-01_第2张图片那有了上面的特征图后,如何进行目标检测,以及如何框出目标并给出对应的类别的呢

进行目标检测其实就是分类预测和回归预测,对应的操作实际上就将7×7×255的特征图进行一个卷积核为3×3的卷积操作和一个卷积核为1×1的卷积操作,经过这样的一个操作之后呢。特征图的预测输出为:7×7×255 →7×7×75。预测输出7×7×75 就是对应于原图中每个块的目标类别与位置信息,至此,就实现了目标的检测以及分类。详细说明如下

如下图所示:预测结果输出与原图的对应关系
YOLOv3原理详解(绝对通俗易懂)2021-07-01_第3张图片首先说明输出结果7×7×75的含义:
① 7×7分别对应回原图中的一些块(或区域),如上图箭头所示,7×7能够完全对应整个原图。
② 75 = 3 ×(4 + 1 + 20):75中包含了3个预测框(bounding box)的信息,其中每个预测框有25个参数,分别由4个位置坐标信息+1个类别置信度+20个类别预测值组成。只要7×7=49个75维向量都能预测出目标的信息,那么整个原图的所有目标对象就 都能检测出来了。

有了这些信息之后就可以预测在原图中是否有目标。在上图中,14点对应的75维向量对应于原图中第一块,那么它就负责这一块的区域的目标预测;首先,如果75维中第1个bounding box的信息为:
(14, 64,30, 60,0.75,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
那么就表示在原图中的第一块网格区域中,在坐标为(14, 64)宽高分别为:30,60处有一个 类别为第2类(假设是:树)的目标,且该目标属于第2类的置信度为0.75,那么在原图中,第一个网格处的预测类别为 ‘树’,其置信度为75%。对于第2、3个bounding box也是同样的判断,然后在这3个bounding box中采用非最大值抑制(NMS)筛选出预测最准确的一个框,当原图中所有网格区域都预测出各自的类别后,进行信息综合,输出整张图片的完整目标信息,最后在原图中框出目标。至此,对于一张输入图片的目标检测过程就完成了。

最后说明一点:上面的过程只是在训练好的基础上进行的目标预测,而对于训练过程来说,其数据集的每张图片已经标注过,即已经知道每张图片中目标的位置及类别信息(称为先验信息),且也是编码为75维的向量形式,在训练时,由于模型参数是随机的,每张图片的目标预测可能是非常不准确的,这个时候,需要把网络的预测结果与真实的先验信息求Loss,然后通过反向传播不断求梯度,降低Loss,从而优化模型的参数,当Loss足够小时,说明模型的效果就比较好了,这时就可保存模型及其参数,用于对某张图片的目标检测

你可能感兴趣的:(YOLOV3,笔记,pytorch,深度学习)