SPP-Net是出自2015年发表在IEEE上的论文,全名为《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》,作者为何恺明、张祥雨、任少卿、孙剑等人,这篇论文对于整个计算机视觉领域的发展而言具有重大的影响力。
SPP:Spatial Pyramid Pooling,翻译成中文为:空间金字塔池化
在之前的博文中介绍过两阶段目标检测的开山奠基之作—R-CNN,作者是rbg大神。
R-CNN算法的核心思想就是对每个候选框通过CNN提取特征,然后接上一个分类器预测这个区域包含一个感兴趣对象的置信度,也就是说,转换成了一个图像分类问题(类似Imagenet),后面接的这个分类器可以是独立训练的svm。
在RCNN论文里,作者还提到两个保证检测速度的关键点:
但是很可惜,即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的瓶颈。
速度瓶颈:
重复为每个region proposal提取特征是极其费时的,Selective Search对于每幅图片产生2K左右个region proposal,也就是意味着一幅图片需要经过2K次的完整的CNN计算得到最终的结果。
性能瓶颈:
对于所有的region proposal防缩到固定的尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型。
SPPNet是何凯明大神提出的,为了解决R-CNN中速度慢问题!
SPPNet的研究动机主要包括两个方面:
卷积神经网络的全连接层需要固定输入的尺寸,而Selective search所得到的候选区域存在尺寸上的差异,无法直接输入到卷积神经网络中实现区域的特征提取,因此RCNN先将候选区缩放至指定大小随后再输入到模型中进行特征提取。
无论是通过区域裁剪还是缩放来实现区域大小的固定,其实都是一种次优的操作。如下图所示:
可以很明显的看到,直接对候选框进行crop或者warp操作,会使图像出现失真。
众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。
所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。
所以才如我们在上文中看到的,在R-CNN中,“因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN”。
但warp/crop这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度
SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?
这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer。
全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。
由于其全相连的特性,一般全连接层的参数也是最多的。全连接层的权重矩阵是固定的,即每一次feature map的输入必须都得是一定的大小(即与权重矩阵正好可以相乘的大小),所以网络一开始输入图像的尺寸必须固定,才能保证传送到全连接层的feature map的大小跟全连接层的权重矩阵匹配。
下图中连线最密集的2个地方就是全连接层,这很明显的可以看出全连接层的参数的确很多。
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
对于多个候选区域依次进入特征提取网络进行图像特征提取,SPPNet采用直接将全图输入到卷积神经网络中提取图像特征,然后在图像特征图上找到候选区域的图像特征。此外,采用Spatial Pyramid Pooling将不同尺寸的候选区域特征转化为固定尺寸的值,避免了RCNN采用的缩放操作。
R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。
R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像
固定大小的图像塞给CNN 传给后面的层做训练回归分类操作
SPPNet把全图塞给CNN得到全图的feature map
让候选区域与feature map直接映射,得到候选区域的映射特征向量
映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层
selective search 方法输出可能包含物体的候选框(ROI),而一张图图片会有~2k个候选框,每一个都要单独输入CNN做卷积等操作很费时。SPP-net提出:能否在feature map上提取ROI特征,这样就只需要在整幅图像上做一次卷积。
虽然总体流程还是 Selective Search得到候选区域->CNN提取ROI特征->类别判断->位置精修,但是由于所有ROI的特征直接在feature map上提取,大大减少了卷积操作,提高了效率。
但是依旧有两个难点:
原始图像的ROI如何映射到特征图(一系列卷积层的最后输出)
ROI的在特征图上的对应的特征区域的维度不满足全连接层的输入要求怎么办(又不可能像在原始ROI图像上那样进行截取和缩放)?
作者发现,卷积后对应的位置并不会发生改变,每个卷积层会匹配响应的区域。如下图所示:
上图显示,车轮在原图中的位置在特征图上也会出现在响应的位置。
上图卷积核匹配的响应的(轮廓,颜色,纹理)与©匹配的也相似。
这样在目标检测使可以根据特征图画出该物体的位置,也就可以画出具体的框了。
具体的数学推导详见后期博客。
对于目标检测任务提取特征时:
对于任意大小的特征图(如B×C×H×W),Spatial Pyramid Pooling首先分别将特征图划分为若干数量的子块,然后对这些子块计算最大池化,将计算结果进行拼接即可得到固定大小的输出。
上图采用了三个分支,分别将特征图划分1×1、2×2、4×4大小的子块(显然,在不同的划分模式下子块大小是不一致的,输入特征图尺寸不一致时子块大小也不一样),然后对每个子块进行最大池化,即将不同大小的子块都转化为一个值,将池化之后的结果进行拼接即可得到一个大小固定为21维的输出。如此一来,无论输入特征图的尺寸发生如何变化,Spatial Pyramid Pooling均可将其转化为固定大小的尺寸进行输出。
步骤可以总结如下:
例如上图,特征池化层分别为( 4 × 4 4\times4 4×4, 2 × 2 2\times2 2×2, 1 × 1 1\times1 1×1)
将 4 × 4 4\times4 4×4的池化层等比例映射到特征图中,然后再取16格中的每个小格的最大值,再将其拉伸为 16 × 1 16\times1 16×1的vector
同理可得,将 2 × 2 2\times2 2×2的池化层等比例映射到特征图中,再取4格,最后将其拉伸为 4 × 1 4\times1 4×1的vector
1 × 1 1\times1 1×1的将其拉伸成 1 × 1 1\times1 1×1的vector
最后形成的是(16+4+1)*256(256是深度,fillters)的向量
任意尺度的特征图都可以划分维固定大小的维度。
总结一下,SPPNet做目标检测的主要步骤:
利用SS算法从原图中生成2000个左右的候选窗口
卷积操作:将输入图像进行卷积操作,得到整个图像的卷积特征
特征提取:对原始图像的各种候选框,需要在卷积特征中找到相应的位置框,SPPNet不再做区域大小的归一化,而是直接使用ROI池化层对位置框中的卷积提取特征
分类与回归:类似R-CNN,利用SVM基于上面的特征训练分类器模型,用边框回归来微调候选框的位置。
优点:
缺点: