介绍DeepLab是谷歌使用tensorflow基于CNN开发的语义分割模型,至今已更新4个版本。最新版本是DeepLabv3+,在此模型中进一步将深度可分离卷积应用到孔空间金字塔池化和解码器模块,从而形成更快,更强大的语义分割编码器-解码器网络。本文从官方案例出发,介绍如何训练以及使用DeepLabv3+模型。模型安装1,下载tensorflow model,然后将解压后的文件重命名为”models“并移动到tensorflow文件夹下。2,添加环境变量cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchexport PYTHONPATH=$PYTHONPATH:pwd:pwd/slim3,测试是否安装成功cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython 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/researchpython 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/researchpython 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“Tensorboardtensorboard –logdir=${PATH_TO_LOG_DIRECTORY}将同时显示”train“,”eval“,”vis“结果,如需要单独显示一类,可以指定显示类别,如:tensorboard –logdir train/对于voc2012这样的数据集,Tensorboard显示数据可能需要几分钟的时间。模型导出cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython 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.0PATH_TO_CHECKPOINT:checkpoint文件路径PATH_TO_EXPORT_PD:导出PD文件路径(加后缀.pd)案例cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplabsh local_test.shGoogle Colab在线测试地址,可选择预训练模型,测试分割照片来查看模型输出结果。总结基于深度学习的语义分割与传统基于随机森林的方法相比有了很大的进步,虽然目前基于深度学习的方法有多种思路,不过基本都是基于全卷积(FCN)衍变而来。FCN将网络全连接层使用卷积替代,因此可以接受任意大小的输入并且针对下采样存在位置信息丢失等问题,采用转置卷积用于恢复图片尺寸,方便后续进行逐像素预测。DeepLab模型为了改善分割效果,使用atrous卷积(空洞卷积),ASPP,全连接条件随机场等技术。