spp-net是目标检测较早的一篇论文,它的存在使得目标检测能够更加顺畅快速的发展。这个网络主要是与R-CNN做对比,其精髓亮点有两处:
1.它解决了深度卷积神经网络(CNNs)的输入必须要求固定图像尺寸(例如224*224)的限制。
2.在目标检测领域它提高了提取特征的效率,速度相比R-CNN提升24-102倍。
spp-net如何解决输入固定图像尺寸的限制
一.空间金字塔池化(Spatial Pyramid Pooling)实现原理
黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4×4,2×2,1×1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。
从整体过程来看,就是如下图所示:
输出向量大小为Mk,M=#bins, k=#filters,作为全连接层的输入。
例如上图,所以Conv5计算出的feature map也是任意大小的,现在经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出(16+4+1)*256的特征。
二.SPP-Net是如何调整网络结构的?
深度卷积神经网络的基础结构分为:卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如224 * 224(ImageNet)、32 * 32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。
对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。
总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。
spp-net如何提高特征计算的速度
一.R-CNN特征计算为何低效
首先大家要知道此阶段提高特征计算的速度都是与R-CNN相比较而进行的。利用R-CNN进行目标检测,虽然在VOC和ImageNet上都表现了出色的检测精度,但是R-CNN提取特征的计算非常耗时,主要因为在对每张图片中的多达2000个的候选区域的像素反复调用CNN进行提取特征。其中的候选区域存在大量重叠的部分,这种设计明显造成了大量的计算浪费。
对于R-CNN,整个过程是:
1.首先通过选择性搜索,对待检测的图片进行搜索出~2000个候选窗口。
2.把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,也就是说利用CNN对每个proposal进行提取特征向量。
3.把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。
可以看出R-CNN的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。
二.sppnet如何提高特征计算速度
SPPnet的做法是首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。然后把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中通过映射关系找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。
对于SPP-Net,整个过程是:
1.首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
2. 特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。
3.最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。
三.如何在特征图上找到原图上对应的候选区域
论文中给出一个公式:
假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: (x,y)=(Sx’,Sy’)
反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:
S就是CNN中所有的strides的乘积,包含了池化、卷积的stride
论文原文:
https://arxiv.org/pdf/1406.4729.pdf
参考文章:
https://www.jianshu.com/p/90f9d41c6436
https://blog.csdn.net/v1_vivian/article/details/73275259