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

在这里插入图片描述
论文链接: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数据集上进行了实验,达到了很好的效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结

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

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值