目标检测:SSD

要点:

1. SSD的核心是使用应用于feature map的小卷积滤波器来预测固定的一组默认边界框的类别和框偏移。

 

将边界框的输出空间离散化为不同宽高比和每个要素图位置的一组默认框。

生成固定大小的边界框集合以及在这些框中存在对象类实例的分数,随后是非最大抑制步骤以产生最终检测 (超过阈值即检测出:允许网络预测多个重叠默认框的高分,而不是要求它只选择具有最大重叠的一个)。

 

2. 多尺度结构:为了实现高检测精度,我们从不同尺度的特征图产生不同尺度预测feature map,并通过纵横比明确地分开预测(不同的feature map的anchor box 不一样)。

(使用低层feature map检测小目标,高层检测大目标)

 

细节:

1. 如下图,在8*8的feature map只能检测出猫,不能检测出狗。因为在8*8 的default box尺寸中没有狗的尺寸。

2 多尺度特征图(Mult-scale Feature Map For Detection)

在图像Base Network基础上,将Fc6,Fc7变为了Conv6,Conv7两个卷积层,添加了一些卷积层(Conv8,Conv9,Conv10,Conv11),这些层的大小逐渐减小,可以进行多尺度预测。

3 卷积预测器(Convolutional Predictors For Detection)

每个新添加的卷积层和之前的部分卷积层,使用一系列的卷积核进行预测。对于一个大小为m*n大小,p通道的卷积层,使用3*3的p通道卷积核作为基础预测元素进行预测,在某个位置上预测出一个值,该值可以是某一类别的得分,也可以是相对于Default Bounding Boxes的偏移量,并且在图像的每个位置都将产生一个值。

4 默认框和比例(Default Boxes And Aspect Ratio)

在特征图的每个位置预测K个Box。对于每个Box,预测C个类别得分,以及相对于Default Bounding Box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。这里,Default Bounding Box类似于Faster-RCNN中Anchors,如下图所示。

 

Prior Box:

在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:

  • 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
  • 正方形prior box最小边长为,最大边长为:
  • 每在prototxt设置一个aspect ratio,会生成2个长方形,长宽为: 和
  • 而每个feature map对应prior box的min_size和max_size由以下公式决定,公式中m是使用feature map的数量(SSD 300中m=6):
    •                         
    • SSD 300(conv4_3、fc7、conv6_2、conv7_2、conv8_2、conv9_2都生成feature map )
    • SSD使用低层feature map检测小目标,使用高层feature map检测大目标

网络结构:

加分类loss 有3层 conv4_3、conv7(feature map大小19*19, 6个尺寸的包围框)、conv10_2(feature map大小3*3, 4个尺寸的包围框)

图中fc6, fc7名为fc,其实是卷积层。
SSD图2为整个SSD训练网络的结构,由于图像所含层数太多,网络中不能看到每层细节,我重画其中部分层为绿色,作为代表。可以看出,GT标签在分特征图上生成priorbox,即再将所有priobox组合为mbox_priorbox作为所有默认框的真实值。再看预测过程,会在所选取的特征图进行两个 3x3卷积,其中一个输出每个默认框的位置(x, y, w, h)四个值,另一个卷积层输出每个默认框检测到不同类别物体的概率,输出个数为预测类别个数。再将所有的默认框位置整合为mbox_loc,将所有默认框预测类别的向量组合为mbox_conf。mbox_loc、mbox_conf为所有预测默认框,将它与所有默认框的真实值mbox_priorbox进行计算损失,得到mbox_loss。
图中data下方每个priorbox都对应了min_size与max_size,表示不同特征图上的默认框在原图上的最小与最大感受野。关于不同特征图上的min_size与max_size,论文中给出的计算公式,可惜与实现的prototxt中的参数并不对应。

SSD的损失函数如图3所示,由每个默认框的定位损失与分类损失构成。

训练:

数据增强

SSD训练过程中使用的数据增强对网络性能影响很大,大约有6.7%的mAP提升。

(1) 随机剪裁:采样一个片段,使剪裁部分与目标重叠分别为0.1, 0.3, 0.5, 0.7, 0.9,剪裁完resize到固定尺寸。

(2) 以0.5的概率随机水平翻转。

是否在基础网络部分的conv4_3进行检测

基础网络部分特征图分辨率高,原图中信息更完整,感受野较小,可以用来检测图像中的小目标,这也是SSD相对于YOLO检测小目标的优势所在。增加对基础网络conv4_3的特征图的检测可以使mAP提升4%。

使用瘦高与宽扁默认框

数据集中目标的开关往往各式各样,因此挑选合适形状的默认框能够提高检测效果。作者实验得出使用瘦高与宽扁默认框相对于只使用正方形默认框有2.9%mAP提升。

使用atrous卷积

通常卷积过程中为了使特征图尺寸特征图尺寸保持不变,通过会在边缘打padding,但人为加入的padding值会引入噪声,因此,使用atrous卷积能够在保持感受野不变的条件下,减少padding噪声,关于atrous参考。本文SSD训练过程中并且没有使用atrous卷积,但预训练过程使用的模型为VGG-16-atrous,意味着作者给的预训练模型是使用atrous卷积训练出来的。使用atrous版本VGG-16作为预训模型比较普通VGG-16要提高0.7%mAP。

Hard negative mining

值得注意的是,一般情况下negative default boxes数量>>positive default boxes数量,直接训练会导致网络过于重视负样本,从而loss不稳定。在训练时会依据confidience score排序default box,挑选其中confidience高的box进行训练,控制positive:negative=1:3。这样会有更快的收敛和更稳定的结果。

 

缺点:

需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。

 

虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。

SSD is very sensitive to the bounding box size. In other words, it has much worse performance on smaller use input images whose minimum dimension is 600. (在coco数据集上的证明 因为coco上有很多小物体)
This is not surprising because those small objects may not even have any information at the very top layers. Increasing the input size (e.g. from 300× 300 to 512× 512) can help improve detecting small objects, but there is still a lot of room to improve.
(因为有时候空洞卷积就直接卷没了)

 

同一类的物体检测,尺寸变化剧烈无法检测。

 

实验:

1 当去掉多尺度时。用10,11conv的结果不好 因为最大框数量不够(feature map 过小);

用最早finer resolution maps时效果又会好一些,因为有足够的包围框(conv4_3);

当用conv7的结果的时候效果最差。这强调了在不同层上传播不同尺度的盒子至关重要的信息。

 

2.By using a confidence threshold of 0.01, we can filter out most boxes. We then apply nms with jaccard overlap of 0.45 per class and keep the top 200 detections per image.

 

更清楚:算了一遍8000多box怎么来的

http://www.noobyard.com/article/p-qkofddql-ht.html

参考文献:

http://www.cnblogs.com/fariver/p/7347197.html

http://www.noobyard.com/article/p-bgqufpny-ov.html

https://blog.csdn.net/a8039974/article/details/77592395