SSD: Single Shot MultiBox Detector
1. Introduction
改进点:
- 以前的方法都是先搞bounding box,再对box里面做分类。特点:精度高,速度慢。
SSD不需要在bounding box上采样,特点:精度高,速度快。 - 小卷积核在bounding box上做类别和偏移预测,
- 在不同尺度的特征图上做不同尺度的预测,通过宽高比来明确的分离预测。
2. The Single Shot Detector(SSD)
2.1 Model
基础网络,如VGG,截断到分类层之前,作为基础网络。后面接附属架构,附属架构有以下特点:
- 基础网络后添加的卷积层大小逐层递减,使检测具有多尺度特征。
- 在SSD的顶部,每个增加的特征层,使用一组卷积核生成固定大小的predictions。对(p)通道(m imes n)的特征层,用(3 imes 3 imes p)的卷积核卷积,生成类别得分和坐标偏移。
- 在给定位置的k个框,计算c类分数和4个偏移量。因此特征图中每个位置需要(c+4)k个卷积核,对于m*n特征图产生(c+4)kmn个输出。在多个特征图中使用不同形状的默认框,可有效的离散可能的输出框形状空间。
2.2 Training
选择用于检测的default box和尺度集合、难样本挖掘、数据增广策略。
- 匹配策略: 训练阶段建立真实标签和默认框对应关系,真实标签从默认框中选择。开始先匹配每个真实标签框与默认框最好的jaccard重叠,确保每个真实标签框有一个匹配的默认框,然后匹配默认框与真实标签框jaccard重叠高于阈值0.5的默认框。这样就允许网络对多个重叠的默认框预测获得高置信度,而不是只选择最大重叠的一个。
- 训练:
LOSS计算公式:
定位LOSS:
置信度损失(confidence loss):
- 在默认框上选择尺度和宽高比:同时使用低层和高层特征图来检测。
一般来说,一个 CNN 网络中不同的 layers 有着不同尺寸的 感受野(receptive fields)。这里的感受野,指的是输出的 feature map 上的一个节点,其对应输入图像上尺寸的大小。具体的感受野的计算,参见两篇 blog:
http://blog.csdn.net/kuaitoukid/article/details/46829355
http://blog.cvmarcher.com/posts/2015/05/17/cnn-trick/
但是在SSD 结构中,default boxes 不必要与每一层 layer 的 receptive fields 对应。本文的设计中,feature map 中特定的位置负责图像中特定的区域,以及物体特定的尺寸。假如我们用 (m) 个 feature maps 来做 predictions,每一个 feature map 中 default box 的尺寸大小计算如下:
其中(s_{min}=0.2,s_{max}=0.9)
再对每个default box做不同宽高比,
令aspect ratio:(a_rin {1,2,3,frac {1}{2},frac{1}{3}})
宽:(w_k^a=s_ksqrt {a_r}),
高:(h_k^a=s_k/sqrt{a_r});
宽高比为1时,额外加一个(s'_k=sqrt{s_ks_{k+1}})。
整理如下:
e.g.:
每一个 default box 的中心,设置为:((i+0.5*|fk|,j+0.5*|fk|),其中|f_k|表示第k个正方形特征图的大小,i,jin[0,|f_k|))。
-
难样本挖掘: 由于正负样本不均衡,因此对default boxes以confidence loss由高到低排序,取最高的一些值,把将正负样本控制在3:1的范围。
-
数据扩容:
- 使用原始图像
- 采样一个patch,与目标间最小的jaccard overlap为:0.1,0.3,0.5,0.7,0.9.
- 随机采样一个patch.
每个采样的patch大小为原始图像的[0.1,1],aspect ratio在(frac {1}{2}和2)之间.
当ground truth box的中心在patch中时,保留重叠部分.
每个采样的patch被resize到固定大小,并以0.5的概率随机水平翻转。
3 Experimental Results
Base network 实验基于VGG16,z ILSVRC CLS-LOC上做了预训练。把fc6和fc7改成了卷积层,并对fc6和fc7参数进行降采样。把pool5的2x2-s2改为3x3-s1,并使用atrous算法填充“空洞”[1]。
这样做之后可以让pool5的feature maps 保持较大的尺寸,这篇ECCV16论文也采用了同样的策略使得feature maps 分辨率比传统的更高,有利于小物体的检测。
图(a)展示是传统的过程,经过3x3-s2的pooling后,接一个3x3的conv,那么卷积层的一个神经元感受野是7 图(b)是atrous过程,现在Pooling层是3x3-s1,后面的卷积层为了能够使用原来的参数初始化必须使用带孔的卷积,这里卷积层的一个神经元的感受野也是7。
pool5这样改变这之后,后面层的感受野将改变,因此也不能用原来网络的参数进行finetune,为了解决这样的矛盾,atrous算法提出。
3.1 PASCAL VOC2007
PASCAL VOC 2007
如图所示,
conv4_3,conv7(fc7),conv8_2,conv9_2,conv10_2,conv11_2这些层用来预测位置和置信度。
在conv4_3上设置default box尺度0.1。
新增的层都用Xavier初始化参数。
对于conv4_3,conv10_2,conv11_2,每个feature map的location上只关联4个default box,(因为conv4_3的尺寸比较大,size为(38 imes 38),放6个default box的话计算量会过大),去掉了aspect ratio为(frac {1} {3}和3)的那俩。其他层都设置了6个default box。
文献[2]中指出,conv4_3和其他层相比有着不同的feature scale
Figure 2: Features are in different scale. We show the features for a position from conv4 3, conv5 3, fc7 and pool6
when we concatenate them together.
我们使用ParseNet中的L2 Normalization将conv4_3 feature map中每个位置的feature归一化到scale为20的大小,并在BP中学习这个scale。
开始的40K次迭代,learning rate为(10^{-3}),之后减少到(10^{-4}),再迭代20K次。
3.2 Model analysis
定量分析:
- Data augmentation提升明显
Fast R-CNN 与 Faster R-CNN 使用原始图像,以及 0.5 的概率对原始图像进行水平翻转(horizontal flip),进行训练。如上面写的,本文还使用了额外的 sampling 策略,YOLO 中还使用了亮度扭曲(photometric distortions),但是本文中没有使用。
做了数据增广,将 mAP 从 65.4% 提升到了 72.1%,提升了 6.7%。
我们还不清楚,本文的 sampling 策略会对 Fast R-CNN、Faster R-CNN 有多少好处。但是估计不会很多,因为 Fast R-CNN、Faster R-CNN 使用了feature pooling,这比人为的对数据进行增广扩充,还要更 robust。
- 使用更多的 feature maps 对结果提升更大
类似于 FCN,使用含图像信息更多的低 layer 来提升图像分割效果。我们也使用了 lower layer feature maps 来进行 predict bounding boxes。
我们比较了,当 SSD 不使用 conv4_3 来 predict boxes 的结果。当不使用 conv4_3,mAP 下降到了 68.1%。
可以看见,低层的 feature map 蕴含更多的信息,对于图像分割、物体检测性能提升帮助很大的。
- defualt boxes越多,结果越好
如 Table 2 所示,SSD 中我们默认使用 6 个 default boxes(除了 conv4_3 因为大小问题使用了 3 个 default boxes)。如果将 aspect ratios 为 13、3 的 boxes 移除,performance 下降了 0.9%。如果再进一步的,将 12、2 的 default boxes 移除,那么 performance 下降了近 2%。
- Atrous 使得SSD又好又快
如前面所描述,我们根据 ICLR 2015, DeepLab-LargeFOV,使用结合 atrous algorithm 的 VGG16 版本。
如果我们使用原始的 VGG16 版本,即保留 pool5 的参数为:2×2−s2,且不从 FC6,FC7 上采集 parameters,同时添加 conv5_3 来做 prediction,结果反而会下降 0.7%。同时最关键的,速度慢了 50%。
PASCAL VOC 2012
MS COCO
为了进一步的验证本文的 SSD 模型,我们将 SSD300、SSD500 在 MS COCO 数据集上进行训练检测。
因为 COCO 数据集中的检测目标更小,我们在所有的 layers 上,使用更小的 default boxes。
这里,还跟 ION 检测方法 进行了比较。
总的结果如下:
Inference time
本文的方法一开始会生成大量的 bounding boxes,所以有必要用 Non-maximum suppression(NMS)来去除大量重复的 boxes。
通过设置 confidence 的阈值为 0.01,我们可以过滤掉大多数的 boxes。
之后,我们再用 Thrust CUDA library 进行排序,用 GPU 版本的实现来计算剩下的 boxes 两两之间的 overlap。然后,进行 NMS,每一张图像保留 top 200 detections。这一步 SSD300 在 VOC 20 类的每张图像上,需要耗时 2.2 msec。
下面是在 PASCAL VOC 2007 test 上的速度统计: