使用DeepLab进行语义分割

栏目: Python · 发布时间: 5年前

内容简介:DeepLab是谷歌使用

介绍

使用DeepLab进行语义分割

DeepLab是谷歌使用 tensorflow 基于 CNN 开发的语义分割模型,至今已更新4个版本。最新版本是 DeepLabv3+ ,在此模型中进一步将深度可分离卷积应用到孔空间金字塔池化和解码器模块,从而形成更快,更强大的语义分割编码器-解码器网络。本文从 官方案例 出发,介绍如何训练以及使用 DeepLabv3+ 模型。

使用DeepLab进行语义分割

模型安装

1,下载 tensorflow model ,然后将解压后的文件重命名为 ”models“ 并移动到 tensorflow 文件夹下。

使用DeepLab进行语义分割

2,添加环境变量

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

3,测试是否安装成功

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/model_test.py

结果出现如下错误:

使用DeepLab进行语义分割

解决方法如下:

使用DeepLab进行语义分割

使用DeepLab进行语义分割

准备数据

下载数据:

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab/datasets/
sh download_and_convert_voc2012.sh

具体执行步骤:

  1. 下载并解压 VOC2012 数据集

使用DeepLab进行语义分割

  1. 移除colormap

使用DeepLab进行语义分割

  1. 在数据集中创建 TFRecord 文件

使用DeepLab进行语义分割

下载预训练模型

官方提供了多种 模型 ,可以根据自己的实际需求下载安装。

使用DeepLab进行语义分割

使用PASCAL VOC2012数据集训练

文件结构:

使用DeepLab进行语义分割

tensorflow deeplab文件夹:

使用DeepLab进行语义分割

训练:

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research

填写相关路径,执行训练

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=30000 \
    --train_split="train" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --train_crop_size=513 \
    --train_crop_size=513 \
    --train_batch_size=1 \
    --dataset="pascal_voc_seg" \
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
    --train_logdir=${PATH_TO_TRAIN_DIR} \
    --dataset_dir=${PATH_TO_DATASET}

PATH_TO_INITIAL_CHECKPOINT:初始checkpoint文件路径(迁移学习)

PATH_TO_TRAIN_DIR:训练模型保存路径

PATH_TO_DATASET:数据集路径

需要注意的问题:

  1. 当GPU显存不够,使用迁移学习方式进行训练并减少学习率大小,设置”fine_tune_batch_norm=False“
  2. 当设置”output_stride=8“,”atrous_rates“取值区间应由[6,12,18]改为[12,24,36]。
  3. 当不想使用解码器结构,需要注释掉”decoder_output_stride“。

验证

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=513 \
    --eval_crop_size=513 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --eval_logdir=${PATH_TO_EVAL_DIR} \
    --dataset_dir=${PATH_TO_DATASET}

PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径

PATH_TO_EVAL_DIR:评估模型保存路径

PATH_TO_DATASET:数据集路径

可视化模型输出

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=513 \
    --vis_crop_size=513 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --vis_logdir=${PATH_TO_VIS_DIR} \
    --dataset_dir=${PATH_TO_DATASET}

PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径

PATH_TO_VIS_DIR:评估模型保存路径

PATH_TO_DATASET:数据集路径

需要注意的问题:

当需要保存分割结果时,需要设置 ”also_save_raw_predictions = True“

Tensorboard

tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}

将同时显示”train“,”eval“,”vis“结果,如需要单独显示一类,可以指定显示类别,如:

tensorboard --logdir train/

对于 voc2012 这样的数据集, Tensorboard 显示数据可能需要几分钟的时间。

模型导出

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/export_model.py \
    --logtostderr \
    --checkpoint_path="${PATH_TO_CHECKPOINT}" \
    --export_path="${PATH_TO_EXPORT_PD}" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --num_classes=21 \
    --crop_size=513 \
    --crop_size=513 \
    --inference_scales=1.0

PATH_TO_CHECKPOINT:checkpoint文件路径

PATH_TO_EXPORT_PD:导出PD文件路径(加后缀.pd)

案例

cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab
sh local_test.sh

Google Colab 在线测试地址 ,可选择预训练模型,测试分割照片来查看模型输出结果。

使用DeepLab进行语义分割

总结

基于深度学习的语义分割与传统基于随机森林的方法相比有了很大的进步,虽然目前基于深度学习的方法有多种思路,不过基本都是基于全卷积(FCN)衍变而来。FCN将网络全连接层使用卷积替代,因此可以接受任意大小的输入并且针对下采样存在位置信息丢失等问题,采用转置卷积用于恢复图片尺寸,方便后续进行逐像素预测。

DeepLab模型为了改善分割效果,使用 atrous 卷积(空洞卷积), ASPP ,全连接条件随机场等技术。


以上所述就是小编给大家介绍的《使用DeepLab进行语义分割》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Types and Programming Languages

Types and Programming Languages

Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00

A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具