计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理

最近从头捋一下R-CNN系列的目标检测算法,在R-CNN首次将CNN与目标检测练习到一起之后,为了弥补它效率慢、不是端到端的神经网络、输入图片大小resize不准确等问题,各路神仙在后面陆续推出了SPP Net、Fast R-CNN、Faster R-CNN、R-FCN等R-CNN系列的模型。
在我将R-CNN弄清楚原理及流程之后就开始学习何凯明团队推出的SPP Net的网络模型。SPP Net的核心思想是空间金字塔池化(Spatial Pyramid Pooling, SPP)。读到这个SPP模块的时候,我知道它的作用是想把原本R-CNN的crop/warp的操作去掉,可以大大的提升网络传递效率。但是看了挺久对这个技术弄的不是太明白,怎么办呢?那肯定是求助我们的搜索引擎了。希望各路大神的博客、知乎、CSDN等等的讲解,在这也记录这一天的折腾吧。
一、为什么要引入空间金字塔池化
在理解空间金字塔之前,我们肯定要知道我们为什么要引入空间金字塔。在R-CNN网络中,要对原始图片经过selective search方式产生大概2000个候选区域图,但是很多场景所得到数据并不是固定大小的,得到的图片的size很多是不一致的。因为在AlexNet对输入图像的大小要求一致,所以在将候选区域输入CNN网络之前,要将候选区域进行固定尺寸的缩放。经过selective search和AlexNet对2000张图片的提取,所花费的时间和资源可想而知,可以参看下图方便理解。
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

那么,为了解决图片size不一致的问题,SPP Net引入了空间金字塔层(Spatial Pyramid Pooling, SPP)。引入SPP之后,我们可以至今将图片输入到我们的神经网络,经过SPP层将图片特征图转为统一,下图就是引入SPP层之后网络模型图:
【计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理】计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

图中,a是原有R-CNN的过程,SPP Net加入SPP之后变为b所示,去掉了之前花费大量时间和资源的selective search和AlexNet和2000张图片的拟合过程。
总结一下,引入SPP层将原有多个不同尺寸的图片可以统一输入到网络。目的是去掉R-CNN的crop/warp的过程,并且将原有对2000张图片特征提取的过程统一整合为对一幅图的拟合。
二、为什么空间金字塔可以起作用 其实网上很多对空间金字塔的解释非常容易理解,但是网上查了很多这方面的解释,感觉没有解释到重点,我始终不知道为什么空间金字塔可以提到作用,算了进入正题吧。
在CNN做图像分类,我们在最后的卷积操作之后,会加入全连接层,将卷积提取的特征进行特征分类。SPP的作用是为了将szie不同的图片输入到CNN中。所以,首先我们要知道的是,为什么CNN不允许size不同的图片输入到网络中。其实,卷积操作是允许多个不同尺寸图片进行操作的,CNN中不允许图片size不同的是全连接层。网上很多的解释都是说因为全连接层需要固定参数,但是输入图片大小不一致会导致全连接参数不一致导致网络无法训练。其实,解释到这种程度,我真是不明白为什么输入图片不一样导致全连接参数不同。全连接层里面的神经元不是固定了吗?比如AlexNet中全连接固定位4096个。就因为这个问题困扰我了一天,导致我这一天就没明白SPP到底是怎么解决输入图片大小不一致的问题。其实,SPP解决的就是全连接层参数要求统一的问题。如果有些小伙伴跟我一样对这儿不太明确的话,请继续往下看,我们继续分析。
2.1 为什么全连接层需要相同尺寸的图片输入
下图是我借用他人博客中的一张图来解释为什么全连接层需要固定参数的输入。
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

图中,有两个全连接层,我们只看最后的卷积操作(图中包含了最后的池化层4*4)和第一个全连接层的计算过程(之后的全连接层我统一指第一个全连接层)。最后卷积层经过池化后得到(50,4,4)的feature map。那么卷积层的输出参数就是50*4*4=800。全连接层为(500,1,1),所以全连接层的参数为500,那么卷积和全连接层之前的参数为800*500=400000,即权值参数W和500个偏置参数b,我们这里忽略b。
我们解释一下全连接正向传播的过程,这里再借用一下全连接操作的博客的讲解,如果有深入想了解全连接反向传播过程的可以进去再详细看一下,我们这里只借用讲解一下全连接为什么需要固定参数。
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

其中,x1、x2、x3为全连接层的输入,a1、a2、a3为输出,根据我前边在笔记1中的推导,有
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

可以写成如下矩阵形式:
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片

所以,全连接层的计算过程的权重参数和偏置的数量是固定好的。到这大家应该明白全连接层为什么需要固定参数了吧。
再回到我们的CNN中,我们的全连接层的参数是卷积矩阵(500,4,4)和全连接矩阵(500,1,1)进行计算。全连接矩阵(500,1,1)是固定的,卷积矩阵500也固定到我们的网络中,唯一受输入图片影响的就是单层的feature map(4,4),因为根据卷积公式,卷积操作受输入、卷积核、输出、padding、步长的影响,我们这里训练中动态改变的就是输入图片的数据,所以,带有全连接层的CNN需要统一的图片输入。看到这,各位小伙伴应该明白为什么在SPP Net中我们要利用SPP层进行图片size统一了吧。
2.2 空间金字塔池化层为什么可以解决全连接统一参数
我们知道了为什么要全连接需要图片的size统一,那么为了解决全连接层需要参数统一的问题,我们就要知道为什么SPP可以解决全连接层统一呢。这也是我在网上找了很久没发现想要的答案,还有跟我一样困惑的小伙伴跟我继续往下而分析。
首先,我们介绍一下空间金字塔池化(Spatial Pyramid Pooling, SPP),请看下图:
计算机视觉|SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
文章图片


上图是原文中给出的示意图,需要从下往上看:

  • 首先是输入层(input image),其大小可以是任意的
  • 进行卷积运算,到最后一个卷积层(图中是conv5)输出得到该层的特征映射(feature maps),其大小也是任意的
  • 下面进入SPP层
    • 我们先看最左边有16个蓝色小格子的图,它的意思是将从conv5conv5得到的特征映射分成16份,另外16X256中的256表示的是channel,即SPP对每一层都分成16份(不一定是等比分,原因看后面的内容就能理解了)。
    • 中间的4个绿色小格子和右边1个紫色大格子也同理,即将特征映射分别分成4X256和1X256份
那么将特征映射分成若干等分是做什么用的呢? 我们看SPP的名字就是到了,是做池化操作,一般选择MAX Pooling,即对每一份进行最大池化。我们看上图,通过SPP层,特征映射被转化成了16X256+4X256+1X256 = 21X256的矩阵,在送入全连接时可以扩展成一维矩阵,即1X10752,所以第一个全连接层的参数就可以设置成10752了,这样也就解决了输入数据大小任意的问题了。(注意上面划分成多少份是可以自己是情况设置的,例如我们也可以设置成3X3等,但一般建议还是按照论文中说的的进行划分)
上面这个解释也是参考博客的解释,解释的挺好的。其实可以从这列可以看出来,SPP是通过将输入图片经过三个池化模块,分别提取每个模块里面具体划分的特征图进行contect,这个组合的过程有点类似Inception的意思。经过contect之后形成了(m,1,1)的矩阵,其输入参数就是m*1*1,从而达到了固定参数的作用。
三、总结 最后做一下总结吧,SSP Net通过将不同的输入图片经过卷积操作,利用SSP层将全连接层的参数固定,从而达到CNN网络可以训练size不同图片的作用,解决了R-CNN需要经过selective search后训练多个图片的问题。最后,达到可以将原始图片直接送入网络进行训练,加速了R-CNN系列网络实现端到端的目标检测的过程。
至于SPP Net其他的改进网上博客解释的都非常好,小伙伴们可以参考其他博客结合论文进行学习。

    推荐阅读