【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)

【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)_第1张图片
image

SPPnet是目标检测领域不可忽略的一篇论文,中国人何恺明大神的作品,阅读起来感觉亲(简)切(单)多了。在我看来,SPPnet主要有两处亮点:1.它解决了深度卷积神经网络(CNNs)的输入必须要求固定图像尺寸(例如224*224)的限制。2.在目标检测领域它提高了提取特征的效率,速度相比R-CNN提升24-102倍。

一.SPPnet让网络的输入图片可以是任意尺寸

【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)_第2张图片
image

深度卷积神经网络的基础结构分为:卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如224 * 224(ImageNet)、32 * 32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。

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

空间金字塔池化并非作者原创,它是一种词袋(Bag of Words,BoW)模型的拓展,该模型在计算机视觉领域已经是非常成功的方法了,它将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。

【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)_第3张图片
image

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

三.R-CNN进行特征计算时的低效

【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)_第4张图片
image

利用R-CNN进行目标检测,虽然在VOC和ImageNet上都表现了出色的检测精度,但是R-CNN提取特征的计算非常耗时,主要因为在对每张图片中的多达2000个的候选区域的像素反复调用CNN进行提取特征。其中的候选区域存在大量重叠的部分,这种设计明显造成了大量的计算浪费。

四.SPPnet如何提高特征计算的速度

SPPnet的做法是首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。然后把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中通过映射关系找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后再进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。

而问题的关键在于特征图(feature maps)的大小是根据图片的大小与卷积层的卷积核大小(kernel size)与步长(stride)决定的,如何在特征图上找到原图上对应的候选区域,即两者之间的映射关系是怎么样的。

论文中给出一个公式:

假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: (x,y)=(Sx’,Sy’)

反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:


【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)_第5张图片
image

S就是CNN中所有的strides的乘积,包含了池化、卷积的stride

五.小结

SPPnet解决了R-CNN的两个缺点,是值得学习阅读的一个网络,但是个人感觉论文写的很臃肿,大量篇幅用来叙述SPPnet的功效与各种测试对比结果,网络很多结构却都是照搬R-CNN,作者并没有进行更深入的优化。这或许也是为什么rbg后来写出了fast r-cnn的原因吧。

论文原文:
https://arxiv.org/pdf/1406.4729.pdf

参考文章:
https://blog.csdn.net/v1_vivian/article/details/73275259

你可能感兴趣的:(【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition))