SPP-net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    一提到SPP-net就不可避免的会提到R-CNN,那这两者之间是个什么关系呢?通过之前的博客也可以了解到,R-CNN它是用于目标检测的一个框架,它使用了selective search提出了proposals,然后训练AlexNet提取特征,最后通过训练SVM分类器完成分类,从而最终完成detection的功能。那么SPP-net也是一个新的框架吗?我认为应该不能算是一个新的框架,事实上,SPP-net是对R-CNN的一种改进,而改进的核心之处便在于作者提出的用Spatial Pyramid Pooling layer替换AlexNet的pool5。不仅仅是对R-CNN,对于所有的基于CNN的模型都可以加上Spatial Pyramid Pooling layer。上面这段文字只要是先对SPP-net有一个直观的印象,下面正式开始介绍SPP-net。
    一般情况下,深度网络要求输入的图片是固定尺寸的。这是为什么呢?以AlexNet为例,因为只有固定尺寸了,在最上层的池化层pool5的尺寸才是固定的。那么为什么我们想要pool5层的尺寸是固定的呢?因为其后面连接的是两层全连接网络fc6和fc7,fc6和pool5的输出直接相连。因为fc6的输入维度是固定的,所以要求pool5的输出是固定尺寸的,进而反推回去才是要求输入的图片是固定尺寸的。这样我们就明白了,其实最根本的不是要输入图片的尺寸固定,而是要pool5层的输出尺寸是固定的,固定输入图片的尺寸只是实现pool5层输出尺寸固定的一种途径。那么我们看一下固定输入尺寸带来了什么不好之处呢?
    实现输入图片尺寸固定的方式有两种,一种叫做crop,一种叫做warp。以下图为例解释什么是crop和warp:
这里写图片描述
    假如我们要求输入图片的尺寸是224*224,那么对于左图,就是从原始图片的中间crop(裁剪)出一块能够大致表示原始图像的224*224的区域,可以看到,这样的操作使得最后输入网络的图片并没有完整地包含物体,导致了信息的丢失。而对于右图,则是先把目标图片框出来,然后对这个目标图片进行不固定宽高比的warp(变形),使得最后的图片也满足224*224的要求,可以看到,这样的操作虽然包含了完整的物体,但是使得最后输入网络的图片包含的物体是变形和扭曲了的,同样也是一种信息的丢失。正是由于这些信息丢失的存在,使得神经网络的识别精度有所降低。
    前面我们提到,固定输入图片的尺寸只是实现pool5层有固定尺寸的输出的一种方式,那么还有没有其它方式可以允许我们输入任意尺寸的图像而可以获得同样固定尺寸的pool5层的输出呢?这便是SPP-net要解决的问题,也是其核心所在。下图展示了没有Spatial Pyramid Pooling layer(后面简称为spp)的cnn和有spp的cnn分别是如何工作的,可以直观的看到,有了spp之后,对输入图片便没有尺寸的要求了,所以也不用做crop和warp的预处理了,从而最大可能地保留了原始的信息。
这里写图片描述
下图便是spp的一个示意图:
这里写图片描述
    可以看到输入图片在经过卷积层到达conv5的feature maps的时候,按照传统的方式是用一个固定尺寸比如2*2的窗口,以步长(stride)为2在feature maps上面滑动,对每一个窗口内的值都取最大值或者平均值(分别叫做最大池化和平均池化),从而得到池化层的输出,并将这个输出输入到全连接层中。而这里的spp则不一样,它是事先固定好我要进行L次池化,这里设L=3,每次池化的尺度不一样,但也都是规定好的。比如说第一次池化是将图像分为4*4的区域,对每个区域取最大值,这样会获得16*256(256是滤波器的个数,也就是feature maps的个数)个输出,然后第二次池化是将图像分为2*2个区域,对每个区域取最大值,这样会获得4*256个输出,第三次池化是将图像分为1*1个区域,也就是feature map本身,并取其最大值,这样会获得1*256个输出,把这三次池化的输出级联起来,就得到了(16+4+1)*256个输出,并将这些输出输入到全连接层fc6中。
    比较上面提到的传统的池化方式和spp池化方式,我们不难发现,在测试(test)阶段,如果图片的尺寸改变了,对于传统的池化方式而言,其得到的池化层的输出的维度也会改变,这是由于feature maps的尺度改变了造成的,从而造成无法和全连接层fc6的维度吻合,而对于spp池化而言,其得到的池化层的输出的维度还是保持不变,因为输出的维度与feature maps的尺寸无关,只与我事先定义好的L次池化的参数有关(eg:4*4,2*2,1*1),从而可以和全连接层fc6的维度吻合。
    上面说的是在测试阶段,spp可以允许任意尺度的图像作为输入,但是在训练阶段也是允许任意尺度的图像作为输入吗?答案是否定的。下面来探究原因。首先看看在测试阶段,有spp的cnn当输入图像尺寸发生改变的时候,什么在改变?改变的是在conv5的feature maps上面进行滑窗的窗口的尺寸和步长,这是为了产生固定的4*4的、2*2的以及1*1的池化输出。在测试阶段一次只有一张图片,所以可以根据该图片得到的feature maps的尺寸调整滑窗窗口的尺寸和步长,使得可以产生出4*4、2*2以及1*1的spp池化层输出,而在训练阶段,一个batch里面的输入图像的尺寸如果不一样,则无法找到一个合适的滑窗窗口的尺寸和步长使得对于batch中的各个尺度的图片都能产生4*4、2*2以及1*1的spp池化层输出。除非对于每一个训练图片都重新计算其滑窗窗口的尺寸和步长,这是不现实的。因此,在训练的时候,输入图片的尺度应该是一样的。
    训练阶段分为两种方式,一种是单一尺度的训练方式,一种是多尺度的训练方式,这儿的多尺度是指把用多组不同尺度的数据集进行交替训练,和之前说的输入图片的尺度应该是一样的不冲突。
    [1]单一尺度的训练方式
    以尺度固定为224*224为例,经过图像经过crop后变成要求的224*224的图像,在经过AlexNet的五层卷积层后的feature maps的尺度应该是13*13,假设采用L=3层的,获得的池化结果分别为3*3,2*2以及1*1的spp池化策略,那么对于获得3*3的池化结果的第一层,滑窗窗口尺寸应该是(13/3)向上取整为5,步长为(13/3)向下取整为4,同理可以推出对于获得2*2以及1*1的池化结果的池化层的滑窗窗口参数。具体见下图:
这里写图片描述
    [2]多尺度的训练方式
    多尺度的训练方式是为了模拟在测试阶段输入图像的尺度大小不一致,所以在训练阶段也加入了多尺度的训练方式。在以224*224为固定尺度的单一尺度训练基础上,把每张224*224的图片都按比例缩放到180*180的尺度上,再次训练一个单一尺度的网络模型。多尺度还不仅仅是分别训练两个单一尺度的网络模型,注意观察,事实上无论是输入为224*224的图片还是180*180的图片,训练的这两个模型的参数是一模一样的(包括卷积层和全连接层,只有在spp池化层的窗口尺度和步长不一样,但这里不影响而这共享网络参数)。正是由于这一个特性,所以作者还采取了让这两个模型共享卷积层参数的交替训练方式,第一个epoch(把一个尺度下的所有训练图片都训练了一遍叫做一个epoch)训练尺度为224*224的网络模型,然后把网络参数赋给180*180的模型,然后再训练一个epoch,如此交替。正也是在模拟测试的时候输入图像尺度各不一样的情况,为的是提高检测效果。
    SPP-net出彩的地方不仅仅在于它使得对于神经网络而言,在测试图片的时候可以是任意尺度的图片,还有一个非常出彩的地方在于它对于R-CNN在速度上的提高。首先回顾R-CNN在测试图片的时候是怎么做的。首先对图片进行selective search,选出大约2k数量的检测建议(detection proposals),随后将这些检测建议都warp到固定尺寸依次输入到网络模型中,也就是说对于一张测试图片,我们要进行大约2k次神经网络的前向传播,这无疑是耗费时间的。那么有了SPP-net后我们可以怎么做呢?我们先对测试图片提取2k个proposals,然后我们直接将测试图片输入到神经网络中,而没有将proposals输入到神经网络中,并将proposals在测试图片中的位置映射到proposals在conv5后的feature maps中的位置,虽然这些proposals的feature maps大小不一,但是有了spp层,就都可以得到同样维度的池化结果。因此,没有spp的时候,对于一张测试图片要进行2k次前向传播才能得到2k个池化结果,而有了spp之后,对于一张测试图片仅仅需要进行一次前向传播便可以得到2k个池化结果。检测速度得到了极大的提升。
    因此,spp的提出,有以下两个贡献,一个是使得网络可以有任意尺度的图片输入,第二个避免了重复计算卷积特征,达到了对R-CNN极大的加速效果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值