SSD详解

论文题目:SSD: Single Shot MultiBox Detectorhtml

论文连接:论文连接python

论文代码:Caffe代码点击此处git

 

This results in a significant improvement in speed for high-accuracy detection(59 FPS with mAP 74.3% on VOC2007 test, vs Faster-rcnn 7 FPS with mAP 73.2% or YOLO 45 FPS with mAP 63.4%)github

图1 SSD和其它算法的性能比较算法

1、SSD网络整体架构网络

图2 SSD网络架构(精简版)架构

图3 SSD网络架构(细节版)机器学习

SSD算法步骤:ide

1. 输入一幅图片(200x200),将其输入到预训练好的分类网络中来得到不一样大小的特征映射,修改了传统的VGG16网络;函数

  • 将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7;
  • 去掉全部的Dropout层和FC8层;
  • 添加了Atrous算法(hole算法),参考该连接
  • 将Pool5从2x2-S2变换到3x3-S1;

2. 抽取Conv4_三、Conv七、Conv8_二、Conv9_二、Conv10_二、Conv11_2层的feature map,而后分别在这些feature map层上面的每个点构造6个不一样尺度大小的BB,而后分别进行检测和分类,生成多个BB,如图1下面的图所示;

3. 将不一样feature map得到的BB结合起来,通过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的BB,生成最终的BB集合(即检测结果);

SSD论文贡献:

1. 引入了一种单阶段的检测器,比之前的算法YOLO更准更快,并无使用RPN和Pooling操做

2. 使用一个小的卷积滤波器应用在不一样的feature map层从而预测BB的类别的BB误差;

3. 能够在更小的输入图片中获得更好的检测效果(相比Faster-rcnn);

4. 在多个数据集(PASCAL、VOC、COCO、ILSVRC)上面的测试结果代表,它能够得到更高的mAp值;

 

2、 SSD算法细节

1. 多尺度特征映射

图4 高斯金字塔

作CV的你应该对上图很熟悉吧,对,没错,这就是SIFT算法中的高斯金字塔,对任意的一幅图片作一个高斯金字塔,你能够得到不一样分辨率的图片,模拟了人眼看东西时近大远小的过程。这是针对整幅图像而言,那么,对于patch而言,一样也能够作这个操做。咱们不只能够在图像域作,固然咱们也能够在特征域作。

传统算法与SSD算法的思路比较:

图5 传统作法和SSD作法的比较

如上图所示,咱们能够看到左边的方法针对输入的图片获取不一样尺度的特征映射,可是在预测阶段仅仅使用了最后一层的特征映射;而SSD不只得到不一样尺度的特征映射,同时在不一样的特征映射上面进行预测,它在增长运算量的同时可能会提升检测的精度,由于它具备更多的可能性。

Faster-rcnn与SSD比较:

图6 Faster-rcnn与SSD比较

如图所示,对于BB的生成,Faster-rcnn和SSD有不一样的策略,可是都是为了同一个目的,产生不一样尺度,不一样形状的BB,用来检测物体。对于Faster-rcnn而言,其在特定层的Feature map上面的每一点生成9个预约义好的BB,而后进行回归和分类操做进行初步检测,而后进行ROI Pooling和检测得到相应的BB;而SSD则在不一样的特征层的feature map上的每一个点同时获取6个不一样的BB,而后将这些BB结合起来,最后通过NMS处理得到最后的BB。

缘由剖析:

图7 不一样卷积层的feature map

如上图所示,输入一幅汽车的图片,咱们将其输入到一个卷积神经网络中,在这期间,经历了多个卷积层和池化层,咱们能够看到在不一样的卷积层会输出不一样大小的feature map(这是因为pooling层的存在,它会将图片的尺寸变小),并且不一样的feature map中含有不一样的特征,而不一样的特征可能对咱们的检测有不一样的做用。总的来讲,浅层卷积层对边缘更加感兴趣,能够得到一些细节信息,而深层网络对由浅层特征构成的复杂特征更感兴趣,能够得到一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch咱们利用浅层网络的特征就能够将其检测出来,对于复杂的patch咱们利用深层网络的特征就能够将其检测出来,所以,若是咱们同时在不一样的feature map上面进行目标检测,理论上面应该会得到更好的检测效果。

SSD多尺度特征映射细节:

SSD算法中使用到了conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2这些大小不一样的feature maps,其目的是为了可以准确的检测到不一样尺度的物体,由于在低层的feature map,感觉野比较小,高层的感觉野比较大,在不一样的feature map进行卷积,能够达到多尺度的目的。

2. Defalut box

图8 default bounding box

如上图所示,在特征图的每一个位置预测K个BB,对于每个BB,预测C个类别得分,以及相对于Default box的4个偏移量值,这样总共须要(C+4)* K个预测器,则在m*n的特征图上面将会产生(C+4)* K * m * n个预测值。

Defalut box分析:

图9 Defalut box分析

SSD中的Defalut box和Faster-rcnn中的anchor机制很类似。就是预设一些目标预选框,后续经过softmax分类+bounding box regression得到真实目标的位置。对于不一样尺度的feature map 上使用不一样的Default boxes。如上图所示,咱们选取的feature map包括38x38x5十二、19x19x102四、10x10x5十二、5x5x25六、3x3x25六、1x1x256,Conv4_3以后的feature map默认的box是4个,咱们在38x38的这个平面上的每一点上面得到4个box,那么咱们总共能够得到38x38x4=5776个;同理,咱们依次将FC七、Conv8_二、Conv9_二、Conv10_2和Conv11_2的box数量设置为六、六、六、四、4,那么咱们能够得到的box分别为216六、600、150、3六、4,即咱们总共能够得到8732个box,而后咱们将这些box送入NMS模块中,得到最终的检测结果。

以上的操做都是在特征图上面的操做,即咱们在不一样尺度的特征图上面产生不少的BB,若是将映射到原始图像中,咱们会得到一个密密麻麻的BB集合,以下图所示:

图10 原始图像中生成的BB

Defalut box生成规则

  • 以feature map上每一个点的中点为中心(offset=0.5),生成一系列同心的Defalut box(而后中心点的坐标会乘以step,至关于从feature map位置映射回原图位置)
  • 使用m(SSD300中m=6)个不一样大小的feature map 来作预测,最底层的 feature map 的 scale 值为 Smin=0.2,最高层的为Smax=0.95,其余层经过下面的公式计算获得:
  • 使用不一样的ratio值,[1, 2, 3, 1/2, 1/3],经过下面的公式计算 default box 的宽度w和高度h
  • 而对于ratio=0的状况,指定的scale以下所示,即总共有 6 中不一样的 default box。

图11 default box的计算

3. LOSS计算

与常见的 Object Detection模型的目标函数相同,SSD算法的目标函数分为两部分:计算相应的default box与目标类别的confidence loss以及相应的位置回归。

其中N是match到Ground Truth的default box数量;而alpha参数用于调整confidence loss和location loss之间的比例,默认alpha=1。

位置回归则是采用 Smooth L1 loss,目标函数为:

confidence loss是典型的softmax loss:

 

3、SSD提升精度的方法

1. 数据加强

图12 数据加强效果

如上图所示,不一样于Faster-rcnn,SSD算法使用了多种数据加强的方法,包括水平翻转、裁剪、放大和缩小等论文明确指出,数据加强能够明显的提升算法的性能。主要的目的是为了使得该算法对输入的不一样大小和不一样形状的目标具备更好的鲁棒性。直观的理解是经过这个数据加强操做能够增长训练样本的个数,同时构造出更多的不一样形状和大小的目标,将其输入到网络中,可使得网络学习到更加鲁棒的特征。

2. Hard Negative Mining技术

通常状况下negative default boxes数量是远大于positive default boxes数量,若是随机选取样本训练会致使网络过于重视负样本(由于抽取到负样本的几率值更大一些),这会使得loss不稳定。所以须要平衡正负样本的个数,咱们经常使用的方法就是Hard Ngative Mining,即依据confidience score对default box进行排序,挑选其中confidience高的box进行训练,将正负样本的比例控制在positive:negative=1:3,这样会取得更好的效果。若是咱们不加控制的话,极可能会出现Sample到的全部样本都是负样本(即让网络从这些负样本中找正确目标,这显然是不能够的),这样就会使得网络的性能变差。

3. 匹配策略(即如何重多个default box中找到和ground truth最接近的box

  • 首先,寻找与每个ground truth有最大的IoU的default box,这样就能保证ground truth至少有default box匹配;
  • SSD以后又将剩余尚未配对的default box与任意一个ground truth尝试配对,只要二者之间的IoU大于阈值(SSD 300 阈值为0.5),就认为match;
  • 配对到ground truth的default box就是positive,没有配对的default box就是negative。

总之,一个ground truth可能对应多个positive default box,而再也不像MultiBox那样只取一个IoU最大的default box。其余的做为负样本(每一个default box要么是正样本box要么是负样本box)。

4. Atrous Algothrim(得到更加密集的得分映射)

图13 Atrous Algothrim理解1

做用:既想利用已经训练好的模型进行fine-tuning,又想改变网络结构获得更加dense的score map。
这个解决办法就是采用Hole算法。以下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重做用在feature map上的位置都是物理上连续的。如上图(c)所示,为了保证感觉野不发生变化,某一层的stride由2变为1之后,后面的层须要采用hole算法,具体来说就是将连续的链接关系是根据hole size大小变成skip链接的(图(c)为了显示方便直接画在本层上了)。不要被(c)中的padding为2吓着了,其实2个padding不会同时和一个filter相连。 pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。接着pool5由2变为1, 则后面的fc6中hole size为4。 

图14 Atrous Algothrim理解2

如上图所示,Atrous Algothrim能够在提升feature map大小的同时提升接收场的大小,便可以得到更加密集的score map。

 

5. NMS(非极大值抑制)

在SSD算法中,NMS相当重要,由于多个feature map 最后会产生大量的BB,然而在这些BB中存在着大量的错误的、重叠的、不许确的BB,这不只形成了巨大的计算量,若是处理很差会影响算法的性能。仅仅依赖于IOU(即预测的BB和GT的BB之间的重合率)是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检状况;IOU值设置的过小,则会出现大量的重叠检测,会大大影响检测器的性能,所以IOU的选取也是一个经验活,经常使用的是0.65,建议使用论文中做者使用的IOU值,由于这些值通常都是最优值。即在IOU处理掉大部分的BB以后,仍然会存在大量的错误的、重叠的、不许确的BB,这就须要NMS进行迭代优化。NMS的迭代过程能够看我之前的博客。连接

 

4、SSD性能评估

1. 模块性能评估

表1 模块性能评估

观察上图能够获得以下的结论:

  • 数据加强方法在SSD算法中起到了关键性的做用,使得mAP从65.5变化到71.6,主要的缘由多是数据加强增长了样本的个数,使得模型能够得到更重更样的样本,即提升了样本的多样性,使得其具备更好的鲁棒性,从而找到更接近GT的BB。
  • [1/2,2]和[1/3, 3]box能够在必定程度上提高算法的性能,主要的缘由多是这两种box能够在必定程度上增长较大和较小的BB,能够更更加准确的检测到较大和较小的目标,并且VOC数据集上面的目标通常都比较大。固然,更多的比例能够进一步提高算法的性能。
  • atrous算法能够轻微提高算法性能,可是其主要的做用是用来提速,论文中代表它能够提速20%。主要的缘由多是虽然该算法能够得到更大的feature map和接收场,可是因为SSD自己利用了多个feature map来获取BB,BB的多样性已经足够,因为feature map扩大而多获得的BB多是一些重复的,并无起到提高检测性能的做用。

2. SSD加速的缘由

表2 SSD的BB个数

如上图所示,当Faster-rcnn的输入分辨率为1000x600时,产生的BB是6000个;当SSD300的输入分辨率为300x300时,产生的BB是8372个;当SSD512的输入分辨率为512x512时,产生的BB是24564个,你们像一个状况,当SSD的分辨率也是1000x600时,会产生多少个BB呢?这个数字可能会很大!可是它却说本身比Faster-rcnn和YOLO等算法快不少,咱们来分析分析缘由。

  • 缘由1:首先SSD是一个单阶段网络,只须要一个阶段就能够输出结果;而Faster-rcnn是一个双阶段网络,尽管Faster-rcnn的BB少不少,可是其须要大量的前向和反向推理(训练阶段),并且须要交替的训练两个网络;
  • 缘由2:Faster-rcnn中不只须要训练RPN,并且须要训练Fast-rcnn,而SSD其实至关于一个优化了的RPN网络,不须要进行后面的检测,仅仅前向推理就会花费不少时间;
  • 缘由3:YOLO网络虽然比SSD网络看起来简单,可是YOLO网络中含有大量的全链接层,和FC层相比,CONV层具备更少的参数;同时YOLO得到候选BB的操做比较费时;
  • 缘由4:SSD算法中,调整了VGG网络的架构,将其中的FC层替换为CONV层,这一点会大大的提高速度,由于VGG中的FC层都须要大量的运算,有大量的参数,须要进行前向推理;
  • 缘由5:使用了atrous算法,具体的提速原理还不清楚,不过论文中明确提出该算法可以提速20%。
  • 缘由6:SSD设置了输入图片的大小,它会将不一样大小的图片裁剪为300x300,或者512x512,和Faster-rcnn相比,在输入上就会少不少的计算,不要说后面的啦,不快就怪啦!!!

3. SSD准确率评估

表3 VOC2007评估结果

表4 VOC2012评估结果

表5 COCO评估结果

分析:如上表所示,咱们能够观察到在不一样数据集上面(VOC200七、VOC20十二、COCO),SSD512都得到了最佳的性能,在这里进行了加粗。能够看出,Faster-rcnn和SSD相比,在IOU上面最少相差3个点。

固然这只是做者的结果,具体的结果你能够去测试。好了,我不喜欢在博客里写这些东西,详细的分析经仔细阅读原文。

4. SSD算法的优缺点

优势:运行速度超过YOLO,精度超过Faster-rcnn(必定条件下,对于稀疏场景的大目标而言)。

缺点:

  • 须要人工设置prior box的min_size,max_size和aspect_ratio值。网络中default box的基础大小和形状不能直接经过学习得到,而是须要手工设置。而网络中每一层feature使用的default box大小和形状刚好都不同,致使调试过程很是依赖经验。(相比之下,YOLO2使用聚类找出大部分的anchor box形状,这个思想能直接套在SSD上)
  • 虽然采用了pyramdial feature hierarchy的思路,可是对小目标的recall依然通常,并无达到碾压Faster RCNN的级别。多是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。

我的观点:SSD到底好很差,须要根据你的应用和需求来说,真正合适你的应用场景的检测算法须要你去作性能验证,好比你的场景是密集的包含多个小目标的,我很建议你用Faster-rcnn,针对特定的网络进行优化,也是能够加速的;若是你的应用对速度要求很苛刻,那么确定首先考虑SSD,至于那些测试集上的评估结果,和真实的数据仍是有很大的差距,算法的性能也须要进一步进行评估。

 

5、总结

    SSD算法是在YOLO的基础上改进的单阶段方法,经过融合多个feature map上的BB,在提升速度的同时提升了检测的精度,性能超过了YOLO和Faster-rcnn。下图是其检测结果:

图15 SSD检测效果

 

参考文献:

[1] SSD论文阅读(Wei Liu——【ECCV2016】SSD Single Shot MultiBox Detector),相关连接

[2] 物体检测论文-SSD和FPN,相关连接

[3] 目标检测之YOLO,SSD,相关连接

[4] 论文阅读:SSD: Single Shot MultiBox Detector,相关连接

[5] http://blog.csdn.net/u014380165/article/details/72824889,相关连接


注意事项:

[1] 该博客是本人原创博客,若是您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复你们,谢谢你们。

[2] 因为我的能力有限,该博客可能存在不少的问题,但愿你们可以提出改进意见。

[3] 若是您在阅读本博客时遇到不理解的地方,但愿能够联系我,我会及时的回复您,和您交流想法和意见,谢谢。

[4] 本人业余时间承接各类本科毕设设计和各类小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有须要的请加QQ:1575262785详聊!!!