天天看点

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

DeepLabv3+

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation

原文地址:DeepLabv3+

注意本文的一作 L i a n g − C h i e h C h e n Liang-Chieh Chen Liang−ChiehChen参与了DeepLab系列,MaskLab和MobileNet系列的工作。本文是在DeepLabv3的基础上将多个技术融合到一起,达到新的state-of-the-art。

论文在提出了DeepLabv3+架构。主要以DeepLabv3做encoder架构,decoder采用一个简单却有效的模块。并探索了了改进的Xception和深度分离卷积在模型中的应用,进一步提升模型在语义分割任务上的性能。

Abstract

空间金字塔模块在输入feature上应用多采样率扩张卷积、多接收野卷积或池化,探索多尺度上下文信息。 Encoder-Decoder结构通过逐渐恢复空间信息来捕捉清晰的目标边界。

DeepLabv3+结合了这两者的优点,具体来说,以DeepLabv3为encoder架构,在此基础上添加了简单却有效的decoder模块用于细化分割结果。此外论文进一步探究了以Xception结构为模型主干,并探讨了Depthwise separable convolution在ASPP和decoder模块上的应用,最终得到了更快更强大的encoder-decoder网络。

论文在PASCAL VOC 2012上验证了模型的有效性,在没有添加任何后端处理的情况下达到了89%mIoU.

Introduction

在DeepLabv3+中,使用了两种类型的神经网络,使用空间金字塔模块和encoder-decoder结构做语义分割。

  • 空间金字塔:通过在不同分辨率上以池化操作捕获丰富的上下文信息
  • encoder-decoder架构:逐渐的获得清晰的物体边界

DeepLabv3+结合这两者的优点,在DeepLabv3的基础上拓展了一个简单有效的模块用于恢复边界信息。如下图所示:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion
  • (a): 即DeepLabv3的结构,使用ASPP模块获取多尺度上下文信息,直接上采样得到预测结果
  • (b): encoder-decoder结构,高层特征提供语义,decoder逐步恢复边界信息
  • ©: DeepLabv3+结构,以DeepLabv3为encoder,decoder结构简单

DeepLabv3的top layer输出的feature中有丰富的语义信息,可通过扩张卷积依据计算资源限制控制计算密度,配合一个decoder模块用于逐渐恢复边界信息。

在上述的encoder-decoder架构上,论文受到Xception等工作启发,将深度分离卷积应用到ASPP和decoder模块,用于快速计算并保持模型的强大学习能力。最终得到的模型在没有添加后端处理的情况下,达到了新的state-of-the-art.

论文的主要贡献在于:

  • 论文提出了一个全新的encoder-decoder架构,使用DeepLabv3作为encoder模块,并添加了一个简单却有效的decoder模块
  • 在我们提出的encoder-decoder架构中,可通过扩张卷积直接控制提取encoder特征的分辨率,用于平衡精度和运行时间
  • 论文将Xception结构应用于分割任务中,在ASPP和decoder模块中加入深度分离卷积,获得到强大又快速的模型
  • 模型达到了新的state-of-the-art,同时我们给出了模型设计分析细节和模型变体
  • 以后开源TensorFlow代码(估计得等到2018CVPR或者ECCV完全结束~)

Related Work

近几年基于全卷积神经网络的模型在语义分割任务上表现成功。有几种变体模型提出利用上下文信息包括多尺度输入在内的做分割,也有采用概率图模型细化分割结果。本文主要讨论使用空间金字塔池化和encoder-decoder结构、并讨论了基于Xception为主体的强大特征提取层,和基于深度分离卷积快速计算。

**空间金字塔池化:**如PSPNet使用多个不同gird的池化,DeepLab的ASPP模块平行的使用不同扩张率的扩张卷积,执行空间金字塔合并获取多尺度信息。在多个benchmark获得不错的结果。

Encoder-Decoder: encoder-decoder结构在多个计算机视觉任务上获得成功,例如人类姿态估计、目标检测和语义分割。通常,encoder-decoder网络包含:

  • encoder模块逐步减少feature map分辨率,捕获高级语义信息
  • decoder模块逐渐恢复空间信息

在这领域上基础上,我们使用DeepLabv3作为encoder模块,并增加一个简单又有效的的decoder模块获取空间信息。

深度分离卷积: 深度分离卷积和组卷积能够减少计算消耗和参数量的同时维持相似的表现。深度分离卷积已应用在多个神经网络中,特别的,我们探索了Xception架构,在语义分割任务上展现了精度和速度上的双重提升。

Methods

本节简单回顾DeepLabv3架构,提出改进后的Xception模型,介绍扩张卷积和深度分离卷积。

Encoder-Decoder with Atrous Convolution

DeepLabv3 as encoder:

DeepLabv3中也使用扩张卷积提取特征,我们将输入和输出的分辨率比值称为 o u t p u t _ s t r i d e output\_stride output_stride,对于语义分割任务,使用扩张卷积替换下采样,使得输出的feature的 o u t p u t _ s t r i d e = 16 output\_stride=16 output_stride=16。

DeepLabv3的ASPP模块使用了多个平行的扩张卷积,配合了图像级特征(即全局平均池化)。我们将DeepLabv3的logit前的输出特征作为encoder-decoder模型的encoder输出。此时输出的feature通道为256,可依据计算资源限制合理使用扩张卷积。

Proposed decoder:

在原先的DeepLabv3中,取预测的feature 直接双线性上采样16倍到期望尺寸,这样的简易的decoder模块不能成功的恢复分割细节(这个问题在Understand Convolution for Semantic Segmentation重点讨论过~)

DeepLabv3+的整体的架构如下图所示:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

简单说一下decoder的组成:

  • encoder输出的feature的 o u t p u t _ s t r i d e = 16 output\_stride=16 output_stride=16,经过双线性上采样4倍得到 F A F_A FA​, F A F_A FA​的 o u t p u t _ s t r i d e = 4 output\_stride=4 output_stride=4
  • 再取encoder中对应着相同分辨率(即 o u t p u t _ s t r i d e = 4 output\_stride=4 output_stride=4)的特征层,经过 1 × 1 1×1 1×1卷积降通道,此时输出的feature记为 F B F_B FB​。这里为什么要经过 1 × 1 1×1 1×1卷积降通道,是因为此分辨率的特征通道较多(256或512),而 F A F_A FA​输出只有256,故降通道以保持与 F A F_A FA​所占比重,利于模型学习。
  • 将 F A F_A FA​和 F B F_B FB​做concat,再经过一个 3 × 3 3×3 3×3卷积细化feature,最终再双线性上采样4倍得到预测结果

在实验部分展示了 o u t p u t _ s t r i d e = 16 output\_stride=16 output_stride=16是在速度和精度上最佳的平衡点,使用 o u t p u t _ s t r i d e = 8 output\_stride=8 output_stride=8能够进一步提升精度,伴随着是更大的计算消耗。

使用分离卷积改进Xcetpion

扩张分离卷积

Atrous Convolution:

扩张卷积在DeepLab系列,Understand Convolution for Semantic Segmentation, Dilated Residual Networks 上都介绍过。这里简单说一下:

考虑到二维信号上使用空洞卷积,对于位置 i i i,在输入为 x x x上应用滤波器 w w w,输出为 y y y:

y [ i ] = ∑ k x [ i + r ⋅ k ] w [ k ] y[i]=\sum_{k}x[i+r·k]w[k] y[i]=k∑​x[i+r⋅k]w[k]

其中速率 r r r在采样点之间引入 r − 1 r-1 r−1个零,有效的将感受野从 k × k k×k k×k扩展到 k e = k + ( k − 1 ) ( r − 1 ) k_e=k+(k-1)(r-1) ke​=k+(k−1)(r−1),而不增加参数和计算量。

Depthwise separable convolution:

深度分离卷积在MobileNet里面重点讲过,这里简单说一下:

深度可分离卷积干的活是:把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。深度卷积对每个通道独立使用空间卷积,逐点卷积用于结合深度卷积的输出。深度分离卷积可以大幅度降低参数量和计算量。

我们将扩张卷积核深度分离卷积结合到一起,即扩张分离卷积。扩张分离卷积能够显著的减少模型的计算复杂度并维持相似的表现。

Modified Aligned Xcetpion

论文受到近期MSRA组在Xception上改进工作可变形卷积(Deformable-ConvNets)启发,Deformable-ConvNets对Xception做了改进,能够进一步提升模型学习能力,新的结构如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

摘自MSRA COCO Detection & Segmentation Challenge 2017 Entry。

论文进一步改进了MSRA的工作以适应语义分割任务,具体如下:

  • 更深的Xception结构,不同的地方在于不修改entry flow network的结构,为了快速计算和有效的使用内存
  • 所有的最大池化操作替换成带下采样的深度分离卷积,这能够应用扩张分离卷积扩展feature的分辨率
  • 在每个 3 × 3 3×3 3×3的深度卷积后增加BN层和ReLU

改进后的Xception整体结构如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

改进后的Xception为encodet网络主体,替换原本DeepLabv3的ResNet101.

Experiment

论文使用modified aligned Xception改进后的ResNet-101,在ImageNet-1K上做预训练,通过扩张卷积做密集的特征提取。采用DeepLabv3的训练方式(poly学习策略,crop 513 × 513 513×513 513×513).注意在decoder模块同样包含BN层。

Decoder Design Choise

用DeepLabv3作为encoder,对于 f f f个 k × k k×k k×k的卷积操作记为 [ k × k , f ] [k×k,f] [k×k,f],先前DeepLabv3是在输出结果上继续双线性上采样16倍得到预测结果,这在PASCAL VOC2012 验证集上达到了77.21%。论文在此基础上,提出了改进的decoder模块。关于decoder的设计有多个方案:

使用 1 × 1 1×1 1×1卷积减少来自低级feature的通道数

下图示意部分为 1 × 1 1×1 1×1卷积:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

为了评估 1 × 1 1×1 1×1卷积的重要性,在encoder中取了 C o n v 2 Conv2 Conv2尺寸为 [ 3 × 3 , 256 ] [3×3,256] [3×3,256]为输出,减少通道数在48到32之间性能最佳。结果如下表:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

最终采用了 [ 1 × 1 , 48 ] [1×1,48] [1×1,48]来做通道降维。

是否需要 3 × 3 3×3 3×3卷积逐步获取分割结果,

即下图示意部分 3 × 3 3×3 3×3卷积恢复信息:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

实验部分包括使用 1 × 1 , 256 1×1,256 1×1,256的卷积,一组、二组、三组的 3 × 3 , 256 3×3,256 3×3,256卷积,使用 3 × 3 , 128 3×3,128 3×3,128的卷积,结果如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

结果显示使用两组 3 × 3 , 256 3×3,256 3×3,256卷积性能最佳。

使用那部分的低级特征帮助提供细节

即下图示意部分:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

论文实验了如果使用 C o n v 2 Conv2 Conv2和 C o n v 3 Conv3 Conv3同时预测, C o n v 2 Conv2 Conv2上采样2倍后与 C o n v 3 Conv3 Conv3结合,再上采样2倍,结果如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

这并没有显著的提升性能,考虑到计算资源的限制,论文最终采样简单的decoder方案,即取 C o n v 2 Conv2 Conv2上采样后再与top feature concatenate。

ResNet-101 as Network Backbone

以ResNet为encoder模型,测试了以下几种变体:

  • Baseline: 在下表的第一组。都没有使用decoder。测试了不同 o u t p u t _ s t r i d e output\_stride output_stride,多尺度输入,左右翻转操作。
  • Adding decoder: 下表的第二组。采用的encoder。平均多增加了20B的计算消耗。
  • Coarser feature maps: 测试了使用 o u t p u t _ s t r i d e = 32 output\_stride=32 output_stride=32,这样计算速度更快。但是相对于 o u t p u t _ s t r i d e = 16 output\_stride=16 output_stride=16准确率下降了1-2%左右。
语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

可以看到使用多尺度 M S MS MS计算量计算量增加一个数量级,使用左右翻转 F l i p Flip Flip计算量翻倍。

Xception as Network Backbone

ImageNet pretraining: 改进后的Xception网络在ImageNet-1K上做了预训练。训练设置如下:

选项 配置
优化器 Nesterov momentum optimizer,momentum = 0.9
学习率 初始学习率0.05,2个epochs衰减0.94
weight_decay 4e-5
硬件 同步使用50 GPUs
batchsize 每个GPU取32
image size 299x299
语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

可以看到Modified Xception性能要好点。

整体的使用Modified Xception做为网络骨架,使用如下几种变体:

  • Baseline: 不使用decoder.
  • Adding decoder: 添加了decoder.
  • Using depthwise separable convolution: 在ASPP和decoder中使用深度分离卷积。计算量下降了30-40%.
  • Pretraining on COCO: 在MS-COCO数据集上预训练
  • Pretraining on JFT: 在IamgeNet-1K和JFT-300M上预训练
语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

可以看到使用深度分离卷积可以显著降低计算消耗。

与其他先进模型在VOC12的测试集上对比:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

在目标边界上的提升

使用trimap实验测量模型在分割边界的准确度。计算边界周围扩展频带(称为trimap)内的mIoU。结果如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

与双线性上采样相比,加decoder的有明显的提升。trimap越小效果越明显。

加了decoder的可视化结果如下:

语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic ..DeepLabv3+AbstractIntroductionRelated WorkMethodsExperimentConclusion

Conclusion

论文提出的DeepLabv3+是encoder-decoder架构,其中encoder架构采用DeepLabv3,decoder采用一个简单却有效的模块用于恢复目标边界细节。并可使用扩张卷积在指定计算资源下控制feature的分辨率。

论文探索了Xception和深度分离卷积在模型上的使用,进一步提高模型的速度和性能。模型在VOC2012上获得了新的state-of-the-art表现。

继续阅读