SPPnet

空间金字塔层池化网络(Spatial pyramid pooling networks,SSPnets)可以通过计算共享来加速R-CNN,SSPnet是先对整张图片做卷积,由于卷积池化之后得到的特征图与原图片的特征位置是相对应的,所以直接在特征图上截取候选框,然后再使用做不同尺寸的最大池化将得到的特征向量拼接得到最终的特征向量。

SSPnet是基于R-CNN结构进行改进,且仅在候选区域特征提取以及特征向量大小转化两个方面做出改进,相比于R-CNN测试速度加速了10-100倍,训练时间较少了3倍。

算法流程

  • 区域提取region proposal

用 selective search 从原图像中生成  2k 个左右的候选框。

  • 区域大小缩放
  • 特征提取

 SPP-Net 网络结构提取特征,SPP 层在 conv 与 全连接层 之间

  • 分类与回归

类似 R-CNN,利用 SVM 基于上面的特征训练分类模型,用边框回归来微调 bounding boxes 的位置。

SSP允许网络的输入图片为任意尺寸

SPPnet_第1张图片

        一般卷积神经网络基础结构为卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。在设计网络时,由于输入fc层的维数必须提前固定,因此往前推使得第一层conv层输入也必须固定尺寸,所以这就要求我们在输入图片前,需要将图片进行一系列预处理操作包括裁剪(crop)、拉伸(wrap)等操作使其变换为要求尺寸再输入网络中。而这些操作在一定程度上会导致图片信息的丢失或变形,从而对网络性能产生一定的影响。因此,SPPnet提出的改进方法是在最后一层卷积层后全连接层前,用空间金字塔池化层(Spatial Pyramid Pooling)来代替原有的普通池化层。

 特征映射

        R-CNN中候选框的特征是直接对每个候选框进行卷积池化操作得到的,那既然SPP-Net不对候选区域进行卷积池化操作,那么特征如何得到?这里SPP-Net用了一种巧妙的方法,通过映射的方法来获取了每个候选框的特征。首先,通过可视化卷积层发现,输入图片某一个位置的特征,反应在特征图上也是相应的位置。

        由于存在这样的映射关系,所以我们就将SS算法选取的候选区域的位置记录下来,通过卷积池化层的比例映射到特征图上,提取出候选区域的特征图,然后输入到金字塔池化层中,进而训练网络。SPP-Net通过如此特征映射的手段进行了,快速特征提取,而不必向R-CNN那样,需要对每个候选区域进行卷积池化特征提取。候选框区域的特征通过特征映射的方法进行获得,但是候选框大小不一,所以得到的特征图也是不同尺寸的,那么不同尺寸的特征图怎样输入到全连接层呢?这时就需要用到金字塔池化。

空间金字塔池化(Spatial Pyramid Pooling)实现原理

SPPnet_第2张图片

        如图,对于卷积操作之后的特征图,我们根据selective search各个候选框区域的映射,通过不同大小的块(池化框)来提取特征,分为是4×4,2×2,1×1,将这三张网格放到特征图的候选区域上,就可以得到16+4+1=21种不同的块(Spatial Bins),我们从这21个块中,每个块提取出一个特征(提取方式有平均池化、最大池化等),这样就得到了固定的21维特征向量。以不同的大小格子的组合方式来池化的过程就是空间金字塔池化。这么一来,我们只要设计m个n * n大小的网格就可以生成任意维数的特征向量,而不需要在意经过多层卷积操作后的特征图的大小是多少,这也意味着我们不需要在意网络输入的图片尺寸。

与R-CNN区别

        主要体现在特征提取阶段。SPP的具体操作是把整张待检测的图片输入到CNN中,进行一次性特征提取,得到特征图,然后在特征图中找到各个候选框的区域,再对各个候选框采用空间金字塔池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框proposal,然后再进入CNN进行特征向量的提取,因为SPP只需要一次性对整张图片进行特征提取,速度会大大提升。

你可能感兴趣的:(深度学习,深度学习,pytorch,神经网络)