SPPNet

传统的CNN网络由于全连接层的限制,要求输入的图片尺寸是固定的。因此使用时如果图片尺寸不同,就需要对图片先进行裁剪或者缩放,这往往会影响网络的性能。在本文中作者提出在最后的conv layer和fc layer之间加入spatial pyramid pooling layer来使网络可以接收任意大小的输入。

SPP layer的原理其实非常的简单,以上图为例,对于最后一个卷积层的特征,将整个feature map分割成若干个小的区域(上图有三个层次,分别为16,4和1个),然后在每个小的区域内实施max pooling。然后将每个层次的输出都拼接到一块,得到一个最终的输出特征。上图的spp layer输出即为一个(16+4+1)x256维的向量。

So how to implement?

在实际代码中,spp layer通过不同步长和size的max pooling实现。假设feature size为axa,对于一个nxn bins的pyramid level,它的max pooling size为ceil[a/n],stride为floor[a/n],ceil和floor分别为向上取整和向下取整。

Classification

可以看到在ImageNet2012上,使用SPP相比不使用具有更低的错误率。

Detection

spp应用在检测上的方法如上图所示,首先用selective search生成2000个候选框,然后将这些候选框按照最短边放缩到不同的scale,然后对每个窗口实施如图5所示的spp pooling,论文中使用的是4层金字塔结构(1x1,2x2,3x3,6x6),一共50个bins,这样每个窗口都能得到一个固定长度的特征向量(256x50=12,800 d)。将每个特征相同通过每一类的SVM判断是否属于这一类。 图10展示了结果,可以看到和RCNN相比,在基本不损失精度的情况下,sppnet的速度快了几十倍。当然这里的速度提升主要来自于sppnet只对原图进行一次卷积的前向操作,而RCNN会对每个region进行一次前向,而spp pooling的结构则保证了精度能基本维持不变。


Reference

  1. https://arxiv.org/pdf/1406.4729.pdf

Related