Roadmap:
1、SSD:
2、R-SSD
3、Feature-Fused SSD
1.SSD(Single Shot multibox Detector)
论文阅读与翻译:http://noahsnail.com/2017/12/11/2017-12-11-Single%20Shot%20MultiBox%20Detector%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AF%B9%E7%85%A7/
算法概述:SSD算法的主要特点是采用了特征融合,在多层feature map上做目标的定位和分类。与yolo系列相同,SSD算法是一种直接通过回归的方法预测BBOX的坐标(where)和目标类别(what)的算法,没有生成region proposal的过程。
算法效果:对于300×300的输入,SSD在VOC2007测试,在Nvidia Titan X上以59FPS的检测速度达到74.3%的mAP,对于512×512的输入,SSD达到了76.9%的mAP,优于参照的最先进的Faster R-CNN模型。与其它单阶段方法相比,即使输入图像尺寸较小,SSD也具有更高的精度。代码:https://github.com/weiliu89/caffe/tree/ssd
算法详解:算法的核心是多尺度,即同时用浅层的feature map和深层的feature map融合在一起做检测。SSD算法在VGG16的后面添加了N个卷积层,用这些卷积层(如图所示包括Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2和Conv11_2)的输出同时来预测bbox的offset和类别的confidence。
如下图SSD的网络结构,SSD使用6个不同的特征图检测不同尺度的目标。具体而言,SSD将VGG16网络最后的两个全连接层改成卷积层,再增加4个卷积层构造网络结构。对其中6个不同的卷积层的输出分别用两个3*3的卷积核进行卷积,其中之一输出类别执行度confidence,每个default box(类似于faster-rcnn的anchor)都生成N+1个confidence(N标识类别个数,若针对VOC数据集,为20+1个类别);另一个则输出回归用的localization,每个default box生成4个坐标值(x,y,w,h)。另外这5个卷积层还经过priorBox层生成default box(生成的是坐标)。上面所述的6个卷积层中每一层的default box的数量是给定的。最后将前面三个计算结果分别合并然后传递给loss层。
对于一个M*N的feature map,其上的每个cell生成K个default box。用于分类支路的卷积核数量是(N+1)*K;用于位置回归的卷积核个数是4*K。

SSD用到的default box 类似于 Faster-RCNN中的anchor,不同的是Faster-RCNN中的anchor只用在最后一个卷积层,但是本文中的default box应用于不同层的feature map上。在feature map的每个像素点,即feature map cell。

在训练阶段,算法在一开始会将default box和ground truth box进行匹配。比如蓝色的两个虚线框和猫的ground truth box匹配上了,一个红色的虚线框和狗的ground truth box匹配上了。所以一个ground truth可能对应多个default box。在预测阶段,直接预测每个default box的偏移以及对每个类别相应的得分,最后通过NMS得到最终的结果。Fig2(c)说明对于每个default box,同时预测它的坐标offset和所有类的confidence。
每层feature map cell共有6种default box。其aspect ratio(横纵比)共有5种:

每层的scale按以下的公式计算。其中,smin为0.2(最底层的scale为0.2),smax为0.9(最高层的scale为0.9)。

每个default box的宽和高的计算公式为:


SSD的default box从不同尺度的feature map上提取,论文中提到SSD的共8732个boxes,这些boxes来自6层卷积层,如下表所示。

SSD的损失函数和Faster RCNN的基本一样,由分类和回归两部分组成。回归部分的loss是希望预测的box就能尽量和ground truth尽可能接近。

其中位置损失函数用:

多类别执行度预测用Softmax loss函数:

2.R-SSD(Enhancement of SSD by concatenating feature maps for object detection)
论文链接:https://arxiv.org/abs/1705.09587 github地址:https://github.com/soo89/Rainbow-SSD
算法概述:
算法效果:在Nvidia Titan X上,对于300×300的输入,SSD在VOC2007测试,以35FPS的检测速度达到78.5%的mAP;对于512×512的输入,以16.6FPS的速度达到了80.8%的mAP,优于参照的最先进的Faster R-CNN模型。与其它单阶段方法相比,即使输入图像尺寸较小,SSD也具有更高的精度。达到了论文发表时的最佳mAP。
算法详解:因为本文是SSD的改进,首先分析SSD可以改进的地方,即本文的立意。
缺点一:ssd的特征金字塔的每一层都会分别作为分类网络的输入,没有考虑不同scale的feature map之间的关系,因此同一个object在多个层被检测到,被圈了不同的框。如下图所示。

缺点二:SSD算法对小目标object检测效果差。

Rainbow SSD或称为R-SSD针对以上两个弱点做了改进。第一,特征金字塔中层与层之间的关系需要被分类网络利用。第二,特征金字塔中的feature map增加通道数来检测小目标。引用原文:“First, the classifier network is implemented considering the relationship between layers in the feature pyramid. Second, the number of channels (or feature maps) in a layer is increased efficiently.”下图表示了如何通过几种不同的特征融合方式,来增加特征金字塔中feature map的通道数,以达到利用特征金字塔中层与层之间的关系的目的。

上图表示几种不同的特征融合方式,主要体现在特征金字塔的层与层之间的融合。(a)采用下采样pooling的方式进行融合。具体说来,(a)图中最左边的38*38的feature map,pooling后得到19*19的feature map,然后将其和左边第二个的19*19的feature map做concate,这样就有一个红色,一个橙色共两个19*19的feature map了;然后再对19*19的feature map做pooling,再和左边第三个黄色的10*10的feature map做concat。之后的操作类似。pooling操作是降维,所以是从左至右。(b)图表示用反卷积deconvolution的方式进行特征融合。因为deconvolution操作对feature map是升维,这次是从最右边最小的1*1的紫色feature map和左边较大的做concate操作;作者认为前两种特征融合方式的缺点在于信息的传递都是单向的,这样分类网络就没法利用其它方向的信息,因此就有了(c)。(c)表示同时采用pooling和deconvolution进行特征融合,这也是本文rainbow SSD所采用的。应该是同时从左至右(pooling,concate)和从右至左(deconvolution,concate)。(c)中用不同颜色的矩形框表示不同层的feature map,其融合后的结果很像rainbow,可能这就是算法名称Rainbow SSD的由来吧。一个细节是:在做caoncate之前都会对feature map做一个normalization操作,因为不同层的feature map的scale是不同的,文中的normalization方式采用 batch normalization。
总结: 总的来说,作者通过rainbow concatenation方式(pooling由大到小,deconvolution由小到达)融合金字塔中不同层的特征。这样的操作既使算法考虑了不同层feature map之间的关系,同时也增加了不同层的channel个数。因此这种融合方式不仅解决了传统SSD算法存在的重复框问题,同时一定程度上解决了small object的检测问题。
网友评论