CVPR2020:语义分割Strip Pooling条形池化: Rethinking Spatial Pooling for Scene Parsing

本文介绍了一种名为条形池化的新技术,用于改进语义分割任务中的长条形目标识别,特别是在自动驾驶场景中。通过引入条纹池化模块,解决了传统方法在处理此类目标时的感受野限制,提高了分割精度。文章详细阐述了SPNet网络结构,展示了其在ADE20K和CityScapes数据集上的优越表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
论文链接:https://arxiv.org/abs/2003.13328v1
代码链接:https://github.com/Andrew-Qibin/SPNet

一、背景及相关知识

场景解析,也就是语义分割任务,近年来,在众多领域如无人驾驶、医疗图像分析、图像及视频编辑等计算机视觉任务中具有很重要的应用。近年来,语义分割的方法主要是基于FCN的方法,这系列方法在捕获高层语义信息方面已经取得了很多的成果,但是,这些方法仍有一些缺陷,这些方法主要是堆砌了一些局部的卷积和池化操作,因此,感受野是有局限性的,对于复杂场景的解析仍有不足。
目前,针对增大感受野的问题,主要有以下几种方法:

  • 一是利用self-attention来建模长距离的依赖关系,但是这种方法需要耗费较大的内存来进行复杂的矩阵运算;
  • 二是利用dilated convolution 也就是空洞卷积,这种方法在不增加额外的参数的前提下可以增加感受野;
  • 三是利用全局池化或是金字塔池化来增加全局线索。
    但这些方法的局限在于主要应用在输入特征图上是正方形的条件下,对于很多长条形的目标效果并不是很好。

因此本文主要是提出了条形池化的方法,这样就可以覆盖到更多的复杂场景中,提高分割的效果。
在这里插入图片描述
如上图所示,从上往下分别表示:

  • 条形池化的示意图
  • 传统空间池化的示意图
  • ground truth即标注的真值标签
  • 仅使用传统空间池化的方法得到的分割结果
  • 使用本文的条形池化得到额分割结果
    例如,在上图中,目标对象可能具有长条形结构(如图b中的草地)或离散分布(如图a中的柱子)。使用大的方形池化窗口不能很好地解决这个问题,因为它将不可避免地带入一些来自无关区域的污染信息。

二、本文的主要贡献及主要方法

本文的主要贡献有以下几点:

  • 引入了一个新的条纹池化(strip pooling)模块,使backbone网络能够有效利用长距离依赖关系;
  • 基于条纹池化设计了Strip Pooling Module及Mixed Pooling Module,两种新颖的设计都是轻量级的,并且可以在现有场景解析网络中用作有效的即插即用模块;
  • 基于上述两个模块构建了SPNet,在目前的分割数据集上取得了很好的效果;
  • 在ADE20K和CityScapes上进行的大量实验表明,本文的方法达到了SOTA。

以下介绍具体的实现过程:
在这里插入图片描述
上图所示即为本文提出的Strip Pooling Module (SPM) 模块,具体的实现过程如下:

  • 输入一个特征图,这里实际上为C×H×W,为了方便图中只画了一个通道;
  • 输入的特征图经过水平和竖直条纹池化后变为H×1和1×W,使用求平均的方法,对池化核内的元素值求平均,并以该值作为池化输出值;
  • 随后经过卷积对两个输出feature map分别沿着左右和上下进行扩充,扩充后两个特征图尺寸相同,对扩充后的特征图对应相同位置进行逐像素求和得到H×W的特征图;
  • 最后通过1×1的卷积与sigmoid处理后与原输入图对应像素相乘得到了最终的输出结果;
    在这里插入图片描述
    在条形池化的基础上,作者同时提出了一个混合池化模块,MPM(Mixed Pooling Module),如上图所示,因为如果将网络中的所有pooling操作全部换成strip pooling操作,则会导致原来的非长条物体的效果变差。因此,作者将strip pooling和pyramid pooling都加入进来,构造成mixed pooling module即混合模块,兼顾长条形和非长条形物体的效果。
    本文提出的MPM由两个子模块组成,它们同时捕获不同位置之间的短距离和长距离依赖关系:
  • 对于长距离依赖关系,与先前使用全局平均池化层的工作不同,文中通过同时使用水平和垂直条纹池化操作来捕获上下文信息。如图(b)所示。;
  • 但是,捕获局部上下文信息也需要进行空间池化。如图(a)所示,文中采用了轻量级金字塔池子模块来进行短距离依赖关系的实现。

论文基于混合池化模块搭建了一个网络:SPNet。采用经典的残差网络作为backbone,特征图大小设置为输入图像的1/8。将SPM添加到每个阶段中最后一个构建块的3×3卷积层和最后一个阶段中的所有构建块之后。整体的网络结构如下图所示:
在这里插入图片描述

三、代码分析

代码的运行即可按照作者所写来进行,首先要将相应的pytorch环境及所需的加速库安装成功,在这里插入图片描述
这个是混合池化模块的代码实现过程
在这里插入图片描述
条形池化利用了pytorch中自带的AdaptiveAvgPool2d实现strip pooling
在这里插入图片描述
我用自己的分割数据集使用该代码进行实验时,实际得到的分割效果并不好,我的数据集中主要是线条较细的车道线,对于数据中的非水平竖直的车道线效果较差,具体的原因还需要再进行实验验证。

四、实验

作者首先进行了多个消融实验:
1. 在以FCN为Base时,相比传统的金字塔池化(PPM),在增加更少的参数前提下,精度提升更多;在使用两个MPM时,精度提升更多;在额外增加SPM模块时,达到最佳的水平。

在这里插入图片描述
2.分别验证SRD和LRD对精度的提升,增加LRD对精度提升更多,也就是表示增加本文提出的SPM对精度的提升。

在这里插入图片描述
3.验证SPM处于网络结构中的哪个位置更有效;L:每个stage的最后一个block;A:最后一个stage的所有block

在这里插入图片描述
作者在多个分割数据集中进行了实验对比,论文在ADE20K、Cityscapes和Pascal Context数据集上进行了实验,达到了很好的效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结

整体来说,这篇文章提出了一个很简单但又很有效的思路,对于在自动驾驶中进行车道线等目标的分割应用会有很大的帮助。

### 实现带有SP条带池化的DeepLabV3+ #### DeepLabV3+简介 DeepLabV3+是一种用于语义分割的强大网络架构,通过引入ASPP模块和解码器来提升特征表示能力。为了进一步提高模型捕捉长距离依赖的能力,在DeepLabV3+中加入SP条带池化Strip Pooling Module, SPM),可以显著改善场景解析的效果[^1]。 #### SP条带池化的工作原理 SP条带池化主要由以下几个部分组成: - **水平与垂直条纹池化**:对输入特征图分别执行水平方向和垂直方向的一维最大池化操作,从而获得两个不同视角下的上下文信息。 - **一维卷积扩展**:利用大小为\(3 \times 3\)的一维卷积核将上述两种池化结果恢复至原始尺寸,以便后续处理。 - **特征融合**:将经过扩展后的特征映射进行加权求和,形成新的综合特征表达形式。 - **激活函数应用**:最后施加一个\(1 \times 1\)的卷积层以及Sigmoid激活单元,使得输出能够作为门控机制作用于初始输入之上[^3]。 #### 结合SPM改进的DeepLabV3+结构设计 在标准版DeepLabV3+的基础上增加SP条带池化组件的具体方法如下: ```python import torch.nn as nn class StripPooling(nn.Module): def __init__(channels=256): super(StripPooling).__init__() self.h_pool = nn.MaxPool2d(kernel_size=(8, 1), stride=1, padding=(4, 0)) self.v_pool = nn.MaxPool2d(kernel_size=(1, 8), stride=1, padding=(0, 4)) self.conv_h = nn.Conv2d(channels, channels, kernel_size=(3, 1), padding_mode='replicate', bias=False) self.conv_v = nn.Conv2d(channels, channels, kernel_size=(1, 3), padding_mode='replicate', bias=False) self.fusion_conv = nn.Sequential( nn.Conv2d(in_channels=channels * 2, out_channels=channels, kernel_size=1), nn.BatchNorm2d(num_features=channels), nn.ReLU(inplace=True) ) self.gate = nn.Sequential( nn.Conv2d(in_channels=channels, out_channels=channels, kernel_size=1), nn.Sigmoid() ) def forward(x): h_pooled = self.conv_h(self.h_pool(x)) # Horizontal strip pooling followed by convolution v_pooled = self.conv_v(self.v_pool(x)) # Vertical strip pooling followed by convolution pooled_feature = torch.cat([h_pooled, v_pooled], dim=1) # Concatenate horizontally & vertically pooled features fused_output = self.fusion_conv(pooled_feature) # Fuse concatenated feature maps via convolutions gate_signal = self.gate(fused_output) # Generate gating signal using sigmoid activation function enhanced_x = x * gate_signal # Apply gated multiplication on original input tensor return enhanced_x # Return the final output after applying SP module ``` 此代码片段定义了一个名为`StripPooling`的新类,该类实现了基于给定描述中的SP条带池化逻辑,并将其应用于传入张量上以生成增强型输出。接着可以在构建DeepLabV3+实例时简单替换原有的空间金字塔池化(SPP)或全局平均池化(GAP),以此融入更先进的上下文聚合策略。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值