目标检测(四)——SPP-Net

针对卷积神经网络重复运算问题,SPP-Net通过加入空间金字塔池化结构,有效避免了图像剪裁和缩放导致的问题,并显著提高了特征提取速度。相比R-CNN,SPP-Net仅需一次特征提取即可完成所有候选区域的特征获取。

arxiv: http://arxiv.org/abs/1406.4729
github: https://github.com/ShaoqingRen/SPP_net
这里写图片描述
  针对卷积神经网络重复运算问题,2015年微软研究院的何恺明等提出一种SPP-Net算法,通过在卷积层和全连接层之间加入空间金字塔池化结构(Spatial Pyramid Pooling)代替R-CNN算法在输入卷积神经网络前对各个候选区域进行剪裁、缩放操作使其图像子块尺寸一致的做法。利用空间金字塔池化结构有效避免了R-CNN算法对图像区域剪裁、缩放操作导致的图像物体剪裁不全以及形状扭曲等问题,更重要的是解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。但是和R-CNN算法一样训练数据的图像尺寸大小不一致,导致候选框的ROI感受野大,不能利用BP高效更新权重。
算法流程:

  1. 首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
  2. 特征提取阶段。这一步就是和R-CNN最大的区别了,同样是用卷积神经网络进行特征提取,但是SPP-Net用的是金字塔池化。这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度是大大地快啊。江湖传说可一个提高100倍的速度,因为R-CNN就相当于遍历一个CNN两千次,而SPP-Net只需要遍历1次。
  3. 最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。

创新点:

  • 利用空间金字塔池化结构;
  • 对整张图片只进行了一次特征提取,加快运算速度。

金字塔池化结构
这里写图片描述
  空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:windows size了


一次特征提取
RCNN是多个regions+多次CNN+单个pooling,而SPP则是单个图像+单次CNN+多个region+多个pooling
这里写图片描述
在特征提取上,速度提升了好多,R-CNN是直接从原始图片中提取特征,它在每张原始图片上提取2000个Region Proposal,然后对每一个候选区域框进行一次卷积计算,差不多要重复2000次,而SPP-net则是在卷积原始图像之后的特征图上提取候选区域的特征。所有的卷积计算只进行了一次,效率大大提高。
缺点
  SPP已有一定的速度提升,它在ConvNet的最后一个卷积层才提取proposal,但是依然有不足之处。和R-CNN一样,它的训练要经过多个阶段,特征也要存在磁盘中,另外,SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。

参考

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
基于空间金字塔池化的卷积神经网络物体检测

### SPP-Transformer架构和技术细节 SPP-Transformer是一种融合空间金字塔池化(Spatial Pyramid Pooling, SPP)[^1]与变换器(Transformer)结构的技术,在处理不同尺度的目标检测问题上表现出显著优势。该模型通过引入多尺度特征表示来增强对目标位置和形状的理解。 #### 架构设计 SPP模块被嵌入到编码层之前,用于提取输入图像的不同层次的空间信息。具体来说: - **多级采样**:采用多个固定大小的窗口(如1×1、2×2、4×4),无论原始图片尺寸如何变化都能得到相同数量的输出向量。 - **维度统一**:经过上述操作后的所有特征图会被展平并连接成一个单一的一维向量作为后续网络层的输入[^2]。 对于Transformers部分,则保持标准配置——自注意力机制(Self-Attention Mechanism),使得每一层都能够关注整个序列中的重要元素而不受距离限制;同时利用前馈神经网络(Feed Forward Neural Network)完成局部计算任务。 ```python import torch.nn as nn class SpatialPyramidPooling(nn.Module): def __init__(self, pool_sizes=[1, 2, 4]): super().__init__() self.pool_layers = nn.ModuleList([nn.AdaptiveAvgPool2d(output_size=(size, size)) for size in pool_sizes]) def forward(self, x): pooled_outputs = [] for layer in self.pool_layers: y = layer(x) pooled_outputs.append(y.view(y.size(0), -1)) return torch.cat(pooled_outputs, dim=1) # Example usage within a model definition spp_layer = SpatialPyramidPooling() transformer_encoder = ... # Define your transformer encoder here model = nn.Sequential(spp_layer, transformer_encoder) ``` 这种组合方式不仅提高了模型对复杂场景下物体识别的能力,而且由于减少了卷积核参数的数量而降低了计算成本,从而实现了更高效的实时性能表现[^3]。 #### 应用场景 SPP-Transformer特别适用于那些需要快速响应以及高精度定位的小型设备上的应用开发工作,比如无人机监控系统、移动机器人导航避障等领域。此外,在生态监测相机数据集这样的特定领域内也展现了良好的适应性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值