对sppnet网络的理解

 

 

 前言:

   接着上一篇文章提到的RCNN网络物体检测,这个网络成功的引入了CNN卷积网络来进行特征提取,可是存在一个问题,就是对须要进行特征提取图片大小有严格的限制。当时面对这种问题,rg大神采用的是对分割出的2000多个候选区域,进行切割或者缩放形变处理到固定大小,这样虽然知足了CNN对图片大小的要求,确形成图片的信息缺失或者变形,会下降图片识别的正确率. 以下图所示:
     算法

  正文:

  何凯明大神在看到RCNN模型,分析了CNN模型的特色后:由卷积部分和全链接两部分构成,而对于卷积部分而言,好比任意图片大小(w,h),任意的卷积核size(a,b),默认步长为1,咱们都会获得卷积以后的特征图F(w-a+1,h-b+1),因此这部分对图片大小没有要求,有要求的地方在全链接层(以下图),全链接层的神经元设定以后是固定的(如图 Input layer 神经元个数),而每个都对应者一个特征,rg大神在进入CNN前对图片进行warp处理,就是为了卷积以后的特征数,可以和了全链接层的神经元个数相等.网络

    

 

 可是何大神以为,事情还能够更有趣,他提出将特征数据(特征图)进一步处理,而后拼凑成和神经元个数相同的特征数,这样就能够不用warp图片大小也能够得到相同数量的特征,那么他是咋样处理这特征图的呢?优化

    

论文中提到,好比咱们有一张图片为例子:blog

              

咱们对这种图进行卷积处理(咱们以zf为例,最后一个卷积以后获得这样的特征图)图片

    

这张图显示的是一个60*40*256的特征图,到这儿以后,若是要获得固定的神经元个数,论文中提到的是21,咱们就须要将60*40的特征图,咱们暂且称这个特征图为feature A,进行处理,怎么处理呢?it

咱们先贴个图:io

        

如上图所示:ast

    咱们使用三层的金字塔池化层pooling,分别设置图片切分红多少块,论文中设置的分别是(1,4,16),而后按照层次对这个特征图feature A进行分别基础

处理(用代码实现就是for(1,2,3层)),也就是在第一层对这个特征图feature A整个特征图进行池化(池化又分为:最大池化,平均池化,随机池化),论文中使用的是最大池化,map

获得1个特征。

  第二层先将这个特征图feature A切分为4个(20,30)的小的特征图,而后使用对应的大小的池化核对其进行池化获得4个特征,

  第三层先将这个特征图feature A切分为16个(10,15)的小的特征图,而后使用对应大小的池化核对其进行池化获得16个特征.

而后将这1+4+16=21个特征输入到全链接层,进行权重计算. 固然了,这个层数是能够随意设定的,以及这个图片划分也是能够随意的,只要效果好同时最后能组合成咱们须要的特征个数便可

    这就是sppnet的核心思想,固然在这个模型中,何大神还对RCNN进行了优化,上面介绍的金字塔池化代替warp最重要的一个,可是这个也很重要,是什么呢?

何大神以为,若是对ss提供的2000多个候选区域都逐一进行卷积处理,势必会耗费大量的时间,因此他以为,能不能咱们先对一整张图进行卷积获得特征图,而后

再将ss算法提供的2000多个候选区域的位置记录下来,经过比例映射到整张图的feature map上提取出候选区域的特征图B,而后将B送入到金字塔池化层中,进行权重计算.

而后通过尝试,这种方法是可行的,因而在RCNN基础上,进行了这两个优化获得了这个新的网络sppnet.

 值得一提的是,sppnet提出的这种金字塔池化来实现任意图片大小进行CNN处理的这种思路,获得了你们的普遍承认,之后的许多模型,或多或少在这方面都是参考了这种思路,就连

rg大神,在后来提出的fast-rcnn上也是收益于这种思想的启发.

  参考:

  Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

相关文章
相关标签/搜索