论文链接:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
摘要:
目前存在的深度卷积神经网络(CNNs)都需要固定大小的图像作为输入,这个输入要求是‘人为造成的’并且有可能会降低图像或任意尺寸的子图的识别精度。这篇论文,作者在网络中使用了一种池化策略,空间金字塔池化来去掉那个输入要求。这个新的网络架构叫做SPP-net,不管输入图像的尺寸多大,都可以输出固定大小的特征。并且这个架构对于目标形变具有很好地鲁棒性。由于具备这些优点,SPP-net通常可以改进所有基于cnn的图像分类方法。在ImageNet 2012数据集中,作者证明了SPP-net提高了各种CNN架构的准确性,尽管这些架构的设计不同。在Pascal VOC 2007和Caltech101数据集上,SPP-net实现了最先进的分类结果,使用单一尺度的图像输入,无需微调。在目标检测中,spp网络的能力也很重要。利用SPP-net算法,只对整个图像进行一次特征计算,然后在特征图上任意区域(子图像)用池化操作提取特征,生成固定长度的表示形式,用于训练检测器。该方法避免了卷积特征的重复计算。在处理测试图像时,比R-CNN方法快24-102倍,同时在Pascal VOC 2007上取得了更好或相近的精度。
思路:
现在的深度卷积神经网络在各个视觉领域都取得了很大的进步,但是存在一个问题,就是网络的输入都需要固定大小。这限制了输入图像的长宽比和尺度。目前针对不同尺寸的输入图像,通常是采用两种做法,一个是将图像剪切到网络需要的输入大小,另一个是直接resize到网络需要的输入大小,如图1所示:
但是裁剪区域可能不包含整个对象,而resize的内容可能导致不必要的几何失真。由于内容丢失或失真,会影响识别的准确性。此外,当对象尺度变化时,预定义的尺度可能不适合。无论如何,固定输入的大小会忽略图像尺度变化的问题。这个问题是怎么造成的呢,经过分析,发现是网络中含有全连接层,全连接层对输入的大小是固定的,而卷积层对输入的大小是没有要求的。问题找到了,该怎么解决呢,就是这篇论文的核心,作者提出了空间金字塔池化(SPP)如图3所示,SPP可以接受任意尺寸的输入,输出固定大小的特征,将它放在第一全连接层前面,就可以将卷积层输出的任意尺度的特征图映射成符合全连接层输入要求的特征,完美的解决这个问题。其实空间金字塔池化在视觉领域早就存在,作者是第一个将其应用到深度卷积神经网络。除了可以生成固定大小的输出,SPP还有一个优点,就是自带提取目标多尺度特征,即使使用固定大小的图像作为输入,也能提高模型的精度。作者不仅将SPP用于图像分类,也用于目标检测,改进R-CNN,R-CNN提取候选区域特征时,要对所有的候选区域逐一提取,造成大量的冗余计算,严重耗时。作者的改进方法是,将全图输入CNN进行一次特征提取,这样就将所有候选区域的特征一次性提取完了,非常快,然后在CNN输出的特征图上使用SPP提取候选区域的特征用于训练SVM,极大地提高了检测速度。
The Spatial Pyramid Pooling Layer:
如图3所示,假设特征图的尺寸为,先确定需要在几个尺度下提取特征,上图是三个,分别是
,
,
,即将特征图划分成
,
,
的网格,每个网格的尺寸为
:然后在每个网格内执行池化操作(作者用的是最大池化),实际执行时,和普通的池化层区别不大,仅仅是设置池化窗口大小和滑动步长,比如讲窗口设置成
,横向步长设置成W/4,纵向步长设置成H/4,就能实现图三左边第一个池化操作,其余两个修改一下窗口和步长也一样。然后将三个不同尺度池化的输出拼接起来就得到一个大小固定的向量了,对于任何输入尺寸的特征图得到的特征向量是固定的,因为决定向量长度的因素是网格的数量,和特征图的尺寸无关。
Training the Network:
训练时不断变换输入图像的尺度固然好,因为可以实现多尺度训练。但是实际实现时可不是这么一回事,举个简单的例子,一般我们训练模型,采用的是随机梯度下降,每个都送一个批次图像进入网络训练,我们通常将输入写作,B表示batch size,后面两个是图像的高和宽,既然写成了这样,就说明输入的图像尺寸还是固定的,同一批次没法做到图像尺寸不一样,即使可以,也不利于GPU并行计算,计算效率很低。所以,SPP虽好,但是具体怎么用还是有考究的。作者给了两个训练的策略:(1)单一尺度计算,即和不使用SPP一样的输入格式,所有输入图像都设置成固定的尺寸输入网络,但是在SPP中,使用不同尺度的池化操作,即池化的窗口是由各种尺度组成的,这样的好处是可以提取到一个目标的多个尺度,这样也能提高网络的性能。(2)多尺度训练,即每个批次的尺度一样,不同的批次尺度不一样。具体这么操作,比如预先设定的尺寸区间为[180,230],则先以
的尺度训练一定数量的epoch,然后在以比如
的尺度训练一定数量的epoch。测试时就不需要考虑那么多了,不管什么尺度,直接输入测试就行了。作者提出的这两个策略,在利用GPU并行优势情况下,发挥了SPP的功能。
实验结果: