SSD(single shot multibox detector)

SSD模型结构
  1. SSD(Single Shot MultiBox Detector)算法是Wei Liu在ECCV 2016提出的一种(one-stage方法)目标检测模型,算法的主网络结构是VGG16。
  2. 直接回归目标类别和位置(不需要候选框提取的过程),是针对于卷积网络的结果进行处理
  3. 在不同尺度的特征图上进行预测
  4. (比起two stage算法)真正实现了端到端的训练
  5. 即使图像的分辨率比较低,也能保证检测的精度(因为是在不同尺度的特征图上进行预测)

One-stage系列算法框架

ssd模型 目标检测 ssd模型全称_ide


使用卷积神经网络来进行特征提取,得到特征后直接进行目标区域分类和位置精修

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_02


论文是使用VGG16,是主干网络(还可以使用后面更新,更优秀的主干网络,如Resnet、MobileNets),直到第5个尺度上的第3次卷积都是VGG16,不过SSD将VGG16后面的两个全连接层去掉(为什么要去掉全连接层,因为原始的VGG16是用来作分类任务的,需要通过FC将特征图映射到最后输出的向量上;在目标检测时不需要这样的分类任务),再接上下图的结构,增加更多的卷积层,引入更多尺度的特征图,作为最终检测层的输入。这是SSD的核心部分,叫做Extra Feature Layers,对6个不同的尺度分别进行预测。

ssd模型 目标检测 ssd模型全称_池化_03


s2表示步长是2

会收集到不同尺度的特征图(上图是6种):

38x38、19x19、10x10、5x5、3x3、1x1的特征图。作为后面检测层的输入。在Extra Feature Layers之前的特征图进行卷积池化的操作比较少,相当于是些浅层的特征;

Extra Feature Layers的特征图进行卷积的操作比较多,那就是更加深层的特征。

38x38的特征图有大约1000个点,每一个点都可以映射到原始的图片上面;其他尺寸的特征图也是一样的,只不过映射到原图上的点越来越少(也可以理解为感受野原来越大,最后1x1的特征图感受野就是300x300)。感受野小(也就是看到的范围小),所以前面的特征图是有利于检测小物体的,后面的检测中等大小的物体,检测大物体。

ssd模型 目标检测 ssd模型全称_ide_04


s2表示池化的步长是2,s1表示池化的步长是1。

Pool5后面做了1个空洞卷积的操作,才能保持特征图不变,不让特征图变得太小。大的特征图感受野会小些,才好检测小的物体。

ssd模型 目标检测 ssd模型全称_ide_05

Prior Box Layer:

Prior Box Layer的输入是ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_06的特征图,我们将特征图上面的每一个点作为1个cell的话,则有ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_06个cell。
每个cell上生成固定尺寸(scale)和长宽比例(aspect ratio)的box
假设一个feature Map有ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_06个cell,每个cel对应k个default box,每个default box预测c个类别分数score和4个坐标的偏移值offset。
这样该Prior Box Layer就有ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_09个输出。
固定尺寸(scale)和长宽比例(aspect ratio)是2个超参数

具体生成过程:

#def.boxes:4 表示从特征图上的点映射回原始图片的点,以该点为中心生成4个候选框。同理,#def.boxes:6 表示从特征图上的点映射回原始图片的点,以该点为中心生成6个候选框。
总共有8732个候选框(38x38x4+19x19x6+10x10x6+5x5x6+3x3x4+1x1x4)。
从上图我们可以看到,车是大物体,在5x5(以及后面)的特征图里面才被框选出来。所有的框经过NMS后最终得到一个置信度最高的框。

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_10


上图所示,每一组预测值包含25个值(4个坐标值,Voc数据集20+1背景的置信度)

特征金字塔

左边的方法针对输入的图片获取不同尺度的特征映射,但是在预测阶段仅仅使用了最后一层的特征映射;而SSD不仅获得不同尺度的特征映射,同时在不同的特征映射上面进行预测,它在增加运算量的同时可能会提高检测的精度(得到更好的结果 ),因为它考虑了更多尺度的特征。

ssd模型 目标检测 ssd模型全称_ide_11


下图中我们可以看到在不同的卷积层会输出不同大小的feature map,这是由于pooling层的存在(一般设置为步长为2),它会将特征图的尺寸(宽和高)变小为原来的二分之一 ,而且不同的feature map中含有不同的特征,而不同的特征可能对我们的检测有不同的作用。总的来说,浅层卷积层可以得到物体边缘信息(经过第一个卷积层之后,特征图里面还能看到车的边缘形状),而深层网络可以得到更细节更抽象的特征(倒数第1,2个卷积得到的特征图就不是人眼所能理解的特征了)。

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_12

SSD Loss计算

SSD算法的目标函数分为两部分:计算相应的预选框与目标类别的confidence loss以及相应的位置回归loss。其中N是match到Ground Truth的预选框数量;而ssd模型 目标检测 ssd模型全称_池化_13参数用于调整confidence loss和location loss之间的比例,默认ssd模型 目标检测 ssd模型全称_池化_13=1。

ssd模型 目标检测 ssd模型全称_ide_15

confidence loss

ssd模型 目标检测 ssd模型全称_池化_16


i表示第i个默认框,j表示第j个真实框,p表示第p个类。其中ssd模型 目标检测 ssd模型全称_池化_17={1,0}代表第i个prior box匹配到了第j个类别为p的真实框(举例子说明:假设第4个prior box匹配到了第2个类别为猫的真实框—匹配到的意思也就是第4个prior box和猫的真实框很接近,ssd模型 目标检测 ssd模型全称_池化_18=1;否则为ssd模型 目标检测 ssd模型全称_池化_18=0);

confidence使用的是softmax来计算的

ssd模型 目标检测 ssd模型全称_卷积_20


表示是背景的概率

ssd模型 目标检测 ssd模型全称_ide_21

location loss

location loss是典型的smooth L1 loss(和Faster Rcnn是一样的):

g是真实标注的框

l是输出的预测框

d是8732个候选框

通过训练就是使得l越来越接近g

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_22

Match策略

在训练时,groundtruth boxes与prior boxes按照如下方式进行配对:

首先,寻找与每一个ground truth box有最大的交并比(loU)的prior box,这样就能保证每一个groundtruth box与唯一的一个prior box对应起来。

SSD之后又将剩余还没有配对的prior box与任意一个groundtruth box尝试配对,只要两者之间的交并比(loU)大于阈值,就认为match(SSD300阈值为0.5)。

显然配对到groundtruth box的prior box就是positive,没有配对到groundtruth box的prior box就是negative。

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_23

Hard negative mining(难例挖掘)

值得注意的是,一般情况下negative default boxes数量远远多于positive default boxes数量,直接训练会导致网络过于重视负样本。从而loss不稳定。所以SSD在(对负样本)抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,控制positive:negative=1:3。作者发现这可以导致模型更快的优化和更稳定的训练。
举例子说明,比如一个预测框其实什么都没有框到,但它认为自己有90%的置信度框到了一辆车,这就是1个难例。

Data augmentation数据增广

为了使模型对于各种输入对象大小和形状更加鲁棒,每个训练图像通过以下选项之一随机采样:

1、使用整个原始输入图像

2、随机采样一个区域,使采样区域和(训练用的)原始图片中要检测的物体最小的交并比重叠为0.1,0.3,0.5,0.7或0.9。

3、采样的区域比例是[0.3,1.0],aspect ratio(长宽比)在0.5或2

4、GTbox中心在采样区域中且被采样到的GTbox面积大于0

5、Resize到固定大小

6、以0.5的概率随机的水平翻转

每个采样区域的大小为原始图像大小的[0.1,1],长宽比在1/2和2之间。如果真实标注框的中心点在采样区域内,则保留两者重叠部分作为新图片的真实标注框(如果中心点不在,那么这个框就不保留了)。在上述采样步骤之后,将每个采样区域大小调整为固定大小,并以0.5的概率水平翻转。

下图左边是原始输入图像,右边的4张图像就是采样得到的。

左边第3张图的狗的真实标注框没有了,应该是因为该真实标注框的中心点在采样区域内了

ssd模型 目标检测 ssd模型全称_卷积_24

SSD结果分析

同样的数据集SSD比Faster R-CNN更好

更多的训练数据可以得到更好的结果

ssd模型 目标检测 ssd模型全称_ide_25

SSD512可以得到更好的检测结果

SSD300拥有更好的检测实时性

ssd模型 目标检测 ssd模型全称_卷积_26

1、数据增强(Data augmentation)对于结果的提升非常明显

2、使用更多的 default boxes,结果也越好

3、Atrous (空洞卷积)使得SSD效果更好

ssd模型 目标检测 ssd模型全称_ssd模型 目标检测_27


打钩表示使用了某层的特征图来生成候选框

1、更多的feature map可以得到更好的结果

2、使用图片边界的标注框比不使用图片边界的标注框效果更好

ssd模型 目标检测 ssd模型全称_池化_28

SSD缺点

需要人工设置prior box的min size,max size和aspect ratio(长宽比)值。网络中预选框的基础大小和形状需要手工设置。而网络中每一层feature使用的预选框大小和形状不一样,导致调试过程非常依赖经验。

虽然采用了特征金字塔的思路,但是对小目标的识别效果依然一般,可能是因为SSD使用conv4_3低级feature(前面浅层的)去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。