在现有的CNN中,对于结构已经确定的网络,需要输入一张固定大小的图片(e.g. 224×224)。那么检测各种大小的图片的时候,需要经过裁剪,或者缩放等一系列操作,这样往往会降低识别检测的精度。在这篇论文中,作者使用池化策略,“空间金字塔池化”,来消除上述影响。这个新的网络SPP-net,使得构建的网络,可以输入任意大小的图片,不需要经过裁剪缩放等操作。
这个新的网络在目标检测上很有效。使用这个网络只需要对全图计算一次feature maps ,然后对任意区域进行池化就可以得到训练检测器需要的固定尺寸。这个方法避免反复计算卷积特征,提升R-CNN检测的速度24-102倍。
____________________________________________________________________________________________________________________________________
之前的技术使用CNN进行训练和测试,要求输入固定大小的图片,这些图片或者经过裁切(Crop)或者经过变形缩放(Warp),都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。
为什么CNN网络需要将图片限制到固定的尺寸才能进行输入呢?
CNN由两部分组成:卷积层以及全连接层。
卷积层进行的操作是利用设置好大小和步长的卷积核对图片进行滑动窗口操作,并且输出代表激活空间排列的特征图(Fig.2)。因此卷积层是不需要输入固定大小的图片的,而且还可以生成任意大小的特征图。
全连接操作中需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小。因此,固定长度的约束仅限于全连接层。
在这种情况下,作者提出了一种解决方式,在原网络的卷积池化层与全连接层中间,加入一个新的层,能使任意大小的feature map转化为特定大小feature的层。从而实现整体网络输入任意尺度图片的要求。文中把这一个新的层称为SPP layer。
原有网络的结构与使用了SPP layer后网络(称为SPP-net)结构如下:
可以把SPP视为词袋模型的延伸,它将图像从精细空间划分到粗糙空间,并聚合其中的局部特征。在CNN流行之前,SPP在检测和分类的应用比较广泛。
对于深度CNN网络,SPP有几个显著的特性:
(1)任意尺寸输入,固定大小输出;
(2)层多 uses multi-level spatial bins,多级池化对于目标变形是鲁棒的;
(3)可对任意尺度提取的特征进行池化
____________________________________________________________________________________________________________________________________
流行的7层CNN由5个卷积层(有些带pooling层)、2个全连接层组成。最后一层被称为是softmax层,有n个输出,这个n指的是类别的数目。
卷积层接受任意输入大小,并且产生可变大小的输出。但是分类器(SVM)或者全连接层需要的是固定大小的数组。而SPP通过在局部spatial bins池化能够维持空间信息,这些spatial bins大小与图像大小成比例,但是bins的数量是固定的。
SPP层的结构如下:
将最后一个(第五层)卷积层之后的池化层使用SPP代替。用spatial bins来对图片提取特征,对每个spatial bin采用max pooling,那么对于M个bin,输出的SPP为256M维向量(这里的256是上面Fig.3中conv5的卷积核的数量,每个格子都是256维的)
更深入的理解:
conv5层输入:一张任意大小的图片,假设其大小为(w,h)。
spp层输出:21个神经元。
也就是我们输入一张任意大小的特征图的时候,我们希望从conv5层的输出提取出21个特征。空间金字塔特征提取的过程如下:
输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分。上面示意图中,利用了三种不同大小的刻度,对一张输入的图片进行了划分,最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。
卷积层输入的任意大小的图片,所以Conv5计算出的feature map也是任意大小的,现在经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出21*256的特征,21表示Spatial bins的数量,256则表示卷积核的数量。
第一张图片,我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);
第二张图片,划分了4个块,每个块的大小就是(w/2,h/2);
第三张图片,把一整张图片作为了一个块,也就是块的大小为(w,h)。
空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。
上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:spatial bin了。如果你希望,金字塔的某一层输出n*n个特征,那么你就要用spatial bin大小为:(w/n,h/n)进行池化了。
当我们有很多层网络并且网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的奥义(多尺度特征提取出固定大小的特征向量)
____________________________________________________________________________________________________________________________________
理论上说,SPP-net支持直接以多尺度的原始图片作为输入后直接BP即可。实际上,caffe等实现中,为了计算的方便,输入的是固定尺度的图片。所以为了使得在固定输出尺度的情况下也能够做到SPP-net的效果,就需要定义一个新的SSP-layer。
对于给定尺寸的图片,作者预先计算出spp需要的bin的数目。
conv5出来的reponse map为a x a,设第l级金字塔有nx n 个bins,我们将这个池化级别作为滑动窗口池化。
那么下一层全连接层的输入则是这第L级金字塔中的输出。
以输入图像大小为224x224举例,这时候conv5出来的reponse map为13x13,下图的spp为一个三层池化金字塔。
由于不受尺度的影响,可以进行多尺度训练,即先resize成几个固定的尺度,然后用SPP网络进行训练,学习。
假设有224x224和180x180两种大小的输入图像(其中180x180是由224x224缩放所得)。conv5的特征分别为224x224->13x13,180x180->10x10。相应的win和str都不同,但bin的数量是相同的都是(9+4+1)x256,后面连着全连接层。