SSD算法解析

目标检测算法主要分为两类:

  • Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归,two-stage的方法优势在于准确率度高;
  • One-stage方法:如YOLO系列方法,主要思路就是均匀地在图片上不同位置进行密集采样,采样时使用不同尺度和长宽比box,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以优势在于速度快。我们接下来介绍的SSD方法也是单阶段的算法。

SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。对于Faster R-CNN,先通过CNN得到候选框,然后进行分类和回归,而YOLO和SSD可以一步完成检测,SSD的特点是:

  • SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小特征图用来检测大物体;
  • SSD采用了不同尺度和长宽比的先验框,在faster r-cnn和yoloV2,V3中称为Anchors。

1 SSD网络结构

SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。

SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。如下图所示:
SSD算法解析_第1张图片
整个特征图分为三部分:

  • backbone: VGG16用于图片特征提取的网络
  • Extra: 用于引出多尺度特征图的网络
  • Loc和cls: 用于框位置回归和目标分类的网络

1.1 backbone

网络的backbone采用VGG16作为基础模型,并在此基础上做了稍微的改动。使用imagenet数据进行预训练后,将conv4-1前一层的maxpooling中池化模式padding改为same(图中对应pytorch中的ceil_mode=True,即向上取整),使得输出为38x38,Conv4-3得到的特征图就是多尺度特征中的第一个38x38的特征图 (即第一个用于后续目标检测网络进行位置回归和分类的计算的特征图),因为该层比较靠前,所以在其后面增加了一个L2 Normalization层,对每个像素点在channle维度做归一化。VGG16倒数第3个和倒数第2个全连接层分别转换成 3x3 的卷积层conv6和1x1的卷积层conv7,把最后一个全连接层删除,同时将最后的池化层由原来的stride=2的 2x2 变成stride=1的 3x3的池化层。(卷积层conv7得到的特征图是第二个用于后续目标检测网络进行位置回归和分类计算的特征图))

下图为原始的VGG16网络和SSD中的VGG16的差别:
SSD算法解析_第2张图片
其中conv6使用的Dilated Convolutions,可以翻译为扩张卷积或空洞卷积。与普通的卷积相比,增加了一个扩张率(dilation rate)参数,主要用来表示扩张的大小。扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,在神经网络中参数数量不变,区别在于扩张卷积具有更大的感受野。如下图所示:(下图中红点代表卷积核大小,这三幅图中卷积核大小均为3x3,蓝绿色代表感受野大小,相当于这里对应的卷积核参数为0)
SSD算法解析_第3张图片
(a) 普通卷积,1-dilated convolution,卷积核的感受野为3×3=9。 (b) 扩张卷积,2-dilated convolution,卷积核的感受野为7×7=49。 © 扩张卷积,4-dilated convolution,卷积核的感受野为15×15=225。

空洞卷积的好处

  • 扩大感受野,且不丢失分辨率:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率(即可以不改变图像输出特征图的尺寸),且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
  • 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。当然这样的操作不影响特征图的尺寸,又避免下采样造成信息损失,同时也利用到多尺度信息。
    • 知识补充:我们知道,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。

潜在问题 :远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。

普通卷积和扩张卷积的直观区别:
SSD算法解析_第4张图片
扩张卷积的感受野的计算方法是:
在这里插入图片描述

所以对于图b,F=2*(2-1)(3-1)+3=7,即卷积核的感受野为7x7
对于图c,F=2
(4-1)*(3-1)+3=15,即卷积核的感受野为15x15

1.2 extra部分

为了进行后续的多尺度特征提取,在Backbone后面添加了卷积网络,如下图所示:

新增的Conv8_2,Conv9_2,Conv10_2,Conv11_2得到的特征图都会送到后续的目标检测网络中用于位置的回归和分类的计算,特征图的大小如下表所示:
SSD算法解析_第5张图片
红框中的内容是进行多尺度分析的特征图,再加上backbone部分的Conv4_3和Conv7获取的特征图,共提取了6个特征图,其大小分别是 (38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1),我们将其送入到loc和cls中进行目标检测,从而实现多尺度目标检测。

下图是SSD网络的框架:
SSD算法解析_第6张图片

注意:

图中的红框部分是对应的预测特征层,这里共有6个预测特征层,分别是:Conv4_3, Conv7,Conv8_2, Conv9.2,Conv10_2, Conv11_2

图中的Conv6 (FC6)表示图像的卷积层Conv6对应着原来VGG模型的全连接层FC6的位置,FC6是VGG16中的第一个全连接层

图中的Conv7 (FC7)表示图像的卷积层Conv7对应着原来VGG模型的全连接层FC7的位置,FC7是VGG16中的第二个全连接层

1.3 loc和cls

在backbone和 Extras 在提取的6个特征图的基础上,进行位置信息和分类信息的提取,其结构如下图所示(这里选取其中一个特征图进行分析,其余5个特征图的分析过程与之类似):
SSD算法解析_第7张图片
该部分主要有3个支路构成,

  • 分支一:Default Box层,用来生成先验框,也就相当于fasterRCNN中的anchorbox,假设先验框种类有6个(一个单元上有6个先验框),而特征的大小是5x5,所以一共产生5x5x6=150个先验框
  • 分支二:Localization: 采用一次 3×3 卷积来进行完成,每个先验框有四个坐标,共有5x5x6x4个预测结果
  • 分支三:类别置信度confdence:采用一次 3×3 卷积来进行完成,每个先验框有21个类别预测结果(VOC数据集,共20个类别加一个背景),共有5x5x6x21个预测结果

最后经过修正边界,分类和NMS过滤就得到最终的预测结果

注意:在原论文中,将anchor称作Default Box,其实它们都是一个意思,都表示先验框的意思

整个过程如下图所示(图中以每个单元格产生3个先验框为例进行讲解):
SSD算法解析_第8张图片

1.3.1 Default Box层先验框的生成方法

在这里我们着重介绍Default Box层先验框的生成方法:

SSD一共有6个不同尺度的特征图,不同特征图上设置的先验框数量,尺度,宽高比都是不同的(即同一个特征图上每个单元设置的先验框是相同的,但是不同特征图上每个单元是不同的,这里的数目指的是一个单元的先验框数目)。

先验框的设置:包括尺度(或者说大小)和长宽比两个方面。
SSD算法解析_第9张图片

  • 先验框的尺度
    先验框的尺度遵守一个线性递增规则:随着特征图大小降低(此时检测目标逐渐变大),先验框尺度线性增加,
    其中每个先验框的尺度相对于原图大小的比例 S K S_K SK的计算公式如下所示:
    SSD算法解析_第10张图片
    其中:
    k表示第K+1个特征图,它的取值范围是[1,5],因为第一个特征图并不是按照上面公式进行计算,所以K的取值不是从0开始;m 指的特征图个数,虽然参与计算的特征图个数是6,但是这里将m设为5 ,因为第一个特征图(Conv4_3层生成的特征图)上的先验框的尺度是单独设置的,不需要根据上面公式进行计算,只有第二个到第六个特征图的尺度才按照上面公式计算。 S K S_K SK表示第k+1个特征图上先验框大小相对于图片的比例,而 S m i n S_{min} Smin S m a x S_{max} Smax表示比例的最小值与最大值,它是超参数,论文中的取值为0.2和0.9。
  1. 对于第一个特征图,其先验框的尺度比例一般设置为 s m i n s_{min} smin/2=0.1,尺度为 300×0.1=30。这里的300指的是输入到网络中的图片的宽和高

  2. 对于后面的特征图,先验框尺度比例按照 上面公式线性增加线性增加,但是先将尺度比例先扩大100倍,此时增长的步长为:SSD算法解析_第11张图片

  3. 这样各个特征图的 S K S_{K} SK为20,37,54,71,88。将这些比例除以100,我们可以计算出第二到第六个特征图的尺度比例 S K S_{K} SK的取值分别为0.20, 0.37,0. 54, 0.71, 0.88

  4. 然后再乘以原图的大小300,再综合第一个特征图的先验框尺寸,则可得各个特征图的先验框尺度为30,60,111, 162,213,264。

  • 先验框的长宽比

    一般选取
    SSD算法解析_第12张图片
    根据下面公式,由先验框尺度和长宽比可以得到先验框的宽度和高度(下面计算公式中的 S K S_{K} SK均指的是先验框实际尺度,而不是尺度比例):
    SSD算法解析_第13张图片
    默认情况下,每个特征图除了上面5个比例的先验框,还会设置一个尺度为
    在这里插入图片描述
    的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。因此,每个特征图一共有 6 个先验框,长宽比是 1, 2, 3, 1/2, 1/3, 1 ,但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为 3, 1/3 的先验框。
    在这里插入图片描述
    由于每个先验框都会预测一个边界框,所以对于送入网络中的一幅图像,SSD一共可以预测 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个边界框(先验框),网络需要对这些边界框进行分类和回归,即对于一个300x300的图像就有8732个预测结果,是非常的多的,所以说SSD本质上是密集采样。

SSD算法解析_第14张图片

下图是6个预测特征图的先验框尺寸核数目:
SSD算法解析_第15张图片
但是在github实现的SSD源码中,先验框尺寸与论文中有所不同

SSD算法解析_第16张图片
SSD算法解析_第17张图片

1.3.2 loc的预测结果

网络输出的结果是回归偏移量,而不是我们真正想要的结果(即预测框的真正位置,也就是修正后的先验框位置),这里还需要进行转换,具体的转换转换关系如下所示:
SSD算法解析_第18张图片

2.模型训练

2.1 正负样本标记

在训练过程中,首先需要确定训练图片中的 ground truth 与哪一个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

SSD的先验框和ground truth匹配原则:

  • 正样本

1、对于图片中的每个gt,找到与其IOU最大的先验框,该先验框与其匹配,这样可以保证每个gt一定与某个先验框匹配。

2、对于剩余未匹配的先验框,若与某个gt的IOU大于某个阈值(一般0.5),那么该先验框与这个gt匹配

SSD中正样本的选取标准和Faster RCNN中的相同

  • 负样本

除了正样本外,其余的先验框标记为负样本,但是在很多情况下,正样本的数量要远小于负样本的数量,为了避免在训练过程中正负样本严重不平衡情况,SSD采用了hard negative mining策略,也就是在训练的过程中,我们并不是拿所有的负样本进行训练,而是对负样本进行抽样,抽样时按照置信度误差进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3

负样本的置信度损失越大,那么网络就会将该负样本预测为包含目标的概率越大,所以它属于困难样本,故使用这些困难样本来训练网络的效果更好

注意:

1、某个gt可以和多个先验框匹配,而每个先验框只能和一个gt进行匹配

2、如果多个gt和某一个先验框的IOU均大于阈值,那么先验框只与IOU最大的那个进行匹配

2.2 损失函数

SSD的损失函数和Faster RCNN中的损失函数基本一致,它包括位置损失( loc)与类别置信度损失(conf)的加权和:

SSD算法解析_第19张图片

这里的N是先验框的正样本数量,权重系数 α 设置为1。

其中类别损失如下所示:它其实就是多分类的交叉熵损失(也叫做softmax损失)
SSD算法解析_第20张图片

其中的定位损失如下所示;定位损失只针对正样本进行损失计算
SSD算法解析_第21张图片

3 模型输出部分

SSD模型一共有6个预测特征图,对于其中一个尺寸为mxn,通道为p的预测特征图,假设其每个像素点会产生K个anchor,每个anchor会对应c个类别(这里的类别包括背景类别)和4个回归偏移量,那么我们会使用使用(4+c)k个 尺寸为3x3,通道为p的卷积核对该预测特征图进行卷积操作,得到尺寸为mxn,通道为(4+c)k的输出特征图, 它包含了预测特征图上所产生的每个anchor的回归偏移量和各类别概率分数。所以对于尺寸为mxn的预测特征图,总共会产生(4+c)kmn个结果

如下图所示,输出特征图上a点所包含的预测信息:包括目标类别分数和边界框回归参数,由于每个像素点上会参数K个anchor(本例中k=4),所以a点会预测出cxk个目标类别分数和4xk个边界回归参数,一共产生(c+4)xk个结果。

SSD算法解析_第22张图片

4 模型预测

预测过程比较简单,
SSD算法解析_第23张图片
主要步骤如下:

  • 对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。
  • 然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。
  • 对于留下的预测框进行解码 (解码的意思是网络输出的结果是对先验框的修正量,并不是修正后的先验框的位置结果,所以还需要进行转换),根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。
  • 解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。
  • 进行NMS算法,过滤掉那些重叠度较大的预测框。
  • 最后剩余的预测框就是检测结果了。

你可能感兴趣的:(深度学习,计算机视觉,目标检测)