SSD(1)论文阅读

论文地址:SSD: Single Shot MultiBox Detector

简介

本文要介绍一种仅用一个神经网络进行物体检测的方法,我们叫做SSD。对feature map上的每一个位置通过不同的纵横比和尺度得到bounding box,然后转化成默认框。在预测的时候,会对每一个默认框生成每个类别的分数,并且会对默认框做调整让他更符合物体的形状。

网络会从多个feature map做预测,这样可以处理物体的各种尺寸。SSD比那些需要proposals的方法更简单,因为它完全去掉了将proposal生成算法和对像素或者feature重新采样等计算合并到一起的网络(比如RPN网络)。这让SSD更加容易训练并且可以直接集成进系统中。

在ASCAL VOC, COCO和ILSVRC数据集上做了验证,确定了SSD有竞争力的精确度。对300x300的图片,SSD在VOC2007的测试数据集上达到了74.3%的精确度,并且在Nvidia TitanX的机器上速度是59FPS. 对512X512的图片,SSD达到了76.9%精确度,比当前精确度最高Faster RCNN的结果还要好。

介绍

现在最先进的物体检测系统是下面这些方法的变体:假设边界框,根据像素或者特征对每个框重新采样,然后送入一个高质量的分类网络中。到如今在PASCAL VOC,MS COCO,ILSVRC数据集上取得领先地位的是基于 Faster R-CNN的ResNet 。这些算法虽然准确,但是对于嵌入式系统而言计算量太大,即使使用高端硬件,对于实时应用来说也太慢了。通常这些方法的检测速度是通过SFP(每秒帧数)来衡量的,最快的高精确度的检测器Faster RCNN也只有7FPS。有很多构建更快的检测器的尝试,但是现在重要的速度提升都是以牺牲精确度为代价的。

这篇文章介绍了实现物体检测的深度网络,这个网络不用为假设的边界框对像素或者特征进行重新采样,并且精确度和以前的方法一样。这样做的好处是对高精确度的检测器大大提高了速度(对VOC2007测试数据集达到了74.3%的精确度和59 FPS的速度,对比Faster R-CNN是73.2%精确度和7 FPS的速度,并且YOLO是63.4%精确度和45 FPS的速度)。对速度的改进来自于消除proposal以及随后的像素或特征重采样阶段。虽然我们不是第一个这样做的(YOLO),但是通过添加一个系列的改进,我们的方法相比以前的尝试显著提高了准确率。我们的改进包括使用小卷积filter来预测物体边界框位置中的类别和偏移量,使用单独的预测变量(filter)进行不同的宽高比检测,并将这些filters应用于网络后期的多个特征映射,以便在多个尺度上执行检测。因为这些改进,尤其是用多层在不同的比例预测,对低分辨率的图片我们也能够达到高精确度,还会提高检测速度。这些改进看起来很小,但是取得了不错的效果。总结我们的贡献如下:

  • SSD比YOLO更快,而且精确度更高,在保证速度的情况下精确度比Faster RCNN还要高。
  • SSD的核心就是将小的卷积核作用在feature map上对default bounding box预测出每一类的分数和框的偏移。
  • 为了达到更高的精确度,在不同尺寸的feature map上来预测box,这样可以得到不同尺度的predictions。
  • 端到端的设计让训练更加容易精确度更高,甚至对低分辨率的图片也有不错的精度。在检测速度和精度之间实现了良好的平衡。
  • 模型在PASCAL VOC,MS COCO和ILSVRC数据集上进行了测试,在检测时间和精度上与当前最好的方法进行了对比。

SSD(Single Shot Detector)

1.模型

SSD在训练的时候只需要图片和图片对应的gt boxes,上图(a)表示输入的图片和对应的gt boxes,default boxes就是以feature map上的点为中心,按照固定的比例画出4个或者6个框。比如上图(b)是feature map为8x8时的default boxes,(c)是feature map为4x4时的default boxes。对于每一个default boxes,我们会计算它与gt boxes相对偏移\Delta (cx,cy,w,h)和box中的图片是某一种物体的可能性(c_1,c_2,...,c_p)。在训练的时候,我们会将default boxes和gt boxes进行匹配,比如我们有两个box一个和猫匹配,一个和狗匹配,然后我们会认为他们是正样本,其他的都是负样本。这个模型的loss是由距离loss(l1 loss)和分类loss(softmax)相加组成。

SSD是基于前向传播的卷积网络,会生成一系列尺寸固定的bounding box,对这些box中的图像对所有class的可能性打分,然后用nms挑选出最后的检测框。网络前面一些层是基于图像分类的标准架构,我们叫做base network。然后我们增加了辅助网络用于predictions:

用于检测的多尺度feature map:在基础的网络后面增加额外的卷积层,这些卷积层尺寸是递减的,会让检测框在不同的比例下进行预测。

用于检测的卷积预测器:在base network后面增加的每一个feature层,使用一些卷积filter,能够生成一些尺寸固定的检测predictions。可以看下面这张图片。假设有一层feature,尺寸为m\times n,channel为p,用于预测的小的卷积核就是3\times 3\times p,要么生成类别的score,要么生成相对default box坐标的偏移。在每个m\times n的位置,使用卷积核进行计算后会生成一个输出值。输出值是default box与feature map位置之间的相对距离(YOLO 架构则是用一个全连接层来代替这里的卷积层)。

备注:上图中8732个预测框的计算方法是38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*4=8732,意思就是对这些feature map进行卷积运算,将feature map中的每一个像素对应4x(classes+4),表示四组信息,每组信息中有class信息和box信息。

默认框和宽高比:我们将不同尺寸的feature map计算出来的default bounding boxes关联在一起放在了网络的最后。因为每个default box都是在feature map上以卷积方式计算出来的,因此每个default box相对feature map上的位置是固定的。对feature map的每个cell计算出来的是相对default box的偏移,同时还有每个box对所有类别的score。对于feature map每个位置上的k个boxes中的每个box,我们计算c个类别的score和4个相对原始default box的偏移信息,因此filter的个数是(c+4)k,对于m\times n的feature map,输出是(c+4)kmn。关于default box看第一幅图,default box有点像Faster RCNN中的anchor box,但是我们的default box是在很多不同尺寸的feature map上生成的。

备注:我的理解是,后面的每层feature map上每一个像素点生成4个或者6个框固定尺寸的框,这些框叫做default boxes,然后对这层feature map进行一个卷积运算,那么对feature map上的每个像素生成了4个或者6个新的框,但是我们保存的是新的框相对default box的偏移,还会生成新的框对class的score。最后将所有这些信息合并在网络的最后。

2.训练

SSD和有region proposal的模型在训练上主要的差别是,ground truth信息需要分配给一系列detector输出中的特定的输出。就是说gt box要和预测框中的部分来对应。一旦这个分配确定了,loss函数和反向传播就可以端到端的进行。

训练还涉及到:default box的选择,检测的缩放尺度,难挖掘负样本和数据增强策略。

匹配策略:在训练的时候,我们要决定哪个default box对应ground truth box。对于gt box,我们通过位置,长宽比和缩放信息来选择default box。一开始,我们通过jaccard overlap最好的值来确定gt box和default box之间的匹配(像MultiBox一样)。然后我们不像MultiBox那样(进行了改进),我们通过jaccard overlap大于0.5来匹配gt box和default box。这样更简单,也可以预测出多个default boxes,而不是挑选overlap最大的一个。

备注:faccard overlap是交并比,交集除以并集。

训练目标函数:SSD的训练目标函数来自于MultiBox,但是对其进行了扩展,使它可以处理多个目标类别。x_{ij}^{p}=1表示第i个default box与类别p的第j个gt box匹配,x_{ij}^{p}=0表示不匹配。所以\sum_{i}^{ }x_{ij}^{p} \geq 1因为可能不止有一对匹配。loss函数是位置loss(loc)和类别置信度loss(conf)的加权求和。

N是匹配box的个数,如果N=0,我们设置loss为0。loc loss是预测框l和gt box g之间的smooth l1 loss。跟Faster RCNN类似,gt box和default box之间有一种偏移算法。

conf loss是多个类别之间的softmax

\alpha设置为1

对default box选择压缩率和长宽比:为了处理不同尺寸的物体,一些方法建议将图片压缩成不同的尺寸,最后将结果合并起来。然而通过利用同一个网络中不同层尺寸不同的feature map可以实现同样的效果,并且对不同尺寸的物体可以共享参数。之前的一些工作显示使用比较底层一点的feature map可以提升图像分割的质量,因为底层包含输入物体的更多信息。因为这样而想到我们用底层和上层的feature map来做预测。本文的第一幅图就显示了两种feature map尺寸的例子。

我们都知道不同层的feature map有不同尺寸的感受野(receptive field),幸运的是,在SSD的架构中,default box不用与每一层layer的感受野对应。某一层feature map中某个位置的default box,确定了特定的位置和特定的尺寸。假设我们用m个feature maps来做预测。那么default box和每个feature map之间的压缩比例为

这里s_{min}=0.2s_{max}=0.9,意味着最底层缩放比例为0.2,最高层缩放比例为0.9。然后我们用default box引入了几种长宽比值a_r\in {1, 2, 3, 1/2,1/3},然后我们计算default box的宽为w_k^{a} = S_k\sqrt{a_r},长为h_k^{a}=S_k/{\sqrt{a_r}},另外对于a_r=1的情况增加一个{S_k}'=\sqrt{S_kS_{k+1}},这样长宽就是w_k^{a} = {S_k}'\sqrt{a_r}h_k^{a}={S_k}'/{\sqrt{a_r}}。然后我们为这些default box定义中心点为(\frac{i+0.5}{\left | f_k \right |},\frac{j+0.5}{\left | f_k \right |}),其中\left | f_k \right |为第k个feature map的长宽,i,j\in [0, |f_k|)

备注:以上公式中最后算出来的中心坐标和box的长宽都是相对原图的一个比例。就是说最后的default box都是要以算出来的值乘以原图的尺寸。另外根据这个公式我们看发现前面低层对应的default box会比较小,高层对应的default box会相对比较大。

所有这些计算出来的default box就是我们的预测,这些预测框涵盖了多个尺寸和多个长宽比。还是以第一幅图为例子,dog的框只和4x4的feature map中的一个default box匹配,和8x8feature map的所有default box都没有匹配,这样不能匹配的就认为是训练时的负样本。

困难的负样本挖掘:当default box与gt box匹配好后,会发现大部分都是负样本,尤其是当default box的数量非常多的时候。这样正负样本之间就会显著的不平衡,所以我们不会使用所有负样本,而是用conf loss对所有default box进行排序,选取最好的一些,最后负正样本的比例是3:1。我们发现这样会让网络训练的更快而且更稳定。

数据增加:为了让模型更加适用于各种各种输入物体的尺寸和形状,对训练图像随机的做以下一种操作:

  • 使用原始图像
  • 采样一个patch,与物体最小的jaccard overlap是0.1,0.3,0.5,0.7,0.9
  • 随机采样一个patch

采样patch的尺寸是图片原始尺寸的[0.1, 1],并且纵横比是在1/2到2之间。如果gt box的中心在采样patch中,我们保留重叠的部分。在这部分操作后,每个采样的patch都resize到一个固定的尺寸,并且以0.5的概率水平翻转。

实验结果

Base network是VGG16,但是做了一些修改,比如fc6和fc7都改成了卷积运算,将pool5的2x2 s2改成3x3 s1,去掉了所有的dropout和fc8层。然后作者用pre-trained的weight进行了fine tuning。

1.PASCAL VOC2007

在这个数据集,我们与Fast RCNN和Faster RCNN进行了对比。

本文的第二幅展示的就是一个SSD300的模型,对Conv4_3,Conv10_2和Conv11_2层的每个像素只生成4个default boxes,其他层的每个像素都是生成6个default box。从下表可以看出,SSD的精确度比Fast RCNN和Faster RCNN都要好。

2.模型分析

为了更好的理解SSD,我们要分析哪些因素对模型的performance有影响。

数据增加至关重要:从上表第一列和最后一列对比显示,使用数据增加可以提到8.8%的精确度。Faster RCNN的数据增加只是做了数据的水平翻转,我们没有把我们的数据增加方式在Faster RCNN上试验,所以并不知道它是否对Faster RCNN的精确度有帮助,但是我们分析觉得对Faster RCNN的帮助应该不大。

更多default box形状或更好:上面说过每个位置有6个default box,如果我们去掉1/3和3这两个比例的default box会让精确度下降0.6%,如果在此基础上再去掉1/2和2的default box,会让精确度再下降2.1%,所以使用多种尺度的default box,会让网络预测的更准确。

使用Atrous卷积会更快:如果我们使用完整VGG16,保留pool5,fc6和fc7不减少参数,最后的速度会慢20%。

备注:稍微提一下atrous卷积运算,定义feature的长宽为f,卷积核长宽为k,stride为1,定义一个hole size为r进行atrous卷积运算。首先在feature的周围padding (k-1)/2*r(k-1)/2*r列,长度成为了f+(k-1)*r,计算卷积的时候选择第一行,和跳过r-1行后的那一行再加上再次跳过r-1行后的那一行等等,这样挑选出来k行与卷积核做计算。对列同样操作。最后得到的feature map尺寸为f+(k-1)*r-((k-1)*r+1)+1=f,最后运算完尺寸不变,感受野也没有很大变化。

不同分辨率上多个output层会更好:我们测试每次去掉一层,但是在其他层增加default box,让最后总的box数量接近8732。从下表可以看出准确率下降了。另外是否保留边界框对精确度也有影响。

3.PASCAL VOC2012

4. COCO

以上为本文所有内容,感谢阅读,欢迎留言。

猜你喜欢

转载自blog.csdn.net/stesha_chen/article/details/83107251