R-CNN非常缓慢,因为通过 Selective search得到的2000个目标区域,再进入CNN网络中2000次运算需要大量的时间。SPP-Net试图解决这个问题(对特征提取部分的升级,也要得到2K的候选框,但不是以前2K个候选框逐个提取特征)。

使用SPP-net(空间金字塔池化网络)先对一整张图进行一次卷积得到整张图的卷积特征。然后卷积特征中找到对应的2000多个候选区域的位置框,送入到空间金字塔池化层中,对2000多个候选区域的位置卷积提取特征,就可以完成特征提取工作速度更快。

还有一个挑战:我们需要为CNN的全连接层产生固定维度大小的输入,SPP-net使用了更多的技巧,可以输入任意尺寸的图像不像r-cnn需要固定输入图像尺寸,有时候会丢失数据。它在最后的卷积层之后使用空间金字塔(spatial pooling ),而不是传统上使用的最大池化(max-pooling)。SPP层将任意大小的区域划分为恒定数量的bins,并且在每个bin上执行最大池化(max-pooling)。由于bins的数量保持不变,所以如下图所示产生固定维度的特征向量。

以上是spp-net的核心部分,下面开始详细讲解spp-net的空间金字塔原理。

目标检测:fast-rcnn学习上

空间金子塔池化简称ROI池化层,一般跟在最后一层卷积层后面,它的输入可以是任意大小的卷积特征(所以在CNN输入的时候也就是任意尺寸的图像。相比r-cnn的CNN需要固定输入图像尺寸,输入图像经过缩放会数据丢失),输出的是固定维度的特征向量。

如上面我们的卷积层,每层代表一个通道,有256层即256个通道。每层里面取最大池化得到最右边的256-d的特征

同样的方法,我们对一层平均分成 1/2 x  1/2大小的网格,图中绿色部分代表一层,共有256层,也是取最大池化得到

中间的4x 256-d的特征。

继续同样的方法,对一层平均分成 1/4 x  1/4大小的网格,图中蓝色部分代表一层,共有256层,也是取最大池化得到

左边的16x 256-d的特征。

最后将这1+4+16=21个特征输入到全连接层。我们发展池化层的输入于卷积层的尺寸无关,得到的特征数目不变。

小结:

spp-net 也是要2k个候选框,但只进行了一次运算,更高效。在输入给CNN时候,不用对2k个框统一尺寸,减少数据丢失,因为对CNN的最后一层卷积层加了金字塔池化层,再输入给全连接层提取特征。整体思路还是提取候选框,特征提取,svm分类,定位。

值得一提的是,spp-net提出的这种金字塔池化来实现任意图片大小进行CNN处理的这种思路,得到了大家的广泛认可,以后的许多模型,或多或少在这方面都是参考了这种思路,就连在后来提出的fast-rcnn上也是收益于这种思想的启发.