Spatial Pyramid Pooling in DeepConvolutional Networks for Visual Recognition
之前讲到r-cnn的时候强调,输入CNN的图像尺寸是固定的,这是因为深度卷积网络分为卷积层和全连接层,虽然卷积层对输入图像的大小没有要求,但是全连接层要求图片大小一致。SPP-net可以不管图片的大小/尺度产生一个固定长度的表示方式(representation)。
本文以AlexNet为例,具有5个卷积层。将最后一个池化层(也就是最后一个卷积层之后的pool5)用spatial pyramid池化层代替。
spp层
卷积层接收任意尺寸的输入,输出尺寸也不同,而分类器或者全连接层需要固定尺寸的向量。spp(spatial pyramid pooling)产生固定尺度向量的同时,通过bin可以保留空间信息。这些空间bin的尺寸和图像尺寸成比例,因此bin的数量与图像大小无关。
将最后一个池化层(也就是最后一个卷积层之后的pool5)用spatial pyramid池化层代替。spp的输出是kM维的向量,其中bin的数目是M,k是最后的卷积层的过滤器的数目。这不仅允许任意的宽高比,还允许任意的尺寸。如下图,其中256是conv5的过滤器的数量,conv5是最后一个卷积层,一共有3级bin,第1级bin的个数为4^2个,第2级为2^2个,第3级有1^2个。在每个bin中,我们池化每个过滤器的结果。
训练
单个尺寸:
输入固定尺寸(224x224)的图片,预先计算spatialpyramid 池化所需要的bin的大小。假设conv5之后的特征图的尺寸设为axa,bin为nxn,我们将这个池化通过一个滑动窗口池化实现,窗口尺寸win= ⌈a/n⌉,步长str=⌊a/n⌋,其中⌈·⌉表示向上取整,⌊·⌋表示向下取整。如果pyramid的水平是l(具有l级bin),我们实现l个这样的层。接下来的全连接层(fc6)会连接这l个输出。下图是一个水平是3的pyramid池化的例子,conv5的特征图大小为13x13,sizeX是池化窗口的大小,pool3x3、pool2x2、pool1x1分别有3x3,2x2和1x1个bin。
尺寸不同:
有两张图,一张224x224,一张180x180。我们将224x224尺寸调整为180x180而非剪切,这样两张图片只是分辨率改变,内容和布局不变。我们实现一个固定输入尺寸的网络。con5之后的特征图尺寸axa=10x10。然后我们通过不同的bin,使用win和str去实现每个spp层。这个180-网络的spp层的输出和224-网络具有相同的固定长度。因此,180-网络和224网络每一层的参数一样。也就是说,我们通过两个分享参数的固定网络实现了不同输入尺寸的SPP-net。
在训练中为了避免频繁更换网络的麻烦,采用先用224*224迭代训练一遍,然后复制参数用180*180的网络训练,如此循环。
参考:
http://blog.csdn.net/whiteinblue/article/details/43415035