Spatial Pyramid Pooling(SPP)原理简介

b站这个Up主讲的挺好,就是莫名其妙搞个背景音乐怪怪的。。。视频讲解
Spatial Pyramid Pooling(SPP)中文叫空间金字塔池化
SPP目的:这个原理要解决的是传统CNN网络对输入图片尺寸要固定这个限制,比如AlexNet中的输入图片都有固定此村224×224,RCNN中为了讲Proposals 做CNN卷积提取特征也得先将不同大小的Proposal经过wrap缩放成同一大小。
为什么CNN要求输入的图片尺寸固定呢?
因为CNN中的最后的全连接层的输入尺寸是固定的(别问我全连接层为什么输入尺寸是固定的/狗头),所以从全连接层倒推到前面的卷积层,卷积层的输入也得是固定的了。
为什么作者要解决这样的限制呢,固定大小不行吗?
那就得说到以R-CNN为代表的以深度学习来解决目标检测的算法模型了,RCNN首先用selective search的方法冲图片中选出2000个region proposal,然后分别将这些proposal缩放为统一大小后传入CNN进行前向传播得到各个proposal的feature map,然后再使用全连接对这些feature map作分类处理。
这样效率就非常低下,因为一张图片就得经过2000次CNN的前向传播,而且这些proposal中很多重叠的区域,十分浪费资源,虽然最终RCNN的精确度挺高,但是无论是空间还是时间都消耗很大。
所以为了解决这个问题,我们首先就得解决CNN对图片大小输入固定的要求!这样我们就可以先提取整个图片的特征,然后将各个proposal映射到这个feature map上,对应每个proposal截取feature map上对应的一部分,得到若干小的feature map,然后将这些大小各异的feature map输入全连接层进行接下来的操作。
解决CNN对图片大小的输入实际上的切入点就是在最后一个卷积层和第一个全连接层之间的转换处,在这里加上我们本文的主角Spatial Pyramid Pooling层,它能够不管输入的feature map 多大,都提取出一个固定大小的feature vector出来传给全连接层。

那么Spatial Pyramid Pooling是如何做到的呢?
Spatial Pyramid Pooling结构:
在这里插入图片描述

可以看见,我们的输入是最后一层卷积层得到的feature maps上每个proposal映射下来对应的个各自的feature map,大小不一。
这里我们的Spatial Pyramid Pooling用三个尺寸不同的pooling 核来做池化操作,分别是44,22,11大小,但是这里的三个pooling核的大小指的是他们会将被pooling的那层分成多少部分,然后每个部分进行pooling操作,例如44就是指不管上层大小多大,分成44个小格子大小,然后对这每个格子大小内的feature做pooling,如果是max pooling则是分别取这44个区域内各自的最大值,然后组成16个特征(所以可以理解为这里的pooling大小是指的输出的尺寸大小 )。然后44+22+1*1=21,于是不管你的输入是多大,SPP在每个channel上都会提取到21维的特征向量!

池化操作对于每个feature map channel都是独立进行的。.

这样就使得我们的效率大大提升,每个region proposal不用单独提取特征,而是在已经提取的整张图片的特征上通过映射找到自己对应的那部分特征,然后通过SPP层提取统一大小的特征向量给全连接层进行接下来的操作!