目标检测(二)——SPPNet

简介

SPPNet是出自2015发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》,这篇论文解决之前深度神经网络的一个大难题,即输入数据的维度一定要固定。在ILSVRC2014,SPPNet取得目标检测第二,图像分类第三的成绩。


原理

SPPNet提出了SPP层,主要改进了以下两个方面:

  • 减少卷积运算(相比R-CNN减少几十~几百倍的时间)
  • 防止图片内容变形(如下图所示crop会减少图像信息,warp会使图像失真)
    目标检测(二)——SPPNet_第1张图片

目标检测(二)——SPPNet_第2张图片
上图第一行代表R-CNN的检测过程,第二行是SPPNet的。输入进R-CNN卷积层的图像必须固定大小,因此要进过crop/warp,这会使原图片变形。
而SPPNet直接将原图片输入CNN中,获其特征,使得原图片内容得以保真。

R-CNN模型 SPPNet模型
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2、固定大小的图像塞给CNN 传给后面的层做训练回归分类操作 1、SPPNet把全图塞给CNN得到全图的feature map 2、让候选区域与feature map直接映射,得到候选区域的映射特征向量 3、映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层

映射

原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量。

映射过程图参考如下:
目标检测(二)——SPPNet_第3张图片
整个映射过程有具体的公式,如下

假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关系与网络结构有关(原论文还做了 padding=kernel-size/2 的 Pad 操作):(x,y)=(S∗x′,S∗y′),即

  • 左上角的点:x’=[x/S]+1
  • 右下角的点:x’=[x/S]-1

其中 SS 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16

spatial pyramid pooling (空间金字塔变换层)

通过spatial pyramid pooling 将任意大小的特征图转换成固定大小的特征向量

示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。

接着在这个特征图中找到每一个候选区域映射的区域,spp层会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:
目标检测(二)——SPPNet_第4张图片

全图像表征

因为SPPNet可以适用于任意尺寸的图像,所以论文还提到了全图像表征的重要性:

  1. 多视角组合+两个全图像视角(水平翻转)提升了0.2%的正确率。
  2. 全图像视角与传统方法全图像的编码SIFT向量在方法论上是一致的。
  3. 在图像检索应用中,一个图像表征比起分类分数是更被相似性评估需要的。

为什么不fine-tune卷积层

原因之一可能是因为SPPNet训练fine-tune卷积层太麻烦了,因为fine-tune的样本是来自所有Rol打散后均匀采样的,即Rol-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储,过程变得expensive(因为这样的话,每个batch都得重新计算feature map)。而Fast R-CNN采用分层采样思想,先采样出 N 张图像(image-centric sampling),在这 N 张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。

你可能感兴趣的:(目标检测,目标检测,人工智能,计算机视觉,SPPNet)