title: Single Shot MultiBox Detector
paper link: https://arxiv.org/pdf/1512.02325.pdf
github: https://github.com/balancap/SSD-Tensorflow
文章基本思路:
SSD的基本思路是将目标检测的Bbox的输出空间离散化为多个不同尺度的feature map上每个位置上的一系列不同宽高比的anchor box(SSD文章中称为default box)。首先设定一些anchor box,这些box有不同的宽高比,用网络来预测anchor box 相对于GT box 的坐标偏移,以及每个box对应的物体类别。并且借鉴了FCN中使用不同尺寸(不同层)的feature map的信息提高分割的准确性的思路,在不同尺度的feature map上进行检测,以达到检测不同尺寸的物体的目的。
关于模型:
SSD模型以一个基本网络作为基础,如VGG,将基本网络后面的分类层去掉,添加了几个辅助层来产生检测结果,最后经过NMS得到最终的检测结果。添加的辅助网络有以下几个特点:
在基础网络的截断之后,添加了多个尺寸逐渐减小的卷积层,目的是使目标检测可以在多个不同的尺度上进行。(YOLO是在单一的尺度上进行检测) 对于增加的每一个用于预测的辅助卷积层(不一定是新增的,也可以是基础网络中的一层),通过一次卷积操作(图中的extra feature layers)产生不同尺度的特征图上的检测结果。例如对于10×10×512这个feature map,使用3x3×512的卷积核与其进行卷积,卷积核的数目为anchor_box_num×(4+class_num),得到卷积的结果的每一个位置上就是对应的预测的anchor box 的坐标和对应的目标类别的分数。(YOLO中使用的是全连接来计算得到Bbox相关的预测结果)不同于YOLO中在每个格子上的预测虽然有两个box坐标和分数,但是只预测一个物体的类别的分数的做法,这里是为每一个box都预测了一个物体类别的分数。
关于模型训练:
关于模型训练中的几个主要问题如下:
(1)box匹配策略
SSD模型预测的是anchor box相对于GT box 的偏移,所以在训练的过程中,需要将GT box与对应的anchor box进行匹配,这样才可以计算损失并进行训练。具体的匹配策略为:对于每一个anchor box,将其匹配到任意的与其IoU大于某一个阈值(0.5)GT box上,这样可以简化学习,网络可以对有较大重合的box预测较高的分数,而不是从从多有重合的box当中选择最大的那一个(例如将GT box匹配到与其IoU最大的那个anchor box)。匹配完成后所有这些匹配上的anchor box作为正样本,其余的没有匹配上的作为负样本。
(2)损失函数
SSD的损失函数分为两部分:localization loss 和confidence loss。loc loss计算正样本的smooth L1损失,包括Bbox 中心和宽高的损失;conf loss包括正负样本的softmax损失。
loc loss:
上面的坐标损失中在计算Bbox中心坐标的损失的时候,使用的是归一化的偏移量:
g
j
c
x
−
d
i
c
x
g_j^{cx} - d_i^{cx}
gjcx−dicx 就是anchor box相对于GT的偏移,并用anchor box的宽进行归一化。对于宽高的损失计算:计算的是GT与anchor box 宽的比值,并取对数。
其中smooth L1:
L
1
s
m
o
o
t
h
(
x
)
=
{
0.5
x
2
if |x|<1
∣
x
∣
−
0.5
otherwise
L1_{smooth}(x)= \begin{cases} 0.5x^2& \text{if |x|<1}\\ |x|-0.5& \text{otherwise} \end{cases}
L1smooth(x)={0.5x2∣x∣−0.5if |x|<1otherwise
conf loss:计算的是类别概率分布的交叉熵。
(3)anchor box的尺度和宽高比
SSD中使用多个卷积层的feature map来进行目标检测, 这些卷积层的大小都不相同,那么anchor box的尺度和宽高比如何设定呢?文中给出的方法是对于scale,最小设为0.2,最大设为0.9,如果有m个预测卷积层,根据卷积层从前往后的顺序,每层的scale可计算为s_k:
s
l
=
s
m
i
n
+
s
m
a
x
−
s
m
i
n
m
−
1
(
l
−
1
)
l
∈
[
1
,
m
]
s_l = s_{min} + \dfrac{s_{max} - s_{min}}{m-1}(l-1)\space\space\space l \in [1,m]
sl=smin+m−1smax−smin(l−1) l∈[1,m]
如一共有6个scale,那么对应的anchor box的scale依次为0.2, 0.34, 0.48, 0.62, 0.76, 0.9。在feature map的每一个位置上,anchor box的中心位于每个cell的中心。
对于宽高比,设定为{1, 2, 3, 1/2, 1/3},对于宽高比为1 的anchor box,在上述其所在卷积层对应的scale的基础上,增加一个scale, 大小为
(
s
l
∗
s
l
+
1
)
\sqrt{(s_l*s_{l+1})}
(sl∗sl+1),关于为何增加此scale,文章并没有说明,也许是个trick。这样在feature map的每个位置,都有6个anchor box。
例如对于scale 为0.2的那个feature map,将anchor box在此feature map上的坐标除以scale就得到这个anchor box 在原图中的像素坐标,就可以算anchor box和GT box 的偏移了。 实际上我们将这多个层的anchor box 全部转为原像素坐标,并叠加到一起,就得到了在图像二维空间上均匀分布的多个不同尺度和宽高比的一系列anchor box。
(4)hard negative mining
在box匹配的过程中,大部分的anchor box 实际上是匹配不到GT的,成为了样本(negtives),如果使用所有的anchor box进行训练的话会造成正负样本的不平衡。所以在实际操作的时候,将negtive所在位置的预测输出根据得到confidence score从大到小进行排序,选择排序靠前的那些anchor box,作为hard negtive samples参与训练,hard sample选取的数目控制约为正样本数目的三倍。
(5)数据集扩增
为了是模型能够对不同尺寸和形状的物体的检测更加稳定,做了数据集扩增工作:包括随机采样一个图片块、水平翻转以及图像形变等。