论文阅读+SSP net+特征金字塔网络

《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》-2014

1.解决什么问题

    在R-CNN出来之后,在使用cnn来进行目标检测时,如果网络的结构确定了,那么需要输入一张固定大小的图片,比如224*224,32*32,96*96等。这样对于我们希望检测各种大小的图片的时候,需要经过裁剪,或者缩放等一系列操作,这样往往会降低识别检测的精度。于是我们希望,我们建立的网络是否能够输入任意大小的图片,不需要经过裁剪缩放等操作,只要你喜欢,任意大小的图片都可以。

2.解决的思路是什么?/(解决方案)

1:将经过SS处理后(含有2kregion proposal)的整幅图像输入CNNs,不需要对图像中的每一个proposal进行训练,然后得到整个featuremap,大大减少了计算proposal的特征时候的运算开销。然后Mapping aWindow to Feature Maps.

具体过程:

前提:我们已经知道了ROI位置,我们的目的是要在卷积层上得到对应的候选窗口。

①  取得ROI中心点位置(x,y)      ②   则对应的feature map path的左上角点为右下角点为 

2:由于第一步的功劳,对于每一副图像不需要训练CNN网络多次。只需要训练一次CNN,从特征图中得到候选窗口。

3:通过SS等方法得到的Region proposalcandidate windows不需要进行crop/wrap了,因为convolution layerPooling layer并没有对图像尺寸大小的约束,而是在FC层有要求,因此论文在FC层之前在最后的卷积层之后pool5层采用SSP,替代常规的Pooling,这也是其核心之处。

具体做法:将得到的region proposal,进行SSP算法,通过pyramid -level n*n bins,一般取(1*1,2*2,3*3,4*4,6*6),bin代表分割后的小方格,看下图:

 

上图采用的比例是(1*12*24*4),level=3的金字塔。到FC层时feature vector长度为(16+1+4*256

-------------------------------------------------------------------------------------------------------------------------------------------

SPPNet的做法是:

(1)首先通过selective search产生一系列的region proposal。

(2)然后训练多尺寸识别网络用以提取区域特征,其中处理方法是每个尺寸的最短边大小在尺寸集合中:

    训练的时候通过上面提到的多尺寸训练方法,也就是在每个epoch中首先训练一个尺寸产生一个model,然后加载这个model并训练第二个尺寸,直到训练完所有的尺寸。空间金字塔池化使用的尺度为:1*1,2*2,3*3,6*6,一共是50个bins。

(3)在测试时,每个region proposal选择能使其包含的像素个数最接近224*224的尺寸,提取相应特征。

    由于我们的空间金字塔池化可以接受任意大小的输入,因此对于每个region proposal将其映射到feature map上,然后仅对这一块feature map进行空间金字塔池化就可以得到固定维度的特征用以训练CNN了。

(4)训练SVM,BoundingBox回归

这部分和RCNN完全一致,

 

SPPNet理论上可以改进任何CNN网络,通过空间金字塔池化,使得CNN的特征不再是单一尺度的。但是SPPNet更适用于处理目标检测问题,首先是网络可以介绍任意大小的输入,也就是说能够很方便地多尺寸训练。其次是空间金字塔池化能够对于任意大小的输入产生固定的输出,这样使得一幅图片的多个region proposal提取一次特征成为可能。

3.有哪些创新点?

是一种基于深度学习的多尺度目标检测。

4.有哪些需要展开讲的地方?

1.什么是空间金子塔池化?—以两层网络为例。

我们假设一个很简单两层网络:

输入层:一张任意大小的图片,假设其大小为(w,h)。

输出层:21个神经元。

也就是我们输入一张任意大小的特征图的时候,我们希望提取出21个特征。

空间金字塔特征提取的过程如下:

图片尺度划分

如上图所示,当我们输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分。上面示意图中,利用了三种不同大小的刻度,对一张输入的图片进行了划分,最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。

第一张图片,我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);

第二张图片,划分了4个块,每个块的大小就是(w/2,h/2);

第三张图片,把一整张图片作为了一个块,也就是块的大小为(w,h)

空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征。

当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小。这样的话得到的可能是26个特征,36个特征;这取决于你的设计。

   上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:windows size了。如果你希望,金字塔的某一层输出n*n个特征,那么你就要用windows size大小为:(w/n,h/n)进行池化了。

2.本文是怎么在多层的网络中做到空间金字塔池化?

       当我们有很多层网络+网络输入的是一张任意大小的图片时候,我们一直进行卷积、池化。直到网络的倒数几层的时候=我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的在R-CNN的基础上进行的具体该径,也是空间金字塔的具体使用(多尺度特征提取出固定大小的特征向量)。具体的流程图如下:

3.怎么找到原始图像中的region poposal在特征图中对应的位置?

     我们知道候选框是通过一整张原图片进行检测得到的,feature maps是经过原始图片卷积、下采样等一系列操作后得到的,所以feature maps的大小和原始图片的大小是不同的。那么我们要如何在feature maps中找到原始图片中候选框在特征图中的对应的区域呢?我们在论文《APPENDIX A:Mapping a Window to Feature Maps》中根据作者给出的公式就可进行计算。

     假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系:

(x,y)=(S*x’,S*y’)

      其中S的就是CNN中所有的strides的乘积。比如paper所用的ZF-5:

S=2*2*2*2=16

而对于Overfeat-5/7就是S=12,这个可以看一下下面的表格:

 

需要注意的是Strides包含了池化、卷积的stride。自己计算一下Overfeat-5/7(前5层)是不是等于12。

反过来,我们希望通过原始图片中的(x,y)坐标求解特征图中的点(x’,y’),那么计算公式如下:

 

因此我们输入原图片检测到的windows,可以得到每个矩形候选框的四个角点,然后我们再根据公式:

Left、Top:

 

Right、Bottom:

 

参考文献: https://blog.csdn.net/hjimce/article/details/50187655

5.SSP的优点?

6.SSP的存在什么问题?

    和RCNN一样,SPP也需要训练CNN提取特征,然后训练SVM分类这些特征。需要巨大的存储空间,并且分开训练也很复杂。而且selective search的方法提取特征是在CPU上进行的,相对于GPU来说还是比较慢的。

7.其他的技术细节?

1.SSP充分利用了卷积的什么特征?

本文抓住了卷积操作对图片的大小没有要求这一特点。因为卷积对图片的大小没有要求,因此任何图片都可以卷积,所以输入的图片可以是任意大小的。

卷积特征其实保存了空间位置信息(数学推理中更容易发现这点),并且每一个卷积核负责提取不同的特征。

2.SSP充分利用了池化操作的什么特点?

池化对图片的大小没有要求,任意大小的图片都可以进行池化的特点。

3.本文利用了全连接层的哪个特点?

在全连接层使用了一个矩阵W,经过训练之后,这个权值矩阵W的大小就固定起来了。所以,全连接层限制了输入的图片的大小。所以,可以在卷积层和全连接层之间增加一个模块,解决这个问题。本文中是在这个地方添加了一个金字塔池化层。

4.特征金子塔思想在深度学习的多尺度目标检测中的应用形式有哪几种?

=>第一种形式:简单的全卷积网络+依次将原图按照比例缩放,然后作为网络的输入。

    缺点:需要多次resize,繁琐耗时。

=>第二种形式:高深的全卷积网络+输入任意尺寸的原图,得到一个特征图,在特征图上进行多个尺度的目标位置回归。比如R-CNN。

   缺点:容易漏掉小的目标+同时搞定多个尺度的难度大。

=>第三种形式:是对第二种方式进行改进。在不同分辨率的特征图上进行目标位置的预测。

    缺点:底部的特征图的表达能力不足。

=>第四种形式:是第二种和第三种方法的组合。在不同分辨率的特征图上检测对应尺度的目标。

    优点:既能够检测不同尺度的特征图中的目标,又能充分利用特征图的表达能力。

因为当前的特征层是根据前面一层的特征层进行组合得到的,是更高级的特征融合。

5.为什么使用金字塔图像?

图像金字塔的作用在于解决目标检测中的尺度问题,在比较早的时候,是通过改变滑动窗口的形式来检测图像中大小不一的物体,而目前阶段,更多的是采用滑动窗口规格不变,改变图片大小来检测图像中尺度不一致的物体。

6.金字塔图像的一些使用的规律。

(1)金字塔的层级越多,计算量更大,花费的时间会更多

7.如何改变特征图的大小?

虽然我们不再限制网络输入的图像的尺度(大小)。但是实现图像金子塔的任务还没有完成,就是我们说的改变图像的尺寸。我们现在的情况是:网络的结构固定了,特征图的个数不会再改变,输入不再改变,但是我们可以去改变特征图的大小。一种简单的方式就是在pooling的时候根据不同的图像大小决定stride,从而控制输出大小。

参考文献:http://x-algo.cn/index.php/2017/01/13/1587/

8.RCNN和SSP-net的比较?

=>首先是输入不需要放缩到指定大小。其次是增加了一个空间金字塔池化层,还有最重要的一点是每幅图片只需要提取一次特征。

=>在R-CNN中,由于每个候选区域大小是不同,所以需要先resize成固定大小才能送入CNN网络,SPP-net正好可以解决这个问题。

=>R-CNN每次都要挨个使用CNN模型计算各个候选区域的特征,这是极其费时的,不如直接将整张图片送入CNN网络,然后抽取候选区域的对应的特征区域,采用SPP层,这样可以大大减少计算量,并提升速度。

=>一个正常的深度网络由两部分组成,卷积部分和全连接部分,要求输入图像需要固定size的原因并不是卷积部分而是全连接部分。所以SPP层就作用在最后一层卷积之后,SPP层的输出就是固定大小。

=>SPP-net不仅允许测试的时候输入不同大小的图片,训练的时候也允许输入不同大小的图片,通过不同尺度的图片同时可以防止overfit。

=>相比于R-CNN提取2000个proposal,SPP-net只需要将整个图扔进去获取特征,这样操作速度提升了100倍左右。

基于SPP层的R-CNN模型在准确度上提升不是很大,但是速度却比原始R-CNN模型快24-102倍。这也正是接下来Fast R-CNN所改进的方向。

=>与经典的R-CNN相比,在目标检测方面,SPP-Net主要解决了几个存在的问题:

1:不需要对每一个Regioncandidatewindow)进行单独训练

2:不需要重复训练CNN网络多次

3:解决了corp/wrap过程中造成的图像失真或者剪切不完全的问题


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值