论文阅读 || 语义分割系列 —— deeplabv3+ 详解

论文地址:https://arxiv.org/pdf/1802.02611.pdf

1 deeplabv3+ 概述

deeplabv3的缺点:

  • 预测的feature map 直接双线性上采样16倍,到期望的尺寸,这样会 细节信息不够

deeplabv3+的特点:

  • 使用了 【encoder-decoder】(高层特征提供语义,decoder逐步回复边界信息):提升了分割效果的同时,关注了边界的信息
  • encoder结构中:采用了 【Xception】 做为 DCNN、使用【ASPP】并将【深度可分离卷积(depthwise deparable conv)】应用在了ASPP 和 encoder 模块中,使网络更快。
  • decoder结构:采用一个简单的模块,用于回复目标边界细节

deeplabv3+的贡献:

  • 提出了新的 encoder-decoder 结构,采用 deeplabv3 作为 encoder 模块,以及一个简单有效的decoder模块
  • 在网络结构中,可以通过空洞卷积任意控制 encoder 模块特征图的分辨率,并充分考虑的速度和精度,这是现有的 encoder-decoder模块没有的
  • 采用了 Xception模块用于分割任务,并将深度可分离卷积(depthwise separable convolution)应用到ASPP 和 decoder 模块中
  • 模型获得了很高的分割精度,并详细分析了模型设计原则和模型变体
  • 开源了代码和模型

deeplabv3+的效果:

  • 在PASCAL VOC 2012 和 Cityscaps 数据集上获得 89.0% 和 82.1% 的分割效果,没有添加任何的后处理。

结构的进化: deeplabv3 + encoder-decoder --> deeplabv3+
论文阅读 || 语义分割系列 —— deeplabv3+ 详解

2 deeplabv3+

2.1 网络结构

论文阅读 || 语义分割系列 —— deeplabv3+ 详解

  • encoder:

    • 使用 deeplabv3 作为编码器。网络中的空洞卷积提取特征,获取多尺度的上下文信息,同时替代了下采样,使输出的 feature map 的 output_stride=16。
    • ASPP 模块使用了多个平行的空洞卷积,配合了图像级特征(即全局平均池化)
  • decoder

    • 【 F a F_a Fa​】:encoder 输出的特征图的output_stride=16,经过双线性上采样4倍得到 F a F_a Fa​。 F a F_a Fa​的output_stride=4
    • 【 F b F_b Fb​】:取 encoder 的中间层(具有相同分辨率,output_stride=4),
      经过 1x1 卷积降通道(原因:要和 F a F_a Fa​ 保持相同的 channels,保持相同占比,利于模型学习),此时输出的特征图记为 F b F_b Fb​。
    • 【 F a + F b F_a+F_b Fa​+Fb​】:将 F a F_a Fa​ 和 F b F_b Fb​ 做 concat,在经过一个 3x3 卷积细化 feature,最终再双线性上采样4倍得到预测的结果

output_stride=16,是精度和速度的最好的平衡;当output_stride=8 时,需要付出额外的计算代价。


对于网络结构内容,要了解如下:

  • 1 深度可分离卷积
  • 2 output_stride的影响
  • 3 修改后的 Xception

2.2 深度可分离卷积

深度可分离卷积,极大的降低了计算的复杂度。 【depthwise separable conv】 = 【depthwise conv】+【point conv】
空洞分离卷积【Atrous separable conv】=【depthwise conv】+【atrous conv】

  • 【depthwise conv】是在每个通道上独自的进行空间卷积
  • 【pointwise conv】是利用 1x1 卷积核 对【depthwise conv】进行组合,从而得到特征
  • 【atrous conv】空洞卷积
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解

2.3 output_stride的影响

这里的 output_stride 表示为 输入图与输出图的比值。对于图像分类任务,通常 output_stride=32;对于语义分割,可以采用output_stride=16 or 8 提密集特征图,以及要修改最后的一个或者两个模块的滑动值(比如stride从2修改为1。当output_stride=8时,最后两个模块的空洞值分别为rate=2,4)。

DeeplabV3 使用空洞卷积提取任意分辨率的特征。Deeplabv3 采用 ASPP 模块,可以通过设置不同的 rate 来提取不同尺寸的卷积特征,以及采用 image-level feature;将Deeplabv3 最后一层的特征图作为本文的 encoder 的输出(包含256通道的特征图),并包含丰富的语义特征。

2.4 Modified Aligned Xception

DCNN模块的发展:【Xception 】–> 【Aligned Xception】 --> 【Modifiled Aligned Xception】

  • 1 Xception 模型已经在图像分类上取得了快速的计算
  • 2 MSRA提出的改进版本的Aligned Xception 在目标检测中实现了快速计算
  • 3 这里,基于Aligned Xception 进行了修改得到了 Modifiled Aligned Xception。改进内容为:
    • 使用相同 Xception,保持 Xception的 entry flow network 的结构,为了更快的计算和提高内存效率
    • 使用 Depthwise separable conv 来替换所有的 max-pooling 操作
    • 在每个 3x3 depthwise conv 后,添加BN

deeplabv3 中的DCNN 使用的是 ResNet-101的特征提取网络
deeplabv3+ 中的DCNN使用的是 Modified Aligned Xception
论文阅读 || 语义分割系列 —— deeplabv3+ 详解
论文阅读 || 语义分割系列 —— deeplabv3+ 详解

3 实验

  • 使用 ImageNet-1K 上预训练的ResNet-101 和 Modified Aligned Xception,通过空洞卷积提取稠密特征图
  • 使用的数据集为 PASCAL VOC 2012,包含20个前景目标类和一个背景类
  • 使用 ploy 学习策略,初始学习率为 0.007,crop size=513x513(训练图片裁剪)。
  • output_stride=16,随机裁剪翻转数据增强

3.1 解码器的设计

对于 f 个滤波器,kernel大小为 kxk 的卷积操作记为 【k*k, f】

【encoder】
用Deeplabv3 作为 encoder,基于ResNet-101 的Deeplabv3 是在输出结果上继续双线性上采样16倍得到的预测结果,这在PASCAL VOC 2012 验证集上达到了 77.21%.
【decoder】
在此基础上,Deeplabv3+ 提出了改进的decoder模块,最终选择了:
采用最简单的解码模型,Deeplabv3 最终的特征图和conv2的特征图进行concat,然后经过2组 [3*3,256]
的卷积。

  1. 使用 1*1 卷积来减少low feature 的通道数
    1*1 卷积示意图:
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解
    为了评估 1*1卷积在 decoder阶段的影响,在encoder中取了 conv2 尺寸 [3x3,256]作为 encoder的一个输出,从下表中可以看到减少通道数在 48 到 32 之间性能最佳。最终采用 [1*1,48]
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解

  2. 使用 3*3卷积逐步获取分割的结果
    3*3卷积 示意图
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解
    (1) 发现使用2组 [3*3,256] 的滤波器比使用 1组、3组 更有效;
    (2) 将滤波器的个数 256 改为 128,或将卷积核大小从 3*3改为 1*1 都会降低性能

    论文阅读 || 语义分割系列 —— deeplabv3+ 详解

  3. 在 decoder 阶段使用那部分的 low-leve feature map
    在 conv2 和 conv3 串联起来作为特征图,conv2 上采样2倍后,与 conv3结合,再上采样2倍,效果没有提升。
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解


3.2 ResNet-101 as Network BackBone

用 ResNet作为 Deeplabv3的 encoder模型,进行了实验:

  • Baseline:下表中的第一组。都没有使用 decoder,测试了不同的output_stride,多尺度输入,左右翻转
  • Adding decoder:下表中的第二组。采用decoder,平均多增加了20B 的计算消耗,性能从 【77.21%/ 78.85%】到 【78.51% / 79.35%】
  • Coarser Feature maps:下表中的第三组。粗糙的特征图,测试了使用output_stride=32,使用decoder,计算两只有74.2B,这样计算速度更快。但相对于 output_stride=16 准确率下降了 1-1.5% 左右
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解
    结论:
  • 在 training 或 evaluation时,使用output_stride=16 or 8
  • 使用多尺度 MS 计算量增加一个数量级,使用左右翻转计算量翻倍

3.3 Xception as Network BackBone

预训练:Xception 网络使用 ImageNet-1K 进行预训练,配置如下:

选项 配置
优化器 Nesterov momentum optimizer,momentum=0.9
学习率 初始学习率 0.05, 2个 epoch 衰减 0.94
weight_decay 4.0 e-5
硬件 同步使用50GPUs
batch size 32*50 (每个GPU取32个图片)
Image size 299*299

论文阅读 || 语义分割系列 —— deeplabv3+ 详解
从上表中可以看出 Modified Xception 性能更好一些。以 Modified Xception 作为 Deeplabv3+ 作为 Deeplabv3+ 的encoder模型,进行了试验:

  • Baseline:不使用decoder。当 train-output_stride = eval-output_stride = 16 时,使用 Modified Xception 比 ResNet-101 性能提升了 2%;使用 output_stride=8、MS、Flip 性能都有所提升。
  • Adding decoder:添加了decoder,当 eval-output_stride=16时,比没有decoder 时 提升了8%
  • Using depthwise separable conv:在ASPP 和 decoder 中使用深度分离卷积。计算量下降了30-40%
  • pretraining on COCO:在 MS-COCO 数据集上训练,性能提升了 2%
  • pretraining in JFT:在 ImageNet-K 和 JFT-300M 上预训练,性能提升 0.8%-1%
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解
  • 与其他先进模型在VOC12 的测试集上对比:
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解
  • 质量评估:下图是预测可视化的结果,模型在没有任何后处理的情况下分割效果很好。但第三行出现的情况分割不好:(1) 沙发和椅子;(2) 严重遮挡的物体;(3) 视野罕见的物体上分割效果不是很好
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解

3.4 在目标边界上的优化

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

  • 与双线性上采样相比,使用decoder的有明显的提升。 trimap 越小效果越明显。
    论文阅读 || 语义分割系列 —— deeplabv3+ 详解

4 conclusion

论文提出了Deeplabv3+ 是 encoder-decoder的架构,其中encoder 架构采用Deeplabv3,decoder采用一个简单的模块用于恢复目标边界细节。并可使用 atrous convolution 在指定计算资源下控制特征的分辨率。

上一篇:DeepLabv3+图像语义分割实战:训练自己的数据集


下一篇:deeplabv3+ decoder代码 详解