【目标检测】SPPnet论文详解

原文:https://www.jianshu.com/p/90f9d41c6436

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

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

深度卷积神经网络的基础结构分为:卷积层(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)模型的拓展,该模型在计算机视觉领域已经是非常成功的方法了,它将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。

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

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

利用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’),那么计算公式如下:

 

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

五.小结

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

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

参考文章:
https://blog.youkuaiyun.com/v1_vivian/article/details/73275259



作者:不可能打工
链接:https://www.jianshu.com/p/90f9d41c6436
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

### SPPNet 的相关资料汇总 SPPNet 是一种基于深度卷积神经网络的目标检测方法,其核心在于引入了空间金字塔池化层(Spatial Pyramid Pooling Layer),从而解决了传统 CNN 对输入尺寸固定的要求,并显著提高了目标检测的速度和效果。 #### 关于 SPPNet 的详细介绍 - **论文原文**: 可通过以下链接访问 SPPNet 的原始论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》[^2]。该论文详细介绍了 SPP 层的设计原理及其在视觉别中的应用。 - 链接: [https://arxiv.org/abs/1406.4729](https://arxiv.org/abs/1406.4729) - **技术解析**: 博客文章提供了对 SPPNet 的全面解读,涵盖了算法的核心概念、架构设计以及实际应用场景。具体内容包括但不限于以下几个方面: - **关键问题分析**: 解决了传统 CNN 输入尺寸固定的局限性,使得模型可以处理任意大小的输入图像[^1]。 - **SPP 层机制**: 描述了如何利用多尺度的空间金字塔结构来提取不同分辨率下的特征表示[^3]。 - **性能对比**: 将 SPPNet 与 R-CNN 进行比较,展示了前者在计算效率上的优势——仅需一次卷积操作即可完成所有候选区域的特征提取。 #### 推荐阅读材料 以下是几篇值得深入学习的文章或教程: 1. **SPPNet 论文解析**: 提供了详细的理论推导和技术实现细节。 2. **SPPNet 架构详解及案例应用**: 结合具体实例说明 SPPNet 如何应用于目标检测任务中。 3. **SPPnet 总结**: 归纳整理了 SPPNet 的主要贡献点及其与其他同类方法的区别。 #### 实现代码资源 对于希望动手实践的朋友来说,下面这些开源项目可能会有所帮助: - GitHub 上有许多实现了 SPPNet 的 Python 和 PyTorch 版本代码库,例如 `spp-pytorch` 或者其他类似的仓库。可以通过搜索引擎轻松找到它们并下载源码进行研究。 ```python import torch from torchvision import models class SPP(torch.nn.Module): def __init__(self, levels=[1, 2, 4]): super(SPP, self).__init__() self.levels = levels def forward(self, x): batch_size, c, h, w = x.size() pooled_outputs = [] for level in self.levels: kernel_size = (int(h / level), int(w / level)) stride = kernel_size pool_layer = torch.nn.MaxPool2d(kernel_size=kernel_size, stride=stride) y = pool_layer(x).view(batch_size, -1) pooled_outputs.append(y) return torch.cat(pooled_outputs, dim=-1) ``` 上述代码片段展示了一个简单的 SPP 模块定义方式,在实际部署过程中可以根据需求调整参数设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值