SSD论文笔记

    论文:Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy,Scott Reed, Cheng-Yang Fu, Alexander C. Berg.SSD: Single Shot MultiBox Detector


素质三连

1.论文贡献

提出SSD目标检测模型,是一个single-stage目标检测模型,综合了YOLO、RPN以及语义分割的思想。

运行速度快,可是实现实时检测,精度相较于YOLO大幅提高。

关键点:使用多尺度/多比例的先验包围框,在多个特征图上预测,使用卷积核预测包围框和置信度。

2.实验结果   

对SSD300,在VOC 2007 test上达到72.1% mAP和58FPS;对SSD500,达到75.1% mAP,超越了Faster R-CNN。

3.存在的问题

对小目标的检测性能较差。


SSD

    SSD(Single Shot MultiBox Detector)和YOLO 的网络架构对比如下:

1.jpg

    由上图可知:SSD的输入分辨率为300x300,也称为SSD300,而YOLO 的输入分辨率是448x448;SSD使用VGG16作为backbone,YOLO使用GoogLeNet;SSD使用卷积核预测包围框(bounding box)和类别置信度,而YOLO使用全连接网络;SSD使用多个特征图进行预测,即多尺度,而YOLO使用单尺度特征图。总结SSD的核心要点如下:

  1. 使用多尺度特征图进行目标检测。在backbone后面增加几层卷积层,特征图的分辨率逐层降低。使用这些多个不同分辨率的特征图用于目标检测。低层特征图有学习到的是精细的表层特征,高层特征图学习到的是抽象的特征。换句话说,低层特征图有利于检测小目标,高层特征图有利学检测到大目标。

  2. 使用先验包围框。对于用于检测的特征图的每个像素,设置一组不同长宽比例和大小的先验包围框。对于每个包围框,预测相对于先验包围框的偏移以及该框对每个类别的置信度,这其实就是RPN

  3. 使用卷积运算进行预测。对于用于检测的特征图,使用卷积运算预测包围框。比如,对于m×n×p的特征图,使用3×3×p的卷积核进行卷积计算,预测每个像素的类别置信度和所有先验包围框的偏移。

    具体地说,对于某个位置的k个框,每个框计算c个类别置信度和相对于先验包围框的4个偏移,因此每个位置输出维度是 (c+4)k,这个分辨率为mxn特征图预测结果的维度是(c+4)kmn

    SSD整个流程如下图:

2.jpg

匹配策略

    训练时,需要确定gt bbox(ground truth包围框)对应的先验包围框。策略1:找到与gt bbox的IOU最大的先验包围框,这样保证每个gt bbox至少对应一个先验框。但是一个图片中gt bbox非常少,而先验框却很多,这样正负样本极其不平衡。策略2:对于其它的先验包围框,若与gt bbox的 IOU 大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。


损失函数

    设xijp=1表示第i个默认框匹配到类别p的第j个gt框,否则xijp=0。根据匹配策略,一个gt框至少对应一个输出框,即Σi xijp >=1。总损失函数是定位损失(loc)和置信度损失(conf)的加权和,公式如下:

3.jpg

    N是匹配的先验框(即被预测为正确的)的数量,l是预测框,g是gt框,α表示定位损失的加权系数,根据交叉验证,α的取值为1。

    定位损失Lloc 使用Smooth L1损失,计算公式如下:

4.jpg

    d是先验框。

    置信度损失Lconf(x,c) 采用的是softmax损失:

5.jpg

    

先验框尺度和比例的选择

    为了利用低层的表层特征和高层的抽象特征,SSD使用多个尺度的特征图用于预测目标。假设想用m个特征图取做预测,那么每个特征图使用的先验框尺度的计算公式如下:

6.jpg

    smin=0.2,smax=0.95,s表示先验框大小相对于图片的比例。随着特征图的减小,先验框大小逐渐增加。最底层的尺度是0.2,最顶层的尺度的0.95。每个位置的先验框有不同的长宽比例 ar∈{3, 2, 1, 1/2, 1/3}。先验框的宽度是wka=sk* ar1/2,高度是hka=sar1/2。对于比例1,额外增加一个尺度为sk’ = (s* sk+1)1/2,对于k=m的特征图,假设sm+1来设置sm+1。因此每个位置可以有6个不同的先验框。某些层仅使用4个先验框,则不使用长宽比3, 1/3。

    设置每个先验框的中心是((i+0.5) / |fk|, (j+0.5) / |fk|),其中|fk|是特征图的边长,i, j ∈[0, |fk],截断坐标以至于先验框的边界总是在[0,1]。

    通过组合来自多个特征图的所有位置的具有不同尺度和比例的所有先验框的预测,可以得到一组覆盖不同的输入对象大小和形状的预测。例如,在 Fig.1 中,狗与4×4特征图的先验框匹配,但不与8×8特征图中的任何先验框匹配,这些不匹配的先验框则是负样本。


难例挖掘

    难例挖掘的概念在R-CNN博客里有介绍过,经过gt bbox和先验框的匹配后,被匹配先验框是正例,没有被匹配的先验框是负例,前面说过,正例和负例的数量非常不平衡,这会导致收敛速度变慢。因此这里并不使用所有负例,而是从所有负例中挑选出高置信度的负例,使得正负例达到1:3。


数据增强

    后面会分析到,数据增强有利于模型学习到平移不变性,对提高精度非常重要。这里使用随机水平翻转,随机裁剪,随机采集块域等技术。


训练和实验    

数据增强

    使用VGG16,在ILSVRC CLS-LOC数据集上进行预训练。跟DeepLab-LargeFOV类似,对预训练的模型修改如下:将fc6和fc7转换为1x1卷积层,从fc6和fc7下采样参数;将pool5的size = 2x2, stride = 2变为size = 3x3, stride = 1;使用atrous算法填补”holes”;去除fc8。然后对模型进行微调,使用SGD,初始学习率为0.001,动量系数为0.9,权重衰减为0.0005,batch_size=32。

    开源的代码: https://github.com/weiliu89/caffe/tree/ssd 

VOC2007实验

    作为对比,Fast R-CNN,Faster R-CNN,和SSD均使用预训练的VGG16作为backbone,在VOC2007 trainval和VOC2012 trainval (16551 images) 进行训练,在VOC2007 test (4952 images)进行测试。

    下面是SSD300的结构图:

7.jpg

    使用conv4_3,conv7 (fc7), conv8_2, conv9_2, conv10_2,和pool11的输出特征图预测包围框和置信度。对于新添加的层,使用xavier初始化参数。因为conv_4的特征图比较大(38x38),故仅放置4个先验框在上面:比例为1的且尺度为1和0.1的先验框,另外两个比例为0.5和2。其它特征图每个像素放置6个先验框。与其他层相比,conv4_3具有不同的特征尺度,因此使用ParseNet中介绍的L2 normalization技术将特征图中每个位置的feature norm缩放到20,并在反向传播期间学习尺度。

    首先设置学习率为0.001,迭代40k,然后设置学习率0.0001,然后迭代20k。得到的结果如下:

8.jpg

    上表中的SSD500除了输入分辨率之外,其它的与SSD300相同。可以看到SSD500的mAP甚至超越了,Faster R-CNN。使用[Diagnosing error in object detectors]的目标检测分析工具对SSD500的分析如下:

9.jpg

    观察发现,相比于R-CNN,SSD有更小的定位误差,表明这种通过回归先验框的定位方法优于回归SS生成区域推荐的方法。但是SSD对相似目标的分类错误率更高,这大概是因为多个类别共享定位缘故。

    SSD对包围框的大小很敏感,即它在较小目标上的性能比较大目标要差得多,这是因为小目标提供的信息较少,通过增加输入分辨率可以改善这点,如下图所示:

10.png


模型分析

    通过控制变量法观察影响SSD性能的因素,结果如下表:

11.jpg

    从上表可以发现,数据增强是关键。其次是使用更多的特征图,conv4_3可以捕获到更加精细的特征,对小目标尤其重要。第三是,越多的先验框效果越好。最后是使用atrous版本的VGG16更快、而且更好。


PASCAL VOC2012实验

12.jpg 

MS COCO实验

13.jpg


推断 

    在测试时,对预测的包围框执行NMS。首先使用置信度阈值为0.01,可以过滤掉大部分预测的包围框,然后使用Thrust CUDA库对包围框的置信度进行排序,使用GPU计算两两包围框的IOU,然后应用阈值为0.45的NMS,最终每张图片得到200个包围框。这一步SSD300在VOC上需要花费2.2ms。

    各个检测模型的精度和速度对比如下:

14.jpg



参考文献

[0]Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy,Scott Reed, Cheng-Yang Fu, Alexander C. Berg.SSD: Single Shot MultiBox Detector

[1]chenghaoy.SSD论文笔记.https://blog.csdn.net/chenghaoy/article/details/85263060 .2019-01-03


上一篇:
下一篇:

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于