SSD: Single Shot MultiBox Detector思想精要&技术细节

来源:互联网 发布:linux怎么退出top命令 编辑:程序博客网 时间:2024/06/08 16:47

一、理解SSD:

这大半个月来一直在捣弄SSD。一篇文章在handle一个task的时候,总是有其隐藏在其背后,独特的处理问题的思想,为了避免过目就忘,决定把SSD的思想提炼总结一下,原则就是简而精:

往大了看,SSD其实就是由两个subtask构成的。这两个subtask绝大多数时候是相互独立的,各做各的事,自己优化自己,不存在交叉优化或者joint training,可以说是并不相关的。只有在最后test/inference的时候,会利用其中一个subtask的prediction作为依据去另一个subtask的prediction中进行检索。

这两个subtask

一个的目的就是在image中找出所有可能包含物体的bboxes,具体实现就是通过在prior boxes的基础上预测offset来找到最合适的bboxes,这个时候的bboxes是没有类别信息的,也就是“天下一家亲”,“不分你我”,只要你这个bbox里面是一个物体(当然要是已指定的C类中的),那我就在你match到的prior bboxes上去学offset,具体怎么match ground truth bboxes和prior bboxes,就是通过计算jaccard overlap,大于0.5就match到一起。
其实换一种思维,这个subtask相当于做了一个salient object detection。但是也有不同,不同在于一般意义上的salient object detection没那么“挑剔”,图片中只要是一个salient object,都会去找一个bbox把它框出来,但是SSD中的这个subtask却“挑剔”一些,因为我们有ground truth bboxes在手上,所以会强制神经网络去学那些要检测的若干类别的bboxes offset。所以,我想另外给这个“挑剔”的salient object detection起一个名字,叫做——class specific salient object detection

另一个的目的也很简单。回到刚才那个subtask来说,通过class specific salient object detection,已经找到了很多bboxes。但是,我们由于这些bboxes都是没有类别信息的,只知道它们是我们想找的那些类中的。然后,我们要怎么把这些bboxes和它的类别对应上呢?这就是第二个subtask做的事。具体来说,它用3x3的卷积,让上一层的每一个feature map cell(其实就是上一层feature map的一个pixel,这么说其实还不严谨,因为卷积是所有channel都要一次性“卷”的,所以应该说feature map cell就是上一个layer的所有feature map的对应localization的pixel组成的集合)都学习到一个长度为(ck)的置信度的向量,其中的c是类别总数,k是prior bboxes的数目,有了这个置信度的向量,根据其中置信度最高的值对应的类别和prior box,我们就能锁定当前这个feature map cell对应的类别了,然后根据它对应的prior box的类别去前一个subtask找到的一堆bboxes中找对应的offset,得到的就是想要的bbox了。这其实只在test的时候用得着,所以说得直白点,第二个subtask其实就是学了一个1>ck的映射,当作检索第一个subtask bboxes的indices,可以给这个subtask起个名字叫做——indices learning

下面这个截取的原论文的文字,(c+4)k分解开来,其中的(4k)对应的就是第一个subtask做的class specific salient object detection(ck)对应的就是第二个subtask做的indices learning

这里写图片描述

================================================================

二、应用SSD时需要注意的细节问题:

SSD是一个设计得很精妙的detector,具体在应用时有一些需要格外注意的细节和参数设置,其中也渗透着SSD的思想。

  1. 首先第一个,选择怎样的base network,VGG还是Inception,或者ResNet,最初的SSD是用的VGG,现在已经有了ResNet的版本,具体我还没有去看。
  2. 第二个,想要在base network的基础上增加addtional layers,并且从哪些layer中引出side output来做detection,也就是上面提到的两个task(class specific salient object detection+indices learning
  3. 决定上面一步中,每一个被引出layer的prior box的scale(以原图大小scale为1做参考)和aspect ratio,还有!step的参数!(step参数指的是feature map上每一个pixel的间隔对应到原图上是step个pixel,step参数的选择应该要参考当前feature map的size来决定)
  4. Hard Negative MiningData augmentation,前者是着重训练那些容易犯错的false ture,后者见仁见智,但是绝对不容忽视。要知道,改进后的data augmentation可以让SSD在VOC07上提升多达3个点(见第9点)。
    这里写图片描述
    这里写图片描述

  5. Atrous is faster,但是这一点我还没有理解。
    这里写图片描述

  6. The effects of using multiple outputs layers
    这也是一个值得注意的地方,作者做了多组实验来观察使用multiple layers对最终mAP的影响。下表右边的mAP有两列,分别代表使用/不使用 boundary boxes。从实验结果来看,使用boundary boxes的时候,大体上层数越多,mAP越好,但是正所谓“物极必反”,当使用很后面的layer的时候,比如conv11_2,由于layer size已经很小了(比较coarse),所以加入conv11_2反而会起相反的效果。
    这里写图片描述

  7. 实验结果,完虐。另外,作者有提到SSD512在SSD300的基础上新增了一个conv12_2做prediction,并且把s_min从0.2减到0.1
    这里写图片描述

  8. 还有一个不大不小的地方就是,无论在VOC07,12,COCO还是ILSVRC上,SSD的训练都采用了Caffe中的'lr_policy':"multistep",而且都是从103作为起始的base_lr,这让人感觉训练策略其实影响也没有太大。

  9. image expansion data augmentation trick,这个也值得学习。作者发下SSD擅长检测large objects,而Faseter-RCNN则擅长检测small objects detection。为了改善SSD在小物体上的性能,特地设计了这个data augmentation的trick。使用之后,相比使用前有近3个点的提升,见下表:
    这里写图片描述

================================================================

More words on SSD:

The impact of Base Network on SSD:
来自一个论坛的帖子,SSD的作者,Liu Wei坦言自己发现在SSD框架下,使用更强的base network,并没有观察到明显的性能提升:
这里写图片描述
Jonathan Huang带领的谷歌detection团队在CVPR2017的文章中也反映了这一点,从下图可以看出,只有Faster RCNN能够持续地从更好的base network中获得提升,其次是R-FCN系列。也难怪Faster-RCNN成为了实际中更加受欢迎的框架。
这里写图片描述

原创粉丝点击