目标检测之SPPnet

首先放图,近年来各目标检测方法对比,横轴为时间,纵轴为精度,每个点处的FPS表示速度,即每秒处理图片的个数,详见上一篇文章目标检测之R-CNN。

目标检测之SPPnet_第1张图片

  SPPnet全称为Spatial Pyramid Pooling in Deep Convolutional Networks,从名字可以看出,SPPnet的关键是在CNN里设计了一个Spatial Pyramid Pooling(SPP)结构,设计该结构的出发点是解决CNN的输入需要为固定大小的问题。对SPPnet的讨论多集中在目标检测领域,是因为SPPnet由R-CNN演变而来,但是SPPnet的方法对于其他使用CNN进行图像识别的任务同样适用,论文中,作者将SPP layer应用到ZFnet [2]和OverFeat [3]上,均取得比原来方法更优的结果。
  下面开始讨论SPPnet的问题来源,在以往的CNN输入时,要将图片调整到设定的大小,就需要对图片进行剪切(下图中)或变形(下图右)。
目标检测之SPPnet_第2张图片   目标检测之SPPnet_第3张图片   目标检测之SPPnet_第4张图片

这样就会导致无法覆盖整个物体(上图中)或物体扭曲(上图右)的问题,就是改变了图像的原始信息,进而影响识别精度。尤其像R-CNN这种提取候选区域的方法,当目标的长宽差别很大(如站立的人,路灯)或者目标很小(如水果)时,调整至固定大小就会导致目标严重扭曲或非常模糊。

  为什么CNN的输入需要固定大小呢?这要从CNN的结构说起,通常的CNN结构包括两部分:卷积层(convolutional layer)和全连接层(fully-connected layer)。卷积层(包括池化层)相当于卷积核以滑动窗的形式,在输入图像(或特征图)上遍历,不需要输入为固定大小的限制,只是输入特征的维度不同,就会产生不同的输出维度。而全连接层的权值需要事先设定,因此,全连接层需要输入维度固定。所以,SPP层就加在了卷积层和全连接层之间,将任意大小的卷积特征映射为固定维度的全连接输入,使卷积层的输入可以为任意大小,从而避免了像R-CNN那样,在提取候选区域(region proposal)之后warp到固定大小而导致图像扭曲的问题。

  SPPnet与R-CNN基本结构的对比如下,SPPnet去掉了图像输入的crop/warp过程,在卷积层和全连接之间增加了SPP(spatial pyramid pooling)层。

其中,SPP层的具体结构如下图,其输入为CNN提取的特征(feature map),假设大小为H*W*d,d为channel个数,SPP层将feature map从不同尺度进行划分,如图中划分了三个尺度,分别为4*4, 2*2, 1*1, 划分后的每个小格叫做一个bin,然后对每个bin进行pooling(通常为maxpool),pooling之后的特征就变为4*4*256,2*2*256,1*1*256维(256为channel个数),最后再将所有pooling之后的特征展开成1维,并连接在一起作为SPP层的输出。所以,只要事先设定划分的尺度和个数,就可以保证输出为固定大小。划分尺度从小到大,是为了提取从细粒度(fine-grained)到粗粒度(coarse-grained)的特征,或者是从局部(local)到全局(global)的特征。feature map为二维矩阵保留了图像的空间拓扑结构,所以称为spatial,不同尺度的划分如同金字塔形状,从小到大,所以称为pyramid,对每个bin的特征提取采用pooling的方式,这就是Spatial Pyramid Pooling的由来。

目标检测之SPPnet_第5张图片

  SPPnet在目标检测上的应用如下图,SPPnet是R-CNN的改进,同样需要提取候选区域(region proposal),SPP layer的输入就变为每个region proposal在feature map上对应的区域(这里是如何对应的放到后面讨论)。由于每个region proposal的大小不一,所以SPP layer在此处就起到了比较重要的作用。
目标检测之SPPnet_第6张图片

  此外,SPPnet对R-CNN还有一点重要的改进,论文中只是简单提了一句,并没有详细介绍,就是CNN只对图像进行一次特征提取,如下图的对比。
目标检测之SPPnet_第7张图片

导致R-CNN速度慢的主要原因在于一个图片的每个region proposal都要进行一次特征提取,2000个region proposals就要进行2000次CNN计算。在CNN特征提取阶段,SPPnet只进行一次CNN计算,然后对每个region proposal,在feature map上计算其对应特征,再对每个region proposal对应的特征进行Spatial Pyramid Pooling,最后再使用SVM进行分类。那么从图像上的区域到feature map的区域是怎样对应的呢?

  这里就要提到一个概念:感受野(receptive field),它指的是卷积网的feature map上的点对应输入图像上的区域,在此,我们将此概念扩展一下,定义感受野为CNN的feature map上的点在它前面的层上所对应的区域,如下图所示,Map3上一点对应Map2上的receptive field为橙色的方框,大小为7×7,在Map1上的receptive field为蓝色的方框,大小为11×11。从CNN的某一层到下一层映射区域大小的计算公式为:
   r=wk+2ps+1 r = w − k + 2 p s + 1
其中w为输入特征的边长,r为输出特征的边长,k为卷积核大小,p为padding大小,s为stride大小。反过来同样成立,即从某一层到上一层对应区域大小的计算公式为:
   w=s(r1)+k2p w = s ( r − 1 ) + k − 2 p
容易通过下图验证,图中两个映射均有padding=0, stride=1。

目标检测之SPPnet_第8张图片

  上面计算的是区域大小,坐标位置的计算就更简单了,计算的坐标指的是receptive field的中心在feature map上的位置,其计算方法如下:
   ci=sci+1+(k1)/2padding c i = s ∗ c i + 1 + ( k − 1 ) / 2 − p a d d i n g
上式表示从 -padding位置起,以s为步长,跳跃 ci+1 c i + 1 步,就到达了receptive field的边缘位置,因为一个点的receptive field大小就是k*k,所以再加上(k-1)/2就是中心点的位置了。卷积核的大小通常为奇数,因此,我们只考虑receptive field只存在一个中心点的情况。

  然而,SPPnet并没有直接把某层的区域映射为下一层的feature map,而是采用角点映射的方式来确定区域的位置,即把region proposal的左上角和右下角映射到feature map上的两个点,并且feature map上两个角点在原始图像上receptive field的中心点与region proposal的两个角点距离最近或者重合,如下图所示。这样相当于在region proposal上增加了一个大小为(k-1)/2的padding,既简化了映射的计算,又保留了region proposal的边缘区域。

目标检测之SPPnet_第9张图片

  SPPnet在目标检测上采用了R-CNN的基本结构,即region proposal + CNN + SVM的多阶段方式,并且做了两点改进,一是提出了一种新的SPP layer,使得CNN能够处理任意大小的输入,可以用于图像分类、目标检测等多种图像识别任务,二是对整个图像只做一次CNN特征提取,并将每个region proposal投影到feature map的对应区域,大大提高了检测速度。

[1] SPPnet: Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition, ECCV, 2014.
[2] ZFnet: Visualizing and Understanding Convolutional Networks, ECCV, 2014.
[3] OverFeat: OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks, ICLR, 2014.

你可能感兴趣的:(深度学习)