使用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进行语义分割》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Series 60 应用程序开发

Series 60 应用程序开发

巴克 / 人民邮电出版社 / 2005-7 / 75.0

Series 60智能手机开发平台正掀起新一轮的移动服务浪潮。超过60%的手机生产商获得了Series 60平台的授权。Series 60移动应用开发平台拥有最大的用户群,从而成为智能手机市场的代表。诺基亚与EMCC软件公司合作,为C++程序员和软件设计师编撰了这本Series 60开发的权威指南。本书由诺基亚资深专家进行了全面审阅。本书内容涉及了开发过程的各个阶段,从设计、编程、测试、调试到部署......一起来看看 《Series 60 应用程序开发》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具