SSD介绍
SSD(Single Shot MultiBox Detector)于2016年提出,是经典的单阶段目标检测模型之一。它的精度可以媲美Faster rcnn双阶段目标检测方法,速度却达到了59 FPS(512 x 512,TitanV)。
SSD速度较快的主要原因是它消除了边界框候选以及特征的上采样过程。它同样也有一些不足,比如小目标的检测效果不好,定位不准等等。但它各方面的优点已经足够让它成为经典的目标检测模型。下面来介绍SSD的原理。
SSD网络结构
下图展示了SSD的整体结构,整个网络为全卷积网络结构,backbone使用VGG16网络。SSD将backbone中fc6改为3 * 3卷积层,fc7改为1 * 1卷积层,池化层pool5由原来的stride=2的2 * 2变成stride=1的3 * 3。为了不改变特征图的大小,同时获得更大的感受野,Conv6为空洞卷积,dilation=6。在backbone之后增加了8个卷积层(Extra Feature Layers)。
网络中共有6个卷积层(Conv4_3, Conv7, Conv8_2, Conv9_2, Conv10_2, Conv11_2)的特征图被用来进行检测,6个特征图分别预测不同大小(scales)和长宽比(ratios)的边界框。
SSD为每个检测层都预定义了不同大小的先验框(Prior boxes), Conv4_3、Conv10_2和Conv11_2分别有4种先验框,而Conv7、Conv8_2和Conv9_2分别有6种先验框,即对应于特征图上的每个像素,都会生成K(prior box种类)个prior box。prior box类似于Faster rcnn中的anchor。
网络6个检测层总共预测的边界框数目为8732(38 * 38 * 4 + 19 * 19 * 6 + 10 * 10 * 6 + 5 * 5 * 6 + 3 * 3 * 4 + 1 * 1 * 4)。
下图详细的展示了SSD的每个模块,整体上SSD网络可以分为backbone、extras和head模块。head模块包含了detector(用于定位)和classifier(用于分类)。
Detector和Classfier对每个特征图使用不同的3 * 3卷积核进行预测,卷积核的数目由每个特征图上定义的priors box种类决定。比如Conv4_3输出的特征图,定义了4种prior box,那么Detector得到的特征图通道数为4 * 4,Classifier得到的特征图通道数为4 * 21(voc类别数,包含背景)。
Detector输出每个prior box的坐标偏移,Classifier输出每个类的类别概率得分。
网络输入大小为300 * 300,数据集使用Voc数据集(20个类别)。
网络训练
先验框的匹配过程
在目标检测任务中,通常会生成大量的先验框,网络对于所有的先验框会生成对应的坐标偏移,那么网络在计算定位误差的时候,必须要知道每个先验框所对应的真实框。
匹配条件1,对于每个真实框,找到与之IOU最大的先验框,保证每个真实框都有一个先验框来负责检测它。正常来说,网络生成的先验框的数量是远远大于真实框的数量的,如果只根据策略1来进行匹配,大量的未与真实框相匹配的先验框,它们的标签都为背景,那么这将导致类别严重失衡。
这个时候,还需要第2个条件,对于剩余的未被匹配的先验框,如果有某个真实框与它的IOU大于某个阈值(一般取0.5),也将该真实框与之匹配。正常情况下,每个真实框都会同时与多个先验框进行匹配,而每个先验框只能匹配一个真实框。匹配过程需先满足第一个条件,然后满足第二个条件。
即便每个真实框可与多个先验框同时匹配,但背景先验框的数量还是要明显大于物体先验框的数量。因此,论文中还使用了Hard negative mining的策略,按照先验框的类别置信度误差从高到低排序,只选择前top_k个先验框作为训练的背景先验框(背景先验框的采样),最终正负样本的比例约为1:3。
损失函数
SSD的损失函数为多任务损失函数,包含了定位损失和分类损失。如下图所示,N表示匹配的先验框的数目,α为权重项,平衡分类和定位损失,通过交叉验证设为1。
定位误差和faster rcnn中一样,同样采用Smooth L1误差。l为预测坐标,d为先验框,g为真实框。
需要注意的是,只有正样本需要计算定位误差。定位误差使用未解码的预测坐标和编码后的真实框坐标来计算。
如下图为边界框的解码过程(decode)。(tx,ty,tw,th)为边界框的预测坐标,(px,py,pw,ph)为先验框,(x,y,w,h)为预测的边界框。解码过程额外使用了Viriance参数。
Other tricks
L2 Norm层
Conv4_3为第一个用于检测的特征图,由于该特征图的norm较大,因此在Conv4_3之后增加了一个L2_Norm层,将特征图上的每个位置的特征norm缩放到20,并在反向传播过程中学习该缩放参数。以此来保证与之后的特征图不会有太大的差异。
L2 Norm与BatchNorm不同,BatchNorm是在(channel,width,height)3个维度上进行normalization,而L2 Norm只在channel维度上进行Normalization。
class L2Norm(nn.Module):
"""
unlike batchnorm normalize in width, height and channel 3 dimension,
l2norm just normalize in channel dimension
Params:
channels: channels of input feature map
scales: initial scale param, it will be learned by gradient descent
"""
def __init__(self, channels, scales):
super(L2Norm, self).__init__()
self.channels = channels
# gamma is parameter which net will learn
self.gamma = scales or None
self.eps = 1e-10
# normalization in channel dimension
self.weights = nn.Parameter(t.Tensor(self.channels))
nn.init.constant_(self.weights, self.gamma)
def forward(self, x):
norm = x.pow(2).sum(dim=1, keepdim=True).sqrt() + self.eps
x = t.div(x, norm)
out = self.weights.view(1, -1, 1, 1).expand_as(x) * x
return out
Prior box的选择
之前已经说过,6个检测层的特征图都分别定义了不同的先验框,那么这些先验框的尺寸和长宽比是如何得到的呢?
6个特征图的尺寸分别为(38, 19, 10, 5, 3, 1), 它们对应的先验框尺寸随着特征图的缩小线性增大。
这样计算的step = (90 - 20)/(5 - 1)=17.5,由于像素已经是最小单位,不可再分,需要对步长进行取整,step=17, 从而得到第二层及之后Sk*100 = (20,37, 54, 71, 88), 接着再除以100,就得到一组近似的缩放比(0.1, 0.2, 0.37, 0.54, 0.71, 0.88),使用这组缩放比来计算先验框的尺寸,6个特征图对应的先验框尺寸分别为30,60,111,162,213,264。
得到每个特征图对应的基础先验框尺寸(最中间小正方形的大小)后,需要根据基础尺寸来生成k个先验框。基础先验框尺寸对应特征图定义的最小正方形先验框,最外侧大正方形先验框的尺寸为:
而最后一层最大的正方形先验框尺寸直接通过300 * 1.05=315给出。
正方形的尺寸确定了,那长方形先验框的尺寸如何确定呢,网络定义了一组长宽比ar={1, 2, 3, 1/2, 1/3}, Sk为基础框尺寸。只定义了4种先验框的特征图,不会使用3和1/3两种长宽比。
需要注意的是,以上计算的先验框的尺寸,都是根据输入图像的大小来计算的。
数据增强
SSD中的数据增强主要使用了以下方法:
- 水平翻转(randomly horizontal flip)
- 颜色扭曲(color distortion)
- 随机扩张(random expansion)
按照指定扩张倍数,随机的对图片缩放。缩放后的图片为了满足输入的大小要求,边缘进行padding。这样能提高网络检测小物体的能力。 - 随机patch采样(randomly sample patch)
根据限制条件(采样的patch和gt box的iou需要大于指定阈值),从图像中随机进行patch采样。
总结
SSD网络的关键在于MultiBox detection, 多个特征图多尺度检测。之后的Yolov3中同样借鉴了这个思路。同时它还使用了更多的精心挑选的先验框(一共30种先验框,共8732个),让网络的的检测效果更好。SSD对小目标的检测效果之所以不太好,主要原因可能在于,大的特征图负责检测小物体,小的特征图负责检测大的物体,大的特征图具有更多的位置信息,但缺少足够的语义信息,而小的特征图具有更多的语义信息,却因为不断的下采样丢失了大量的位置信息。之后的Yolov3在借鉴SSD多尺度多框思路的同时,也利用了跳过连接,融合高分辨率的特征图和包含更多语义信息的特征图,从而更好的定位。
Reference
https://arxiv.org/pdf/1512.02...
https://arleyzhang.github.io/...