SPP-net:空间金字塔池化

论文地址:https://arxiv.org/pdf/1406.4729.pdf

目录

0、写在前面

1、动机

2、SPP模块

3、写在后面


0、写在前面

现有(2015年之前)的CNNs网络都要求固定输入尺寸,而这种要求比较“人工”,且有可能降低那些任意尺寸输入的精度。作者提出了一种新的池化策略——空间金字塔池化(SPP),不管输入尺寸是什么,都可以生成固定长度的输出表示。

基于所提出的SPP,在ImageNet分类和 Pascal VOC 2007目标检测上,证明了该方法的有效性。

凯明大神提出的这个SPP后续影响了很多研究,如SPP-YOLOv3、PSPNet等。虽然该作是在RCNN的基础上加上SPP进行的扩展,但其思想仍值得学习。

后面将重点讲解SPP本身的思想,而已经过时的整个网络结构我们并不关心,所以下文将不是全文阅读理解,而是对SPP的重点跳读。

1、动机

先放一张图:

传统CNNs都要求固定的输入尺寸,如224*224等。但是,原图通常不是这个大小,所以在送入网络之前的预处理阶段,通常需要利用crop、resize等方式将原图变为固定的尺寸。不过这种方式通常会降低识别精度,比如crop会丢失信息、resize则会产生几何形变,这些影响会使识别变得困难。如上图中最上面一行的两个例子所示,原图信息发生了变化。

之所以需要固定输入尺寸,这跟传统CNNs的结构是有关系的。如上图第二行,传统的处理过程是:图像经过crop/warp固定到统一尺寸,经过卷积层提取特征,然后送入全连接(FC)获得分类结果。这个过程中,卷积层是可以接受任意大小的输入的,可是全连接层需要固定大小的输入,所以只能在送入卷积层之前就先固定输入尺寸。可以想见,阉割后的输入数据信息已经发生了变化,那经过CNN提取后的特征就难免有所损失。而这个问题也就是凯明大神提出SPP模块的目的,就是为了可以处理任意大小的输入,而不至于特征提取过程收到影响。

加上SPP后的结构,如上图最下面一行所示:原图可以直接送入CNN层,经过SPP获得固定尺寸,然后送入FC层获取输出。可见,SPP只不过将传统网络对固定尺寸的需求挪到了CNN层之后、FC层之前,这样一来,对整个网络的输入尺寸就不做要求了,这也就不用冒着损失特征的风险,强行将输入尺寸改为统一大小,而是在提取特征之后,通过一个SPP模块来转换到固定的尺寸再送到FC层。

加入SPP的好处可以概括为三点:

  • 可以接受任意大小的输入,并生成固定大小的输出;
  • SPP使用了多种大小的空间粒度,而传统Pooling操作只用了一个滑窗大小,这种特性对目标形变较为鲁棒;
  • 由于输入大小的任意性,SPP可以在不同尺度上池化所提取的特征,也即:不同尺度的输入,可以提取不同尺度的特征,这丰富了特征的尺度信息。

此外,由于增加SPP后,可以接受任意大小的输入,所以就可以使用多尺度训练、多尺度测试了,这也是其他所有不限制输入尺寸的网络结构(如FCN等)所特有的权利。

2、SPP模块

具体的,SPP结构如图所示:

简单解析一下SPP模块:

  • 输入image(假设为:224*224)经过CNN层之后,得到了所提取的feature maps(假设维度为13*13*256);
  • 在SPP层,将原来的每个feature map分为多种网格子图,如:4*4、2*2、1*1,注意到:不管原来的feature map尺寸是多少,都按照同样的方式划分网格,也即,不同大小的feature map所得的网络中每个子网格的大小是不一样的;
  • 然后,不管网格中的每个子图的大小,都对其分别进行池化操作,得到一个值,这样一来,有多少网格就得到多少输出,如4*4网格得到16个输出;
  • 最后,将每种网格池化的结果拼接起来,就形成了一个固定尺寸的feature maps,如(16+4+1)*256-d;

经过SPP的处理,任意纵横比、任意尺度的输入都可以得到相同大小的输出。

3、写在后面

SPP的提出,使得任意大小的输入变得可能,这与FCN类的网络有异曲同工之妙。由于不限制输入大小,所以就可以提取到多尺度的信息,这种特性就是多尺度训练的基础。另外,SPP中使用多种网格对原feature map进行划分,因此这里也可以提取到多尺度的信息,这进一步使模型更加鲁棒。

猜你喜欢

转载自blog.csdn.net/oYeZhou/article/details/113308324