使用DeepLab进行语义分割

49次阅读

共计 3538 个字符,预计需要花费 9 分钟才能阅读完成。

介绍

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

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

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
结果出现如下错误:

解决方法如下:

准备数据
下载数据:
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab/datasets/
sh download_and_convert_voc2012.sh
具体执行步骤:
下载并解压 VOC2012 数据集

移除 colormap

在数据集中创建 TFRecord 文件

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

使用 PASCAL VOC2012 数据集训练
文件结构:

tensorflow 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:数据集路径
需要注意的问题:

当 GPU 显存不够,使用迁移学习方式进行训练并减少学习率大小,设置”fine_tune_batch_norm=False“
当设置”output_stride=8“,”atrous_rates“取值区间应由 [6,12,18] 改为[12,24,36]。
当不想使用解码器结构,需要注释掉”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 在线测试地址,可选择预训练模型,测试分割照片来查看模型输出结果。

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

正文完
 0