前言:这是一篇比较老的文章了,是何恺明大神于2015年在IEEE上发表的,到目前为止被引用量已经达到2038。SPP-Net是一种可以不用考虑图像大小,输出固定长度的特征向量的网络结构,并且可以做到在图像变形情况下表现稳定。SPP-Net的效果已经在不同的数据集上面得到验证,速度上比R-CNN快24-102倍。在ImageNet 2014的比赛中,此方法检测中第二,分类中第三。
摘要
现有的深度卷积神经网络(CNN)需要固定尺寸(例如224×224)的输入图像,这可能会损害任意大小/比例的图像或子图像的识别精度。在这项工作中,作者为提出了一项新的池化策略,即“空间金字塔池化”,以消除上述要求。新的网络结构称为SPP-Net,可以生成固定长度的特征表示,而与图像大小/比例无关。通过消除固定大小的限制,可以总体上改进所有基于CNN的图像分类方法。SPP网络在ImageNet 2012,Pascal VOC 2007和Caltech101的数据集上都实现了最先进的准确性。
SPP-Net的功能在目标检测中更为重要。使用SPP-net,我们只需要从整个图像计算一次特征图,然后在任意区域(子图像)中合并特征,以生成固定长度的特征表示以训练检测器。该方法避免了重复计算卷积特征。在处理测试图像时,该方法比最近的领先方法R-CNN计算卷积特征快30-170倍(整体速度快24-64倍),同时在Pascal VOC 2007上获得更好或相当的准确性。
一、SSP-Net 介绍
在SSP-Net提出之前,所有的神经网络都是需要输入固定尺寸的图片,比如224x224(ImageNet)、32x32(LeNet-5)、96x96等。这样当我们希望检测各种大小的图片的时候,需要经过crop或者warp等一系列操作,这会在一定程度上导致图片信息的丢失和变形,限制了识别精确度。而且,从生理学角度出发,人眼看到一个图片时,大脑会首先认为这是一个整体,而不会进行crop和warp,所以更有可能的是,我们的大脑通过搜集一些浅层的信息,在更深层才识别出这些任意形状的目标。
SPP-Net对这些网络中存在的缺点进行了改进,基本思想是:输入整张图像,提取出整张图像的特征图,然后利用空间关系从整张图像的特征图中,在空间金字塔池化层(spatial pyramid pooling layer)提取各个推荐区域的特征。相比于R-CNN提取2000个推荐区域,SPP-Net只需要将整个图扔进去获取特征,这样操作速度提升了100倍左右。
在2015年之前,深度神经网络通常由两部分组成:卷积部分和全连接部分。要求输入图像需要固定尺寸的原因并不是卷积部分而是全连接部分。所以SPP层就作用在最后一层卷积之后,SPP层的输出就是固定大小了。
需要注意的是:SPP-Net不仅允许测试的时候输入不同大小的图片,也允许训练的时候输入不同大小的图片,原因是通过不同尺度的图片可以防止过拟合。
二、空间金字塔池化层
卷积层的参数和输入大小无关,它仅仅是一个卷积核在图像上滑动,不管输入图像多大都没关系,只是对不同大小的图片卷积层输出不同大小的特征图。但是,全连接层的参数就和输入图像大小有关,因为它要把输入的所有特征点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的特征向量的大小。因此,固定长度的约束仅限于全连接层。 SPP-Net在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。
如上图所示,黑色图片代表卷积之后的特征图,接着以不同大小的块(Spatial bins)来提取特征,分别是4x4,2x2,1x1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块。从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。
比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。所以特征提取层Conv5计算出的feature maps是任意大小的,经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出(16+4+1)x 256的特征。
总而言之,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义。
三、训练阶段
在文章中,作者提出两种训练方式:一种是Single-size Training,一种是Multi-size Training。区别是训练集图片的尺寸是固定的还是可变的。
- Single-size Training。理论上说,SPP-Net支持直接以多尺度的原始图片作为输入。实际上,caffe等实现中,为了计算的方便,GPU、CUDA等比较适合固定尺寸的输入,所以训练的时候输入是固定了尺度了的。
- Multi-size Training。使用两个尺度进行训练:224x224 和180x180。训练的时候,224x224的图片通过crop得到,180x180的图片通过缩放224x224的图片得到。之后,迭代训练,即用224的图片训练一个epoch,之后180的图片训练一个epoch,交替地进行。两种尺度下,在SSP后,输出的特征维度都是(9+4+1)x256,参数是共享的,之后接全连接层即可。
四、测试阶段
在测试阶段,作者将SPP-Net测试过程与R-CNN进行了对比。
对于R-CNN,整个过程是:
- 首先通过选择性搜索,对待检测的图片进行搜索出大约2k个推荐区域。
- 把这2k个推荐区域的图片都缩放到227x227,然后分别输入CNN中。每个推荐区域提取出一个特征向量,也就是说利用CNN对每个推荐区域进行提取特征向量。
- 把上面每个推荐区域的对应特征向量,利用SVM算法进行分类识别。
而对于SPP-Net,整个过程是:
- 首先通过选择性搜索,对待检测的图片进行搜索出2000个推荐区域。这一步和R-CNN一样。
- 把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。这一步就是和R-CNN最大的区别,R-CNN输入的是每个候选框,然后再进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,所以速度会大大提升。
- 最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。
通过对比可以看出:R-CNN的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。
五、总结
图像的比例和大小在视觉识别中很重要,但是在深度网络的背景下却很少考虑。对此作者提出了一种解决方案通过空间金字塔池化层来训练深度神经网络。SPP网络在分类/检测任务中显示出卓越的准确性,并大大加快了基于DNN的检测速度。研究结果还表明,计算机视觉中许多久经考验的技术仍然可以在基于深度网络的识别中发挥重要作用。