SSD(single shot multibox detector)
SSD模型结构
- SSD(Single Shot MultiBox Detector)算法是Wei Liu在ECCV 2016提出的一种(one-stage方法)目标检测模型,算法的主网络结构是VGG16。
- 直接回归目标类别和位置(不需要候选框提取的过程),是针对于卷积网络的结果进行处理
- 在不同尺度的特征图上进行预测
- (比起two stage算法)真正实现了端到端的训练
- 即使图像的分辨率比较低,也能保证检测的精度(因为是在不同尺度的特征图上进行预测)
One-stage系列算法框架
使用卷积神经网络来进行特征提取,得到特征后直接进行目标区域分类和位置精修
论文是使用VGG16,是主干网络(还可以使用后面更新,更优秀的主干网络,如Resnet、MobileNets),直到第5个尺度上的第3次卷积都是VGG16,不过SSD将VGG16后面的两个全连接层去掉(为什么要去掉全连接层,因为原始的VGG16是用来作分类任务的,需要通过FC将特征图映射到最后输出的向量上;在目标检测时不需要这样的分类任务),再接上下图的结构,增加更多的卷积层,引入更多尺度的特征图,作为最终检测层的输入。这是SSD的核心部分,叫做Extra Feature Layers,对6个不同的尺度分别进行预测。
s2表示步长是2
会收集到不同尺度的特征图(上图是6种):
38x38、19x19、10x10、5x5、3x3、1x1的特征图。作为后面检测层的输入。
在Extra Feature Layers之前的特征图进行卷积池化的操作比较少,相当于是些浅层的特征;
Extra Feature Layers的特征图进行卷积的操作比较多,那就是更加深层的特征。
38x38的特征图有大约1000个点,每一个点都可以映射到原始的图片上面;其他尺寸的特征图也是一样的,只不过映射到原图上的点越来越少(也可以理解为感受野原来越大,最后1x1的特征图感受野就是300x300)。感受野小(也就是看到的范围小),所以前面的特征图是有利于检测小物体的,后面的检测中等大小的物体,检测大物体。
s2表示池化的步长是2,s1表示池化的步长是1。
Pool5后面做了1个空洞卷积的操作,才能保持特征图不变,不让特征图变得太小。大的特征图感受野会小些,才好检测小的物体。
Prior Box Layer:
Prior Box Layer的输入是
m
∗
n
m*n
m∗n的特征图,我们将特征图上面的每一个点作为1个cell的话,则有
m
∗
n
m*n
m∗n个cell。
每个cell上生成固定尺寸(scale)和长宽比例(aspect ratio)的box
假设一个feature Map有
m
∗
n
m*n
m∗n个cell,每个cel对应k个default box,每个default box预测c个类别分数score和4个坐标的偏移值offset。
这样该Prior Box Layer就有
(
c
+
4
)
∗
k
∗
m
∗
n
(c+4)*k*m*n
(c+4)∗k∗m∗n个输出。
固定尺寸(scale)和长宽比例(aspect ratio)是2个超参数
具体生成过程:
#def.boxes:4 表示从特征图上的点映射回原始图片的点,以该点为中心生成4个候选框。同理,#def.boxes:6 表示从特征图上的点映射回原始图片的点,以该点为中心生成6个候选框。
总共有8732个候选框(38x38x4+19x19x6+10x10x6+5x5x6+3x3x4+1x1x4)。
从上图我们可以看到,车是大物体,在5x5(以及后面)的特征图里面才被框选出来。所有的框经过NMS后最终得到一个置信度最高的框。
上图所示,每一组预测值包含25个值(4个坐标值,Voc数据集20+1背景的置信度)
特征金字塔
左边的方法针对输入的图片获取不同尺度的特征映射,但是在预测阶段仅仅使用了最后一层的特征映射;而SSD不仅获得不同尺度的特征映射,同时在不同的特征映射上面进行预测,它在增加运算量的同时可能会提高检测的精度(得到更好的结果 ),因为它考虑了更多尺度的特征。
下图中我们可以看到在不同的卷积层会输出不同大小的feature map,这是由于pooling层的存在(一般设置为步长为2),它会将特征图的尺寸(宽和高)变小为原来的二分之一 ,而且不同的feature map中含有不同的特征,而不同的特征可能对我们的检测有不同的作用。总的来说,浅层卷积层可以得到物体边缘信息(经过第一个卷积层之后,特征图里面还能看到车的边缘形状),而深层网络可以得到更细节更抽象的特征(倒数第1,2个卷积得到的特征图就不是人眼所能理解的特征了)。
SSD Loss计算
SSD算法的目标函数分为两部分:计算相应的预选框与目标类别的confidence loss以及相应的位置回归loss。其中N是match到Ground Truth的预选框数量;而
α
\alpha
α参数用于调整confidence loss和location loss之间的比例,默认
α
\alpha
α=1。
confidence loss
i表示第i个默认框,j表示第j个真实框,p表示第p个类。其中
x
i
j
p
x_{ij}^p
xijp={1,0}代表第i个prior box匹配到了第j个类别为p的真实框(举例子说明:假设第4个prior box匹配到了第2个类别为猫的真实框—匹配到的意思也就是第4个prior box和猫的真实框很接近,
x
42
猫
x_{42}^猫
x42猫=1;否则为
x
42
猫
x_{42}^猫
x42猫=0);
confidence使用的是softmax来计算的
表示是背景的概率
location loss
location loss是典型的smooth L1 loss(和Faster Rcnn是一样的):
g是真实标注的框
l是输出的预测框
d是8732个候选框
通过训练就是使得l越来越接近g
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。
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比Faster R-CNN更好
更多的训练数据可以得到更好的结果
SSD512可以得到更好的检测结果
SSD300拥有更好的检测实时性
1、数据增强(Data augmentation)对于结果的提升非常明显
2、使用更多的 default boxes,结果也越好
3、Atrous (空洞卷积)使得SSD效果更好
打钩表示使用了某层的特征图来生成候选框
1、更多的feature map可以得到更好的结果
2、使用图片边界的标注框比不使用图片边界的标注框效果更好
SSD缺点
需要人工设置prior box的min size,max size和aspect ratio(长宽比)值。网络中预选框的基础大小和形状需要手工设置。而网络中每一层feature使用的预选框大小和形状不一样,导致调试过程非常依赖经验。
虽然采用了特征金字塔的思路,但是对小目标的识别效果依然一般,可能是因为SSD使用conv4_3低级feature(前面浅层的)去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。