首先放图,近年来各目标检测方法对比,横轴为时间,纵轴为精度,每个点处的FPS表示速度,即每秒处理图片的个数,详见上一篇文章目标检测之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的由来。
这里就要提到一个概念:感受野(receptive field),它指的是卷积网的feature map上的点对应输入图像上的区域,在此,我们将此概念扩展一下,定义感受野为CNN的feature map上的点在它前面的层上所对应的区域,如下图所示,Map3上一点对应Map2上的receptive field为橙色的方框,大小为7×7,在Map1上的receptive field为蓝色的方框,大小为11×11。从CNN的某一层到下一层映射区域大小的计算公式为:
r=w−k+2ps+1 r = w − k + 2 p s + 1
其中w为输入特征的边长,r为输出特征的边长,k为卷积核大小,p为padding大小,s为stride大小。反过来同样成立,即从某一层到上一层对应区域大小的计算公式为:
w=s(r−1)+k−2p w = s ( r − 1 ) + k − 2 p
容易通过下图验证,图中两个映射均有padding=0, stride=1。
然而,SPPnet并没有直接把某层的区域映射为下一层的feature map,而是采用角点映射的方式来确定区域的位置,即把region proposal的左上角和右下角映射到feature map上的两个点,并且feature map上两个角点在原始图像上receptive field的中心点与region proposal的两个角点距离最近或者重合,如下图所示。这样相当于在region proposal上增加了一个大小为(k-1)/2的padding,既简化了映射的计算,又保留了region proposal的边缘区域。
[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.