SSD学习笔记

目标检测算法——SSD:Single Shot MultiBox Detector,是一篇很是经典的目标检测算法,十分值得阅读和进行代码复现,其论文地址是:https://arxiv.org/abs/1512.02325git

同时,我使用pytorch对SSD代码进行了复现:https://github.com/Dengshunge/mySSD_pytorchgithub


 

1、前言

1.1 什么是SSD

从论文的题目《SSD:Single Shot MultiBox Detector》能够看出,single shot代表是one_stage检测算法,即不须要相似faster R-CNN中的RPN等区域推荐算法,一步就能获得预测坐标和类别,实现真正的end-to-end训练;multibox表示是多框预测,即SSD算法借鉴了faster R-CNN中的锚点框思想,对每一个先验锚点框进行预测,判断其类别和目标的预测框。算法

1.2 为何提出SSD

在SSD算法提出以前,R-CNN系列的目标检测算法,其准确率很高,可是这些算法须要消耗大量计算资源,特别是对于嵌入式设备或者终端设备,其算力没法知足此类算法,形成了没法进行实时目标检测。网络

目标检测的检测速度一般使用FPS进行衡量,即1秒能处理多少帧。Faster R-CNN的检测速度只有7FPS,虽然已经比之前的算法快不少了,但远远还达不到实时检测的效果。虽而后续对faster R-CNN作了不少改进来提升FPS,但这些增益都是以牺牲大量精度为前提。框架

所以,急需一种速度快且精度不低的目标检测算法。函数

1.3 如何平衡速度与精度

以下图所示,下图是R-CNN系列,YOLO和SSD的性能对比图(Ref.《目标检测算法之SSD》),能够看出SSD在速度和mAP上都有较大的提高。性能

那么,SSD能实现速度与精度的平衡,是经过如下方式来实现的:学习

a) 改变网络结构,并使用多尺度融合;测试

b) 精心设计先验锚点框,和锚点框匹配策略;spa

c) 使用多个tricks来提升精度,如用于平衡正负样本数量的难例挖掘(hard negative mining)和数据加强。


2、网络结构

如图1所示,是SSD的网络结构。在论文中,图片的输入尺寸为300*300*3,使用VGG16做为主干网络,同时,作出了如下修改:

  1. 将本来VGG16的FC6和FC7换成卷积层Conv6和Conv7,并依次加入新的层:Conv8_2,Conv9_2,Conv10_2,Conv11_2。具体而言,在Conv7层的特征图为19*19*1024,通过1*1*256和3*3*512-s2的卷积操做后,获得Conv8_2的特征图,其尺寸为10*10*512,依次类推。
  2. 为了实现多尺度融合,须要将不一样层的特征图提取出来进行判断。在论文中,做者使用Conv4_三、Conv七、Conv8_二、Conv9_二、Conv10_2和Conv11_2的特征图来进行多尺度融合。如图2所示,每层特征图会分别通过3*3的卷积,获得2个tensor,分别用于进行坐标预测和类别置信度预测。其中,用于坐标预测的通道数是(num_anchor*4),num_anchor表示该特征图每一个位置对应的锚点框数量,4表示(x_min,y_min,x_max,y_max);用于类别置信度预测的通道数是(num_anchor*num_classes),num_classes表示类别的数量(包含背景),对于VOC来讲,num_classes=21,20个类别加上1个背景。另外,论文中会对Conv4_3层的特征图使用L2归一化后,再进行3*3的卷积,这样作的目的是,防止此层特征图的值过大,利于收敛。

对于须要融合的特征图,假设此特征图的尺寸是w*h,那么,对于每一个位置(x,y),会预先生成N个锚点框(具体锚点框的细节,下面会叙述),所以,每张特征图会生成w*h*N个锚点框。SSD经过对每一个锚点框进行位置回归和类别预测,并经过NMS非极大值抑制获得最终的检测结果。

SSD算法会生成一系列预测框(bounding boxes)和每一个预测框的得分,而后经过NMS非极大值抑制获得最终的检测结果。以下图所示,是SSD的网络结构。

 图1 SSD的网络结构

图2 特征图的处理

3、锚点框

SSD的锚点框借鉴了faster R-CNN的锚点框思想,但不一样的是,在SSD中,每一个特征图对应的锚点框均不相同,即锚点框会根据特征图的尺寸发生变化。例如,Conv4_3的锚点框和Conv7的锚点框的尺寸是不同的。假定使用m张特征图进行预测判断,每张特征图的锚点框大小,能够经过下式进行计算:

$$s_k=s_{min}+\frac{s_{max}-s_{min}}{m-1}(k-1),k\in [1,m]$$

其中,$s_{min}=0.2$和$s_{max}=0.9$,表示Conv4_3特征图的锚点框的尺寸为0.2,Conv11_2特征图的锚点框尺寸为0.9。既然有了锚点框的大小,能够理解为面积,接下来就须要为锚点框设置不一样的宽高比。做者设置了5种宽高比,分别是$a_r={1,2,3,1/2,1/3}$,所以,能够计算获得宽度$w_k^a=s_k\sqrt{a_r}$,高度为$h_k^a=s_k/\sqrt{a_r}$。对于宽高比为1的状况,额外增长一个锚点框,其尺寸为${s_k}'=\sqrt{s_ks_{k+1}}$。因此,通常而言,第i层特征图的(x,y)位置,具备6个锚点框。而第一层特征图和最后两层层特征图,每一个位置只设置4个锚点框。所以,图1中的8732个锚点框是这样计算获得的,$38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732$。

经过对不一样特征图设置不一样的锚点框,有利于检测不一样尺寸的物体,大特征图可检测小物体,小特征图能够检测大物体。如图3所示,(a)表示带GT框的图像;(b)表示在8*8的特征图中,每一个位置使用6个不一样尺寸的锚点框,当某个锚点框与GT框的IOU大于阈值时,将其设置成正样本,该位置下其余锚点框为负样本;(c)表示4*4特征图下,红色虚线框用于预测狗的状况,会输出loc和conf两个tensor,loc表示相对于锚点框的偏移量,conf表示每一个类别的置信度。

 

图3 锚点框匹配

当设定了锚点框后,就须要制定其匹配规则,即制定哪些锚点框用于回归GT框和预测类别。首先,为每一个GT框匹配一个与其IOU最高的先验锚点框,保证了每一个GT框都有对应的锚点框,来预测GT框;其次,当GT框与先验锚点框的IOU大于阈值(0.5)时,也指定该锚点框用来预测该GT框。固然,若锚点框A与多个GT框的IOU都大于阈值,则该锚点框A选择与其IOU最大的GT框。

图4是锚点框与GT框的匹配示意图,为了方便理解,将锚点框映射回原图尺寸,与GT框进行匹配。

 

图4 锚点框与GT框的匹配

4、其他策略

  • SSD的损失函数继承了R-CNN系列的损失函数,以下所示,由位置损失和置信度损失组成,位置损失使用了smooth1,置信度损失使用多类别交叉熵:

$$L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))$$

  • 此外,SSD能够理解成对图片进行密集采样,获得8732个patch,而后对这些patch进行预测和回归。所以,会发现,大部分锚点框都会匹配上背景,也就是被设置成负样本。所以,会形成正负样本之间的不平衡。对于此状况,SSD使用了hard negative mining策略来缓解这一矛盾。在SSD中,并无使用全部的负样本,而是将这些匹配上背景的样本根据置信度损失进行降序排列,取出置信度损失进行排序,将损失较大的样本认为是难例(hard negative),须要模型重点学习。选取损失最大的前N个样本做为负样本,正样本与负样本的比例控制在1:3左右,对于那些没有选上的样本,label设置成-1,不参与训练当中。
  • 为了扩大感觉野,加快推理速度,还使用了空洞卷积。
  • SSD中还采用了数据加强的策略,如对原图进行色域变换、扩增、采样的操做,具体能够参考这篇文章。

5、实验结果

 (1)VOC测试结果

下表是SSD在VOC的实验结果图。与Fast R-CNN和Faster R-CNN进行对比,分别使用了300*300和 512*512的图片做为输入。在07+12+COCO数据集上来看,SSD300比Faster R-CNN的mAP提升了0.8%,SSD512提升了2.8%。此外,SSD的定位偏差更小,由于SSD是直接回归目标的形状和进行分类,将定位和分类合成了一步。可是,对于类似目标,SSD容易产生混淆,多是由于对不一样种类的目标共享了位置。SSD还容易预测框尺寸的干扰,即在小目标上其性能比大目标要差。做者认为这多是因为在浅层的时候,小目标物体包含的信息很少。当增长了分辨率的时候,这种状况获得了较好的改善。

 

(2)模型分析

为了了解SSD中各组成对结果的影响程度,做者使用SSD300进行了控制变量实验,结果以下图所示。

 

  • 数据加强:在R-CNN系列中,采用的是原图或者对原图进行翻转等变换。而SSD中,使用了更多的策略,包括扩增、采样等。能够看出,使用数据加强的SSD,mAP提升了8.8%。但做者认为,一样的数据加强策略,对R-CNN系列可能会失效,由于在进入分类头的时候,使用了特征池化。
  • 锚点框的多样性:在SSD中,对特征图的每一个位置使用了6个不一样形状的锚点框,每层特征图的锚点框也均不一致。当移除锚点框后,mAP都出现了不一样比例的降低。使用不一样尺寸的锚点框,使网络能更加简单对锚点框进行回归。可是不是锚点框越多越好呢?锚点框越多,推理速度也就越慢。这中间应该会有折中。
  • 空洞卷积:在本实验中,使用的是带空洞卷积版本的VGG16。若是使用彻底版本的VGG16,即保留pool5和对fc6/fc7不使用下采样,增长conv5_3进行特征融合。这样的话,能获得相同精度的结果,但速度却慢了20%。
  • 多尺度融合:SSD的主要贡献在于在不一样分辨率的特征层中使用了不一样尺寸的锚点框,进行多尺度融合。为了比较这一作法的影响,做者去除某些用于特征融合的层,实验的结果以下表所示。为了保证一致性,锚点框的数量保持接近8732。能够看出,当特征层愈来愈少的时候,mAP也会随之降低,从74.3降低到62.4。

 

 (3)推理时间

下表是SSD的推理时间对比图。能够看出,SSD中精度和速度上作到了比较好的平衡。

 


 

SSD是一种很优秀的one-stage框架,对后面不少目标检测算法有着深远的影响。读完论文,发现仍是对SSD的了解不够深刻,接下来,会对其源码进行分析。

相关文章
相关标签/搜索