目标检测算法主要分为两类:
SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。对于Faster R-CNN,先通过CNN得到候选框,然后进行分类和回归,而YOLO和SSD可以一步完成检测,SSD的特点是:
SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。如下图所示:
整个特征图分为三部分:
网络的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的差别:
其中conv6使用的Dilated Convolutions,可以翻译为扩张卷积或空洞卷积。与普通的卷积相比,增加了一个扩张率(dilation rate)参数,主要用来表示扩张的大小。扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,在神经网络中参数数量不变,区别在于扩张卷积具有更大的感受野。如下图所示:(下图中红点代表卷积核大小,这三幅图中卷积核大小均为3x3,蓝绿色代表感受野大小,相当于这里对应的卷积核参数为0)
(a) 普通卷积,1-dilated convolution,卷积核的感受野为3×3=9。 (b) 扩张卷积,2-dilated convolution,卷积核的感受野为7×7=49。 © 扩张卷积,4-dilated convolution,卷积核的感受野为15×15=225。
空洞卷积的好处
潜在问题 :远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。
普通卷积和扩张卷积的直观区别:
扩张卷积的感受野的计算方法是:
所以对于图b,F=2*(2-1)(3-1)+3=7,即卷积核的感受野为7x7
对于图c,F=2(4-1)*(3-1)+3=15,即卷积核的感受野为15x15
为了进行后续的多尺度特征提取,在Backbone后面添加了卷积网络,如下图所示:
新增的Conv8_2,Conv9_2,Conv10_2,Conv11_2得到的特征图都会送到后续的目标检测网络中用于位置的回归和分类的计算,特征图的大小如下表所示:
红框中的内容是进行多尺度分析的特征图,再加上backbone部分的Conv4_3和Conv7获取的特征图,共提取了6个特征图,其大小分别是 (38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1),我们将其送入到loc和cls中进行目标检测,从而实现多尺度目标检测。
注意:
图中的红框部分是对应的预测特征层,这里共有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中的第二个全连接层
在backbone和 Extras 在提取的6个特征图的基础上,进行位置信息和分类信息的提取,其结构如下图所示(这里选取其中一个特征图进行分析,其余5个特征图的分析过程与之类似):
该部分主要有3个支路构成,
最后经过修正边界,分类和NMS过滤就得到最终的预测结果
注意:在原论文中,将anchor称作Default Box,其实它们都是一个意思,都表示先验框的意思
整个过程如下图所示(图中以每个单元格产生3个先验框为例进行讲解):
在这里我们着重介绍Default Box层先验框的生成方法:
SSD一共有6个不同尺度的特征图,不同特征图上设置的先验框数量,尺度,宽高比都是不同的(即同一个特征图上每个单元设置的先验框是相同的,但是不同特征图上每个单元是不同的,这里的数目指的是一个单元的先验框数目)。
对于第一个特征图,其先验框的尺度比例一般设置为 s m i n s_{min} smin/2=0.1,尺度为 300×0.1=30。这里的300指的是输入到网络中的图片的宽和高
这样各个特征图的 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
然后再乘以原图的大小300,再综合第一个特征图的先验框尺寸,则可得各个特征图的先验框尺度为30,60,111, 162,213,264。
先验框的长宽比
一般选取
根据下面公式,由先验框尺度和长宽比可以得到先验框的宽度和高度(下面计算公式中的 S K S_{K} SK均指的是先验框实际尺度,而不是尺度比例):
默认情况下,每个特征图除了上面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本质上是密集采样。
下图是6个预测特征图的先验框尺寸核数目:
但是在github实现的SSD源码中,先验框尺寸与论文中有所不同
网络输出的结果是回归偏移量,而不是我们真正想要的结果(即预测框的真正位置,也就是修正后的先验框位置),这里还需要进行转换,具体的转换转换关系如下所示:
在训练过程中,首先需要确定训练图片中的 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最大的那个进行匹配
SSD的损失函数和Faster RCNN中的损失函数基本一致,它包括位置损失( loc)与类别置信度损失(conf)的加权和:
这里的N是先验框的正样本数量,权重系数 α 设置为1。
其中类别损失如下所示:它其实就是多分类的交叉熵损失(也叫做softmax损失)
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个结果。