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

本文介绍了deeplabv3+网络,它采用encoder - decoder结构,以deeplabv3为encoder,简单模块为decoder。分析了其网络结构、深度可分离卷积、output_stride影响及Modified Aligned Xception。通过在PASCAL VOC 2012等数据集实验,展示了不同骨干网络效果,还对目标边界进行优化,分割效果良好。

论文地址: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+
在这里插入图片描述

2 deeplabv3+

2.1 网络结构

在这里插入图片描述

  • 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】空洞卷积
    在这里插入图片描述

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
在这里插入图片描述
在这里插入图片描述

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 卷积示意图:
    在这里插入图片描述
    为了评估 1*1卷积在 decoder阶段的影响,在encoder中取了 conv2 尺寸 [3x3,256]作为 encoder的一个输出,从下表中可以看到减少通道数在 48 到 32 之间性能最佳。最终采用 [1*1,48]
    在这里插入图片描述

  2. 使用 3*3卷积逐步获取分割的结果
    3*3卷积 示意图
    在这里插入图片描述
    (1) 发现使用2组 [3*3,256] 的滤波器比使用 1组、3组 更有效;
    (2) 将滤波器的个数 256 改为 128,或将卷积核大小从 3*3改为 1*1 都会降低性能

    在这里插入图片描述

  3. 在 decoder 阶段使用那部分的 low-leve feature map
    在 conv2 和 conv3 串联起来作为特征图,conv2 上采样2倍后,与 conv3结合,再上采样2倍,效果没有提升。
    在这里插入图片描述

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% 左右
    在这里插入图片描述
    结论:
  • 在 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_decay4.0 e-5
硬件同步使用50GPUs
batch size32*50 (每个GPU取32个图片)
Image size299*299

在这里插入图片描述
从上表中可以看出 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%
    在这里插入图片描述
  • 与其他先进模型在VOC12 的测试集上对比:
    在这里插入图片描述
  • 质量评估:下图是预测可视化的结果,模型在没有任何后处理的情况下分割效果很好。但第三行出现的情况分割不好:(1) 沙发和椅子;(2) 严重遮挡的物体;(3) 视野罕见的物体上分割效果不是很好
    在这里插入图片描述

3.4 在目标边界上的优化

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

  • 与双线性上采样相比,使用decoder的有明显的提升。 trimap 越小效果越明显。
    在这里插入图片描述

4 conclusion

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

03-08
### DeepLab 图像分割模型使用教程 #### 1. 模型概述 DeepLab 是一种用于语义图像分割的强大工具,通过引入空洞卷积(Atrous Convolution)、多尺度上下文聚合以及空间金字塔池化模块来提升性能。该系列经历了多个版本的发展,从 Deeplab v1 到最新的 Deeplab v3+ 不断改进结构设计以提高精度和效率[^2]。 #### 2. 安装环境准备 为了能够顺利运行并训练 DeepLab 模型,在本地计算机上需安装必要的依赖库。推荐采用 Anaconda 创建虚拟环境,并按照官方文档中的说明完成 TensorFlow 或 PyTorch 的安装配置工作。对于具体操作步骤可以参考 GitHub 上的相关项目页面提供的指导信息[^1]。 #### 3. 数据集获取与预处理 针对特定应用场景选择合适的数据集非常重要。常用公开数据集如 PASCAL VOC、COCO 等可用于初步实验测试;而对于定制化的业务需求,则可能需要自行收集标注图片作为输入素材。在实际应用前还需对原始图像做标准化变换、裁剪缩放等一系列预处理措施以便更好地适应算法框架的要求[^4]。 #### 4. 训练过程详解 利用给定的开源代码仓库 `train-DeepLab` 可快速搭建起基于 Python 和 TensorFlow 实现的 DeepLabV3+/MobileNet 版本实例程序。用户可以根据自身硬件条件调整超参数设置(比如批次大小 Batch Size, 学习率 Learning Rate 等),并通过 TensorBoard 工具实时监控损失函数变化趋势从而优化调参策略。 ```bash # 下载并解压Pascal VOC数据集 wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar tar xf VOCtrainval_11-May-2012.tar # 进入项目目录执行脚本启动训练流程 cd /path/to/train-deeplab/ python deeplab_train.py --dataset_dir=./datasets/pascal_voc_seg \ --model_variant="mobilenet_v2" \ --atrous_rates=6 \ --output_stride=16 \ --train_crop_size="513,513" ``` #### 5. 部署到移动设备 当完成了模型训练之后,如果希望将其应用于移动端应用程序开发当中去的话,那么就需要考虑如何有效地压缩量化权重文件使之能够在资源受限环境下正常运作。这里可以通过 ONNX Runtime 来转换导出经过优化后的 .pt 格式的深度神经网络描述符至 Android 平台之上进行推理计算。 ```python import torch.onnx as onnx from torchvision import models dummy_input = torch.randn(1, 3, 224, 224).cuda() model = models.segmentation.deeplabv3_resnet101(pretrained=True).eval().cuda() onnx.export(model, dummy_input, "deeplabv3.onnx", export_params=True, opset_version=10, do_constant_folding=True, input_names=['input'], output_names=['output']) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值