【目标检测】SPP-Net论文理解(超详细版本)

一、初步认识

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。

在这里插入图片描述
再次回顾一下R-CNN的步骤:

  1. 找出图片中可能存在目标的侯选区域region proposal
  2. 进行图片大小调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成2000×4096维矩阵
  3. 将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000×20维矩阵
  4. 分别对2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS)剔除重叠建议框,得到该列即该类中得分最高的一些建议框
  5. 修正bbox,对bbox做回归微调。

在RCNN论文里,作者还提到两个保证检测速度的关键点:

  1. 所有类别的分类器共享相同的特征输入
  2. 与传统特征相比,深度特征维度一般比较低,比如VGG16里的4096维

但是很可惜,即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的瓶颈。

速度瓶颈:

重复为每个region proposal提取特征是极其费时的,Selective Search对于每幅图片产生2K左右个region proposal,也就是意味着一幅图片需要经过2K次的完整的CNN计算得到最终的结果。

性能瓶颈:

对于所有的region proposal防缩到固定的尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型。

SPPNet是何凯明大神提出的,为了解决R-CNN中速度慢问题!

三、研究动机

SPPNet的研究动机主要包括两个方面:

  1. 卷积神经网络的全连接层需要固定输入的尺寸,而Selective search所得到的候选区域存在尺寸上的差异,无法直接输入到卷积神经网络中实现区域的特征提取,因此RCNN先将候选区缩放至指定大小随后再输入到模型中进行特征提取。

    无论是通过区域裁剪还是缩放来实现区域大小的固定,其实都是一种次优的操作。如下图所示:

在这里插入图片描述
可以很明显的看到,直接对候选框进行crop或者warp操作,会使图像出现失真。

  1. RCNN使用Selective Search从图像中获取候选区域,然后依次将候选区域输入到卷积神经网络中进行图像特征提取,如果有2000个候选区域,则需要进行2000次独立的特征提取过程。然后,这2000个候选区域是存在一定程度的重叠的,所以如此设计会导致大量的冗余计算。

在这里插入图片描述

1. 关于图像尺寸的理解

众所周知,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。

2. 关于为何全连接层需要固定输入

全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。

由于其全相连的特性,一般全连接层的参数也是最多的。全连接层的权重矩阵是固定的,即每一次feature map的输入必须都得是一定的大小(即与权重矩阵正好可以相乘的大小),所以网络一开始输入图像的尺寸必须固定,才能保证传送到全连接层的feature map的大小跟全连接层的权重矩阵匹配。

下图中连线最密集的2个地方就是全连接层,这很明显的可以看出全连接层的参数的确很多。

在这里插入图片描述

四、SPP-Net作出的改进

  1. 减少卷积计算
  2. 防止图片内容变形

1. 与传统CNN的对比

在这里插入图片描述

SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。

在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。

2. 与R-CNN的对比

在这里插入图片描述
对于多个候选区域依次进入特征提取网络进行图像特征提取,SPPNet采用直接将全图输入到卷积神经网络中提取图像特征,然后在图像特征图上找到候选区域的图像特征。此外,采用Spatial Pyramid Pooling将不同尺寸的候选区域特征转化为固定尺寸的值,避免了RCNN采用的缩放操作。

R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。

1)R-CNN模型

  1. R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像

  2. 固定大小的图像塞给CNN 传给后面的层做训练回归分类操作

2)SPP-Net模型

  1. SPPNet把全图塞给CNN得到全图的feature map

  2. 让候选区域与feature map直接映射,得到候选区域的映射特征向量

  3. 映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层

五、SPP-Net中的难点

selective search 方法输出可能包含物体的候选框(ROI),而一张图图片会有~2k个候选框,每一个都要单独输入CNN做卷积等操作很费时。SPP-net提出:能否在feature map上提取ROI特征,这样就只需要在整幅图像上做一次卷积。

虽然总体流程还是 Selective Search得到候选区域->CNN提取ROI特征->类别判断->位置精修,但是由于所有ROI的特征直接在feature map上提取,大大减少了卷积操作,提高了效率。

但是依旧有两个难点:

  1. 原始图像的ROI如何映射到特征图(一系列卷积层的最后输出)

  2. ROI的在特征图上的对应的特征区域的维度不满足全连接层的输入要求怎么办(又不可能像在原始ROI图像上那样进行截取和缩放)?

六、原始图像中的ROI如何映射到特征图

作者发现,卷积后对应的位置并不会发生改变,每个卷积层会匹配响应的区域。如下图所示:

在这里插入图片描述

上图显示,车轮在原图中的位置在特征图上也会出现在响应的位置。

上图卷积核匹配的响应的(轮廓,颜色,纹理)与©匹配的也相似。

这样在目标检测使可以根据特征图画出该物体的位置,也就可以画出具体的框了。

具体的数学推导详见后期博客。

七、ROI池化层

在这里插入图片描述

对于目标检测任务提取特征时:

在这里插入图片描述
对于任意大小的特征图(如B×C×H×W),Spatial Pyramid Pooling首先分别将特征图划分为若干数量的子块,然后对这些子块计算最大池化,将计算结果进行拼接即可得到固定大小的输出。

上图采用了三个分支,分别将特征图划分1×1、2×2、4×4大小的子块(显然,在不同的划分模式下子块大小是不一致的,输入特征图尺寸不一致时子块大小也不一样),然后对每个子块进行最大池化,即将不同大小的子块都转化为一个值,将池化之后的结果进行拼接即可得到一个大小固定为21维的输出。如此一来,无论输入特征图的尺寸发生如何变化,Spatial Pyramid Pooling均可将其转化为固定大小的尺寸进行输出。

步骤可以总结如下:

  1. 例如上图,特征池化层分别为( 4 × 4 4\times4 4×4, 2 × 2 2\times2 2×2, 1 × 1 1\times1 1×1)

  2. 4 × 4 4\times4 4×4的池化层等比例映射到特征图中,然后再取16格中的每个小格的最大值,再将其拉伸为 16 × 1 16\times1 16×1的vector

  3. 同理可得,将 2 × 2 2\times2 2×2的池化层等比例映射到特征图中,再取4格,最后将其拉伸为 4 × 1 4\times1 4×1的vector

  4. 1 × 1 1\times1 1×1的将其拉伸成 1 × 1 1\times1 1×1的vector

  5. 最后形成的是(16+4+1)*256(256是深度,fillters)的向量

在这里插入图片描述

任意尺度的特征图都可以划分维固定大小的维度。

在这里插入图片描述

八、总结

总结一下,SPPNet做目标检测的主要步骤:

  1. 利用SS算法从原图中生成2000个左右的候选窗口

  2. 卷积操作:将输入图像进行卷积操作,得到整个图像的卷积特征

  3. 特征提取:对原始图像的各种候选框,需要在卷积特征中找到相应的位置框,SPPNet不再做区域大小的归一化,而是直接使用ROI池化层对位置框中的卷积提取特征

  4. 分类与回归:类似R-CNN,利用SVM基于上面的特征训练分类器模型,用边框回归来微调候选框的位置。

优点:

  • SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature
    map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发

缺点:

  • 训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)
  • 分阶段训练网络:选取候选区域、训练CNN、训练SVM、训练bbox回归器, SPP-Net在fine-tuning阶段无法使用反向传播微调SPP-Net前面的Conv层(SSP-Net是没有微调特征提取的卷积层的)
  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值