SPPNet 论文解读、学习笔记

简介

论文:Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition

深度卷积网络视觉识别中的空间金字塔池化

摘要:

SPPNet出现的原因:cnn需要固定大小(例如,224×224)的输入图像。这种要求是“人为的”,可能会降低任意大小/比例的图像或子图像的识别精度。

在ImageNet 2012数据集上,我们证明了SPP-net提高了各种CNN架构的准确性,尽管它们的设计不同。在Pascal VOC 2007和Caltech101数据集上,SPP-net使用单一的全图像表示和没有微调实现了最先进的分类结果。

作用效果:使用SPP-net,我们只从整个图像中计算一次特征映射,然后将特征集中在任意区域(子图像)中,以生成固定长度的表示来训练检测器。该方法避免了卷积特征的重复计算。在处理测试图像时,我们的方法比R-CNN方法快24-102倍

详解

RCNN模型中CNN存在的问题

其中RCNN使用cnn的训练和测试中存在一个技术问题:流行的cnn需要一个固定的输入图像大小(例如224×224),这限制了输入图像的纵横比和规模。

当应用于任意大小的图像时,目前的方法大多是通过裁剪或通过扭曲将输入图像拟合为固定大小,如图上所示。但裁剪区域可能不包含整个对象,而扭曲的内容可能导致不必要的几何失真。由于内容丢失或失真,识别精度可能会受到影响。

上面这个图可以看出SPPnet和RCNN的区别,首先是输入不需要放缩到指定大小。其次是增加了一个空间金字塔池化层,还有最重要的一点是每幅图片只需要提取一次特征。

  • 为什么cnn需要固定的输入大小呢?

CNN主要由两部分组成:卷积层和其后的全连接层。

卷积层以滑动窗口的方式操作,并输出代表激活的空间排列的特征映射。事实上,卷积层不需要固定的图像大小,可以生成任何大小的特征映射。

全连接层需要根据它们的定义有固定的大小/长度输入。因此,固定大小的限制只来自于全连接层,它们存在于网络的更深阶段,全连接层部分的参数是神经元对于所有输入的连接权重,也就是说输入尺寸不固定的话,全连接层参数的个数都不能固定。

  • 怎么解决?

何凯明团队的SPPNet给出的解决方案是,既然只有全连接层需要固定的输入,那么我们在全连接层前加入一个网络层,让他对任意的输入产生固定的输出不就好了吗?换句话说,我们在网络层次结构的更深阶段(在卷积层和全连接层之间)执行一些信息“聚合”,以避免在一开始就需要裁剪或扭曲。

网络细节

卷积层和特征映射

SPPNet通过可视化Conv5层特征,发现卷积特征其实保存了空间位置信息(数学推理中更容易发现这点),并且每一个卷积核负责提取不同的特征,比如C图175、55卷积核的特征,其中175负责提取窗口特征,55负责提取圆形的类似于车轮的特征。第66个滤波器由∧型最活跃;第118个滤波器由一个∨形激活最多。我们可以通过传统的方法聚集这些特征,例如词袋模型或是空间金字塔的方法。

空间金字塔池化层

难点:

  • 如何从一个region proposal 映射到feature map的位置(见下面)

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

分析:

问题二涉及的流程主要有: 图像输入->卷积层1->池化1->...->卷积层n->池化n->全连接层。

引发问题的原因主要有:全连接层的输入维度是固定死的,导致池化n的输出必须与之匹配,继而导致图像输入的尺寸必须固定。

不就是为了使一些列卷积层的最后输出刚维度好是全连接层的输入维度吗?

解决办法可能有:

  • 想办法让不同尺寸的图像也可以使 池化n 产生固定的 输出维度。(打破图像输入的固定性)

  • 想办法让全连接层(罪魁祸首)可以接受非固定的输入维度。(打破全连接层的固定性,继而 也打破了图像输入的固定性)

以上的方法1就是SPPnet的思想。它在池化n 的地方做了一些手脚 (特殊池化手段:空间金字塔池化),使得 不同尺寸的图像也可以使 池化n 产生固定的 输出维度。

所谓空间金字塔池化就是沿着 金字塔的低端向顶端 一层一层做池化。

上图的空间金字塔池化层是SPPNet的核心,

假设原图输入是224x224,对于conv5出来后的输出是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的reponse map。如果像上图那样将reponse map分成1x1(金字塔底座),2x2(金字塔中间),4x4(金字塔顶座)三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何 池化n 的输出永远是 (16+4+1)x256 维度。

实际运用中只需要根据全连接层的输入维度要求设计好空间金字塔即可。

整幅图像做一次卷积

将conv5的pool层改为SPP之后就不必把每一个都ROI抠出来送给CNN做繁琐的卷积了,整张图像做卷积一次提取所有特征再交给SPP即可。

R-CNN重复使用深层卷积网络在~2k个窗口上提取特征,特征提取非常耗时。SPPNet将比较耗时的卷积计算对整幅图像只进行一次,之后使用SPP将窗口特征图池化为一个固定长度的特征表示。

如何从一个region proposal 映射到feature map的位置?

SPPNet通过角点尽量将图像像素映射到feature map感受野的中央,假设每一层的padding都是p/2,p为卷积核大小。对于feature map的一个像素(x',y'),其实际感受野为:(Sx‘,Sy’),其中S为之前所有层步伐的乘积。然后对于region proposal的位置,我们获取左上右下两个点对应的feature map的位置,然后取特征就好了。

左上角映射为:

右下角映射为:

当然,如果padding大小不一致,那么就需要计算相应的偏移值啦。

存在的不足

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

参考:

SPPNet-引入空间金字塔池化改进RCNN - 知乎 (zhihu.com)

目标检测(3)-SPPNet - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/weixin_45897172/article/details/129627235