(一)卷积神经网络初了解

一、卷积神经网络

1.1 计算机视觉

计算机视觉可以应用在图片分类、目标检测、风格迁移等方面。很多时候,在应用计算机视觉时数据的输入量非常的大,比如1000×1000×3(R,G,B 3个channel)的图像,有300万的数据量,即特征向量维度达300万,若使用标准的全连接网络,权值矩阵W会有30亿个参数。大量参数的情况下,神经网络可能会出现过拟合的情况,而且占据巨大的内存。
所以,卷积运算被引入了,它也是卷积神经网络中的一个重要内容。


1.2 卷积运算

1、卷积运算介绍

卷积运算如下图,图中的4×4蓝色矩阵可以看成是原图像,上面的阴影是过滤器,过滤器的每个值与图像上对应位置的值相乘再求和,得到的数作为2×2绿色矩阵对应位置的值,有的时候我们也把得到的数取平均值赋到新矩阵。
在这里插入图片描述
可以看出,卷积操作中存在共享区域,很多参数是共享的,大大减少了运算的参数量,降低了运算成本。同时,它能很好地提取到图像中的特征。

下面我会使用一个边缘检测的例子来更清晰地证明卷积的有效性。边缘检测,即检测物体的边缘,是让电脑搞清楚图片里有什么物体的一个方法。
在这里插入图片描述
在这张图片中, 竖直的栏杆和人体具有很明显的垂直边缘,水平的栏杆具有很明显的水平边缘,通过边缘检测,可以得到图片的特征,帮助电脑知道图片中的物体是什么。

2、卷积运算示例:边缘检测

为了更清晰地理解,我选取了一张具有明显垂直边缘的图片,下面是一张6×6的灰度图像,左边是白色的,右边是灰色的:
在这里插入图片描述
我们可以构造一个过滤器,在这里,它可以看成是一个垂直检测器
[ 1 0 − 1 1 0 − 1 1 0 − 1 ] \left[ \begin{matrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{matrix} \right] 111000111 用它与图像进行卷积运算,得到如下结果:

在这里插入图片描述
可以发现,得到的新图片中,原图像的边缘部分被突出地显示了出来,说明检测到了垂直边缘。
该图像是由亮到暗进行过渡的,如果图像是由暗到亮过渡的,结果就变成了下面的样子:

在这里插入图片描述
所以可以通过观察与过滤器进行卷积运算得到的矩阵的值的正负,判断出原图像的亮暗变化。

同理,我们也可以设置
[ 1 1 1 0 0 0 − 1 − 1 − 1 ] \left[ \begin{matrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1& -1 \end{matrix} \right] 101101101过滤器来检测水平特征,当然,对于其它的特征,我们也可以设计不同的过滤器进行提取。

3、对于一张RGB图像进行卷积

上面是以灰度图像为例进行的卷积操作,但是通常的图像为RGB图像,具有3个通道,若想对一张具有3个通道的图像提取特征,我们需要一个同样具有3个通道的过滤器,三层同时进行卷积,最后得到一张1个通道的图像,得到的图像上某个位置的值为原图像与过滤器三层卷积操作的结果的和。
在这里插入图片描述

4、提取RGB图像的多个特征

若想得到该图像的多个特征,则需要使用多个过滤器,每个过滤器与原图像进行卷积会输出一个二维图像,多个过滤器的输出堆叠在一起,就是这一层卷积的输出,需要检测的特征数等于输出的通道数。
在这里插入图片描述

在上面卷积运算动图中我们可以发现,过滤器每次移动1步长,水平和垂直方向分别移动两次就完成了卷积运算,得到2×2的新图像。
在这里插入图片描述
整个过程存在两个问题:

(1)每进行一次操作,得到的新图像都比原图像小;
(2)边缘的格子只参与了1次或2次运算,对结果的贡献率没有中间格子高,边缘信息丢失比较多;

为了解决这两个问题,引入了新的卷积操作——Padding。


1.3 卷积操作:Padding与Stride

1、Padding:填充

如下图所示,padding即为图像周围填充的新像素,这样得到的新图像没有变小,边缘的像素也参与了多次运算,之前提到的卷积运算存在的这两个问题较好地得到了改进。
在这里插入图片描述
我们可以填充一层,或者更多层,来保持新图片与原图片尺寸相同。

2、Stride:步长

对于步长stride,上面的所有图中stride的值都为1,即过滤器每次移动1个像素大小,这样可以保证提取特征的精度,保证每一个像素都尽可能地参与运算。但有时也会把stride设置为2,3等等,这样可以使卷积操作后的新图片更快速度地缩小,达到一种池化的效果(池化层后面进行详细解释),从而降低计算的成本。stride为2的卷积过程例子如下:
在这里插入图片描述
可以发现,若stride设置为1,则产生的新图片是3×3的,而像图中一样设置为2,产生的新图片尺寸变成2×2。

stride值比较大stride值比较小
优点计算量会下降提取的特征会更全面,不会遗漏太多信息
缺点可能错失一些有用的特征计算量增大,甚至过拟合

1.4 卷积神经网络

介绍完一系列卷积操作之后,我们知道了,提取图像中的某些特征只需要设计过滤器,并进行卷积操作就可以了。如果要提取大量的特征,就需要大量的过滤器,每个都手工设计就过于复杂了,我们可以构造一个卷积神经网络,利用深度学习中的优化算法对过滤器中的参数进行优化,逐步找到最佳的参数。即让网络自动地从数据中学习到合适的参数。

1、卷积层——对RGB图像卷积操作提取特征

上面提到,利用多个过滤器提取一张RGB图像的多个特征,如图所示,使用第一个过滤器进行卷积,得到第一个4×4矩阵。使用第二个过滤器进行卷积得到另外一个4×4矩阵:
在这里插入图片描述
利用多个过滤器对一个RGB图像进行卷积,得到多个二维矩阵(二维图像),这形成一个卷积层。

2、卷积层——激活函数

上面形成卷积层之后,输出给下一个卷积层,进行类似的操作,不断对特征进行提取,最终得到最后的结果。对于上面的例子,如果把输入的6×6×3的图像矩阵记为x,该层上面3×3×3浅黄的过滤器矩阵记为w11,那么该层的一个输出可以记为w11x+b11,这里的b11是一个偏置,对矩阵中所有值都加上这个数,可以使神经网络更加灵活,更容易地得到最佳结果。

w11x+b11作为下一层的一个输入,重复卷积操作,下一层的输出为w2(w11x+b1)+b2,以此类推,整个卷积神经网络最后的输入为:

wn(wn-1…(w2(w11x+b11)+b2)+bn-1)+bn

(wn×wn-1×… w2× w11)× x+(wn× wn-1× …× w2)b11+(wn× wn-1×…× w3)b11+…+wn× bn-1+bn

由于所有操作都是线性操作,所以所有网络的作用叠起来等同于单层网络,相当于对x做了一次线性操作。线性操作解决的问题是有限的,甚至大部分问题都是非线性问题,所以我们引入了非线性函数——激活函数。
常见的激活函数有:

Sigmoid函数:将所有输出值限定在0~1
在这里插入图片描述
Tanh函数:输出值在-1~1在这里插入图片描述
ReLU激活函数
在这里插入图片描述
ReLU激活函数的表达式为:

在这里插入图片描述
当然,还存在其它激活函数,如在ReLU基础上改进的Leaky ReLU、ELU等,ReLU是使用最广泛的激活函数,这里也以它为例来介绍。

在卷积层中,首先所有元素相乘做卷积,再加上偏差,然后应用激活函数ReLU,这样就通过神经网络的一层把如图6×6×3的维度的图像演化为一个4×4×2维度的图像,卷积层的操作就完成了。
在这里插入图片描述
在卷积层中,(过滤器的高×宽×通道数量+1个偏置)*过滤器的数量,即为该层神经网络的所有参数,用来提取图像的特征,无论输入的图像有多大,参数的数量不会变大,这是卷积神经网络的一个特征,可以避免过拟合。

3、 池化层

除了卷积层,卷积神经网络也经常使用池化层来缩减模型的大小,提高计算速度,在上面我们提到过,步长设置不为1时,也可以起到池化的效果。池化层使用较多的类型是最大池化,将输入划分为几个区域,这个区域看成是某些特征的集合,最终的输出为每个区域中的最大值,这样能保留原区域最显著的特征。
在这里插入图片描述
在池化过程中,过滤器的Padding的值通常设为0,一旦确定了过滤器的大小f和步长stride,池化操作就成为一个固定运算,不存在需要学习的参数,所以通常把卷积层和池化层归为一层神经网络。

池化和卷积操作不同,由于是选取最大值,所以输入图像的通道有多少,输出图像的通道就有多少。

除了最大池化之外,还有平均池化,如下图。在神经网络中,最大池化要比平均池化用得更多。
在这里插入图片描述

4、 全连接层

(1)全连接层的概念
卷积层和池化层是特征提取的过程,全连接层是特征整合提纯的过程,它将所有特征整合到一起,输出一个值,可以减少特征的空间位置对最后结果的影响,起到一个分类器的作用,不关心物体在什么位置,只关心物体是否存在。

对于CNN来说,全连接层的输入为4096个神经元,卷积层(卷积层+池化层统称为卷积层)到4096个神经元是如何转化的呢?可以看成是卷积层的输出使用了4096个过滤器做卷积操作,每个过滤器与上一层输出数据进行卷积之后得到的值作为一个神经元的值,最终得到具有4096个神经元的全连接层,也可以认为是一个1×4096的列向量。
一个完整的卷积神经网络
全连接层对特征进行了整合,方便进一步进行分类。通常全连接层的参数数量占整个网络参数数量的绝大多数,我们可以通过调整全连接层的长度和数量来保持精度和效率的平衡。
(2)二层及以上全连接层
大部分网络有两层或两层以上全连接层,经过全连接层之后,输出的数据填充到一个softmax单元,来对图片中的物体进行分类。假如我们想要检测图片中是否有汽车、摩托车、卡车、行人这4类物体,那么softmax单元就会有4个输出。
在这里插入图片描述

二、目标检测

2.1 目标检测的概念

1、 从图片分类到目标检测

在这里插入图片描述

图片分类:image classfication分类定位 :classfication with localization目标检测:object detection
图片特点包含比较大的单个物体包含比较大的单个物体包含多类物体
处理方法将图片输入到多层卷积神经网络中在图片分类的基础上,使神经网络多输出4个单元,用来表示物体的边界框在分类定位的基础上,使神经网络多输出n个单元,代表物体是否属于该类别
输出结果是/否属于某类别是/否属于某类别+该物体的位置每个物体是/否属于某类别+该物体的位置+是否属于n个类别
具体结果1个代表属于某类别的值1个代表属于某类别的值+4个代表边框的值1个代表物体存在的值+n个属于某类别的值+4个代表边框的值

这样,我们得到了目标检测的结果,记为y^,检测的结果和真实值y之间肯定会有误差的,那么误差如何表示呢?我们用损失函数L(y^,y)来计算,采用平方误差的策略,每个对应位置元素的差的平方累加。当然,若真实值没有物体在图片中,则损失函数不用计算除检测结果以外的元素。

2、 引申:特征点检测

目标定位是利用神经网络输出4个参数来确定对象的边界框,如果我们想要输出图像中的特征点,比如:人的脸部轮廓、眼睛的四个眼角、嘴部的关键点等等,通过这些特征来实现人脸识别、判断表情、AR等应用,我们需要准备一个标签训练集来构建网络,包含所有图片和图片中已标注所有特征点。构建完成后,将人脸图片输入卷积网络,输出1/0代表是否有人脸,同时输出所有的特征。
在这里插入图片描述

类似的应用还有人体姿态识别,标注人体的关键特征点,用来训练网络,要保证每个特征点的特性在每张图片上都是一样的,例如始终代表右眼睛的内眼角或人体的左膝盖。


2.2 目标检测的实现

1、 滑动窗口遍历图片

上面学到图片分类和分类定位可以帮助解决目标检测问题。具体来说,如何构建算法进行目标检测呢?
我们采用滑动窗口目标检测,使用一个小窗口,窗口截取到图片上的区域,将该区域输入到卷积神经网络,输出1/0代表该区域内是否有目标,按照一定步长滑动窗口,直至遍历整张图片。
在这里插入图片描述

这种方法相当于对每个窗口内的图片做了一个图片分类,带来的是低计算成本和高精度难以同时满足的问题。

2、 滑动窗口的卷积实现

滑动窗口的卷积实现,指的是在卷积层上应用这个算法。

首先要把神经网络的全连接层转化成卷积层。之前提到过, 全连接层这一步可以看作是进行了一次卷积操作。对一张图片进行目标检测,上面说的是把每个窗口截取到的区域输入卷积神经网络,检测是否存在要识别的对象,然后移动窗口再次检测,如此反复一直到遍历整张图片。

但是,在把全连接层转化成卷积层之后,我们发现每个窗口截取到的区域存在共享的部分,将神经网络每层所有窗口共享的部分重叠在一起,发现相当于将整张图片输入神经网络得到的结果。所以,不必将图片每个区域分别输入神经网络进行检测,直接将整张图片输入进行卷积操作,神经网络就可以识别出对象的位置。
在这里插入图片描述


2.3 目标检测算法改善

1、 交并比(IoU:Intersection over union)

如图,汽车实际的位置为红色边框,而算法输出的汽车位置为紫色边框,我们需要一个指标来判断算法结果的优劣,进一步来改善。交并比,顾名思义,交集与并集的比值。在这张图中就是,两个边界框的并集为这两个边框所占区域(绿色阴影区域),而交集就是这个比较小的区域(黄色阴影区域),那么交并比=黄色阴影面积/绿色阴影面积。
在这里插入图片描述一般约定,在计算loU为1,即预测框与实际框完美重叠的几率较小。一般约定以0.5是阈值,用来判断预测的边界框是否正确。

2、 非极大值抑制(Non-max suppression)

当格子划分的比较小时,会出现同时有几个格子里检测到有目标的情况。即图中的一辆汽车可能被检测到多次:
在这里插入图片描述
这时候我们可以采用非极大值抑制的方法,首先比较所有格子的输出结果中检测到有物体的概率,由大到小排序,保留概率最大的预测框,然后依次与比它小的预测框求交并比,若交并比很大,则说明这两个预测框很有可能检测的是同一个物体,于是把存在物体概率较低的那个预测框抑制掉。

下图即为所有检测到同一个物体的预测框中,存在物体较低的预测框被抑制的结果:
在这里插入图片描述
在这里插入图片描述
非最大值意味着只输出概率最大的分类结果,抑制很接近,但不是最大的其他预测结果,所以这种方法叫做非极大值抑制。

3、 Anchor Boxes

上面例子中的所有物体包含的所有信息,都由物体中点所在的格子进行输出。但是有的时候一个格子中可能包含多个物体的中点,如下图:
在这里插入图片描述
而格子只能输出右边这个列向量,包含:是否存在物体、4个能定位预测框的值、3个分类标签,所以这个格子是无法输出两个物体的信息的,这种情况该如何解决呢?

我们可以采用Anchor Boxes,思路如下:先根据要检测的对象的形状,预先定义若干个Anchor Boxes。假设我们定义了两个Anchor box,如下图,Anchor box1代表行人,Anchor box2代表汽车。
在这里插入图片描述
每个格子之前为1×8维的,现在的输出扩展为1×16维(也可以看成2×8维),当目标被检测到,生成一个预测框,我们通过求预测框与这两个Anchor box的交并比来决定把目标分配到哪个Anchor box的输出。

2.4 2D/3D目标检测前沿算法

在这里插入图片描述

二阶段的精度优势体现在很多方面,比如:二阶段的第一阶段在分类时,正负样本极不平衡的,导致分类器训练比较困难,而第二阶段在分类时,由于第一阶段滤掉了绝大部分的负样本,第二阶段中正负样本比例已经比较平衡了,可以很大程度上缓和正负样本极度不平衡的分类问题,这是一阶段模型难以实现的。
在这里插入图片描述

(二)Yolo v1~v3 算法笔记

一、Yolov1算法

在学习Yolov1算法之前,我们需要分清楚预测阶段与训练阶段。预测阶段是用已经训练好的、现成的网络,去对图片做预测,即做目标检测。训练阶段是利用梯度下降和反向传播来迭代地微调神经元中的权重,并使损失函数最小化,来训练得到一个预测效果更好的模型。

在论文中,过滤器通常被称为卷积核;输入图像经过神经网络卷积产生的结果称为Feature Map (特征图),上一层中的每个feature map跟每个卷积核做卷积,对应产生下一层的一个feature map。

1.1 预测阶段(前向推断)

1、 网络结构

预测阶段使用的训练好的卷积神经网络结构如下图:

输入卷积层(24层)全连接层(2层)输出
448×448×3的图像与7×7的过滤器、3×3的过滤器做卷积,最终得到7×7×1024的feature Map拉平填充入4096个神经元中,再输入到1470个神经元中将全连接层的输出reshape成7×7×30的张量

在这里插入图片描述
最后的输出的7×7×30的张量中,7×7的原因是yolo将输入的图片划分为7×7的网格,每一个网格需要输出的是一个1×30维的信息,所以最后的输出为7×7×30,输出可视化如下图:
在这里插入图片描述

yolo是一个单阶段的、端到端的算法,7×7×30的输出包括所有目标的置信度、预测框坐标、类别,上图中以框的粗细代表置信度的高低。

对于每个网格,它都会产生两个预测框,这两个预测框的中心点都落在该网格中,所以yolov1最后一共会产生98个预测框。

|每个网格输出1×30张量| 2个预测框:1×10|类别:1×20|
|–|–|–|–|
| 输出的具体值 | 对于每个预测框,输出:1个置信度参数;4个位置参数(中心点坐标x,y 与 框的宽高w,h)|共有20个类别,输出在目标存在的条件下,是某种类别的概率|

2、 网络输出的后处理

对于这98个预测框,并不是所有预测框都会被保留,需要进行一系列后处理,将最终结果表现为上图的结果那样。后处理包括:置信度过滤(去掉低置信度的预测框)、非极大值抑制去掉对同一个物体重复检测的预测框。下面分别来详细介绍一下这两个步骤:

(1)置信度过滤
每个网格输出的1×20的的类别的概率含义为:在目标存在的条件下,是某种类别的概率。这是一种条件概率,所以该网格真正检测到某个类别的物体的概率,即全概率=置信度×每个类别的概率,每个预测框会得到1×20的全概率,所有预测框会得到98个1×20的全概率。
在这里插入图片描述

对于这98个1×20维向量来说,每个向量中同一个位置的值都代表该预测框预测到某种类别的概率,我们可以设定一个阈值,小于这个阈值的全部设为0。
在这里插入图片描述

(2)非极大值抑制
在完成置信度过滤之后,我们得到的每个预测框对某个/些种类预测的置信度都比较高,对于某一种类,我们将该种类所在位置的概率从高到低排,再对排序之后的结果进行非极大值抑制。
在这里插入图片描述
具体步骤为:除去最高概率,剩下的每一个值代表的预测框都与最高值的预测框做IoU(交并比),如果IoU大于我们设定的阈值,我们就认为这两个框检测的是同一个目标,那么就将较低的概率值置0,否则保留。
在这里插入图片描述
第一轮比较完成后,除去最高的概率和第二高的概率,剩下概率代表的预测框与第二高的概率的预测框做IoU,重复上述步骤,直至到达最后一个概率。
在这里插入图片描述
对于每个类别都重复上面步骤,最后完成所有输出的后处理,可视化在图片上,即为目标检测的结果。

1.2 训练阶段(反向传播)

目标检测是一个监督学习问题,在训练之前,我们已经使用labelImg、 labelme等标注软件对目标的预测框进行了标注(ground truth,可以认为是真实值、标准答案),训练的目的是让损失函数最小化,来使模型的预测结果尽可能地拟合ground truth。

在训练阶段,每个网格会产生出两个预测框,我们将与ground truth的IoU较大的预测框作为负责拟合ground truth的框,与ground truth的IoU较小的预测框的置信度越低越好。(注意:这里进行IoU比较的前提是,ground truth的中心点在该网格中)

接下来我们设计损失函数,来使负责拟合ground truth的框作为损失函数的最大组成,另一个框的让它的影响尽量的小。损失函数主要由三大部分、五小部分组成:坐标回归误差(主预测框中心点坐标误差+主预测框宽高误差)+置信度回归误差(主预测框置信度误差+另一预测框置信度误差)+类别预测误差(主预测框分类误差)。
以下是我找到的比较详细的批注:
在这里插入图片描述

1.3 总结

最后,总结一下yolov1的优缺点:

yolov1优点yolov1缺点
单阶段模型,速度很快输入图像分辨率较低,准确率较低,定位性能较差
能获取全图信息,可以更好地辨别前景与背景每个网格只能预测一个物体,所有网格只能预测7×7=49个物体,小目标和密集目标识别性能差
捕获全图信息,学习能力强,迁移到艺术图片上性能较好

二、Yolov2算法——Yolo9000:Better,Faster,Stronger

1.1 Better(更准确)

1、 Batch Normalization

CNN中常见的几个参数:Epoch、Batch Size、Iteration。

假设一共1000个图片,每个图片都输入神经网络进行训练,当这1000个图像都被使用过一遍之后,我们就说完成了一期训练。如果设置Epoch=5,就是这个神经网络进行了五期训练;Batch Size是每次批量处理的图像个数,Iteration是将所有图像训练完成的循环次数。1个epoch = BatchSize * Iteration。

由于激活函数得到的值太大或太小会使梯度下降或梯度消失,难以训练,所以将神经元的输出集中到0附近,改善梯度,加快收敛。BN层通常出现在线性层的后面,激活函数层的前面。

(1)训练阶段

在训练阶段,加入batch size为32,那么每层的每个神经元都输出32个响应值,将32个响应值求均值,标准差,再做归一化,减少数据的发散程度,降低网络的学习难度。归一化步骤如下:

在这里插入图片描述
将归一化的值× γ \gamma γ + β \beta β,保留原数据的分布,每个神经元都训练一组 γ \gamma γ β \beta β

(2)预测阶段

使用训练阶段得到的全局的均值、方差、 γ \gamma γ β \beta β参数,进行下面的操作:

在这里插入图片描述
训练阶段和预测阶段的区别为:

训练阶段预测阶段
均值与方差该批次内数据相应维度的均值与方差基于所有批次的期望计算所得
2、 High Resolution Classifier(高分辨率分类器)

yolov1训练图像为224×224,划分为7×7个网格,之后再用训练好的模型对448×448的图像进行目标检测。而yolov2让网络在448×448的图像上训练,即划分为14×14个网格,进而对448×448的图像进行目标检测。这样可以避免在低分辨率图像上训练,然后去预测高分辨率的图像时带来的精度损失。
在这里插入图片描述

3、 Anchor Dimension Clusters Direct location prediction

在yolov1中,每个网格产生两个预测框,这两个预测框是任意形状任意位置的,没有对它们进行任何限制。

而Anchor boxes,前面介绍过,我们可以设置一个高瘦的框,用来预测行人等物体,设置一个矮胖的框,用来预测汽车等物体,这样可以给每个预测框不同的任务,就不会产生较高的重复性。

而yolov2是设置了5个Anchor boxes,对应5种长宽比,最后通过计算5个Anchor boxes与ground trurh的IoU,IoU最大的那个Anchor box来检测该物体,如图则是用了最外侧的框来检测该物体:
在这里插入图片描述
原始的yolo使用了448×448的输入分辨率,即划分为14×14的网格,由于横纵都是偶数个网格,中心点不落在任一个网格中,如果要检测的物体处于图像中心,中心的4个网格就会都进行预测。所以将添加anchor box后,我们将分辨率更改为416×416,即由13×13个网格组成,这样就具有了一个中心网格,比较方便。

下面是yolov1和yolov2每个网格输出的数据的对比:
在这里插入图片描述
对Anchor box的形状限制主要为:对训练集进行聚类,让Anchor box的宽高比接近聚类得到的物体的宽高比。这样比人为手工设定宽高比,最终训练出的模型预测结果更准确。

对Anchor box产生的预测框的位置限制主要为:bx,by限制Anchor box的中心点位置必须在网格内部,因为物体可能很大,所以bw,bh设置为很大的值,即不限制Anchor box的宽高。

图中bx,by,bw,bh是该预测框的中心坐标和宽高,tx,ty,tw,th是预测框相较于Anchor box的偏移量, σ \sigma σ函数是将任意值压缩到0~1之间的函数,cx,cy是该网格左上角的坐标,pw,ph是Anchor box的宽度和高度。这样就实现了对预测框位置的限制。
在这里插入图片描述

4、 损失函数

下面是一个博主对损失函数分析的笔记:

在这里插入图片描述

5、 Fine-Grained Features

最后池化前,得到的是26×26的特征图,经过池化层与卷积层,变为13×13的特征图,中间损失了很多细粒度的特征,导致小尺寸物体的识别效果不佳,所以采用将较高分辨率特征与低分辨率特征相连的方式,包含了底层细粒度的信息和卷积后高层的信息,有利于小目标的检测,这层称为passthrough层。
在这里插入图片描述
图中拆分的步骤参考下图:
在这里插入图片描述

6、 Multi-Scale Training

在模型训练期间,每隔10个batch就将不同大小的图像输入到模型中,使模型对每个尺度的图像都有较好的检测效果。但是yolov1中的全连接层只能接收固定大小的输入,所以yolov2中将全连接层用池化层代替,池化层对输出的每个通道求平均值,所以可以输入任意大小的图像。

1.2 Faster

更换了主干网络如下图:

注:TOP-1正确率= 所有测试图片中正确标签包含在最高的分类概率中的个数)/(总的测试图片数)
TOP-5正确率=(所有测试图片中正确标签包含在前五个分类概率中的个数)/(总的测试图片数)
FLOPS是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能;
GPU Speed用来评估目标检测的速度,单位为FPS,即每秒内可以处理的图片数量,来评估检测速度,时间越短,速度越快;

在这里插入图片描述

1.3 Stronger

yolov2能检测9000种类别(未被实践过),它将COCO和ImageNet数据集整合到一起,并且变成一种WordTree的树状结构,使分类更加科学,不会很相近的细粒度的类别(如美洲豹与非洲豹)在扁平化的互斥的类别层中。

这样既能实现目标检测对目标的定位,也能实现图片分类对大量图像进行分类的功能。
在这里插入图片描述

三、Yolov3算法

Yolov3的改进主要有以下两个方面:

1.1 backbone:Darknet-53

yolov3 借鉴了Resnet的思想,将ResNet模块的最后一层1×1×256去掉,将倒数第二层3×3×64改成3×3×128。整个网络结构如下图,输入的是416×416×3的RGB图像,输出三种尺度的输出,最后输出每个目标物体的类别和边框。
在这里插入图片描述

1.2 Multi-scale training

YOLOv3多尺度训练的原理如图所示,首先一个图像输入,被yolov3分割成13×13,26×26,52×52的网格,每种尺度的每个网格有三个Anchor box,产生三个预测框。每个网格对应的向量包括这三个预测框的信息,每个预测框包含85个参数,分别是预测框的中心点坐标(x,y)、预测框的宽和高(w,h),预测框的置信度,还有80个类别概率。
在这里插入图片描述

yolov3的这三种尺度,小尺寸特征图用于检测大尺寸物体,而大尺寸特征图检测小尺寸物体,这种改进对小物体检测更加友好。

1.3 SPATIAL PYRAMID POOLING(SPP模块)

在yolov3的SPP版本中使用了SPP模块,实现了不同尺度的特征融合,SPP模块主要用来解决输入图像尺寸不统一的问题。目前的图像预处理操作如resize等都会造成一定程度的图像失真,影响了最终的精度。SPP模块,使用固定分块的池化操作,可以对不同尺寸的输入实现相同大小的输出,因此能够避免这一问题。
同时SPP模块中不同大小特征的融合,有利于解决待检测图像中目标大小差异较大的问题,增大了感受野。
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐