相关资料
代码地址:https://github.com/tensorflow/models/tree/master/research/deeplab
论文地址:https://arxiv.org/abs/1809.04184
个人笔记:https://blog.youkuaiyun.com/mooneve/article/details/83144385
官方教程:
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/installation.md
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/cityscapes.md
参考资料
https://blog.youkuaiyun.com/cs_hnu_scw/article/details/79695347
https://blog.youkuaiyun.com/u011974639/article/details/80574306
https://blog.youkuaiyun.com/u011974639/article/details/80948990
环境要求
Ubuntu16.04
CUDA 9.0(若使用8.0,则tensorflow版本最高为1.4)
Python 3.6:
- Numpy
- Pillow 1.0
- tf Slim (which is included in the “tensorflow/models/research/” checkout)
- Jupyter notebook
- Matplotlib
- Tensorflow
安装Anaconda和tensorflow
下载地址:https://repo.anaconda.com/archive/
选择64位linux版 python下载,安装即可。可参考 https://blog.youkuaiyun.com/cs_hnu_scw/article/details/79695347
(在这里我创建的python虚拟环境名为deeplab)
配置代码环境
任意目录下打开Terminal,输入以下命令,将代码克隆到本地,获得models文件夹。
git clone https://github.com/tensorflow/models.git
在命令行中,输入:
source activate deeplab
切换到tensorflow python虚拟环境中,输入:
sudo gedit ~/.bashrc
打开编辑~/.bashrc,在文件末尾将models/research/slim添加到PYTHONPATH中,避免以后每次打开Terminal都要手动输入,添加内容为:
export PYTHONPATH=/home/lab/ygy/models/research/slim:$PYTHONPATH
/home/lab/ygy为存放models文件夹的目录。
完成后,命令行进入/models/research目录,在目录下输入:
python deeplab/model_test.py
运行model_test.py测试,结果报错:
原因:当前版本中model_test.py存在一处错误,代码第140行,scales_to_model_results.keys()的类型为dict_keys,需要将其转为list类型,故修改如下:
self.assertListEqual(list(scales_to_model_results.keys()),
expected_endpoints)
修改完成后即可运行通过。
Cityscapes数据集
下载
去 https://www.cityscapes-dataset.com/ 上下载数据集。由于直接分享违法,故需要注册账号(最好用带edu的邮箱注册)。
下载数据集leftImg8bit_trainvaltest.zip (11GB)和对应的标注集gtFine_trainvaltest.zip (241MB)。
将两个压缩包解压至:/ygy/models/research/deeplab/datasets/cityscapes。
解压完毕后,在cityscapes目录下运行命令:
git clone https://github.com/mcordts/cityscapesScripts.git
将操作Cityscapes数据集标签的代码克隆到本地。接着在cityscapes下创建tfrecord, exp等目录。train_on_train_set 目录存储 train/eval/vis 的过程和结果。(后面为了分别测试trainfine和trainval模型,文件名做了相应修改)
此时cityscapes下的目录结构为:
+ /ygy/models/research/deeplab/datasets/cityscapes
+ cityscapesscripts
+ leftImg8bit
+ gtFine
+ tfrecord
+ exp
+ train_on_train_set
+ train_fine
+ train_val
+ eval_fine
+ eval_val
+ vis_fine
+ vis_val
修改代码生成Cityscapes的TFRecord
进入/ygy/models/research/deeplab/datasets/cityscapes/cityscapesscripts/preparation文件夹
修改createTrainIdLabelImgs.py代码第42行,将其指定为cityscapes数据集的位置:
cityscapesPath = '/home/lab/ygy/models/research/deeplab/datasets/cityscapes'
然后即可在/models/research/deeplab/datasets目录下运行convert_cityscapes.sh,生成TFRecord。如下图:
sh convert_cityscapes.sh
生成的TFRecord保存在cityscapes/tfrecord文件夹中
在CityScapes下训练
下载预训练模型
去 model_zoo上下载github上官方给出的预训练模型 ,目前在CityScapes下有两种模型可供选择:xception71_dpc_cityscapes_trainfine(445 M)和xception71_dpc_cityscapes_trainval(446 M)。将两个模型下载后,解压放到deeplab/backbone目录下(该目录自己手动创建)。
1.模型训练
官方给出的训练样例为:
# From tensorflow/models/research/
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=90000 \ 训练迭代次数,初次实验时刻设置为500,1000等,验证是否正确
--train_split="train" \
--model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
--atrous_rates=6 \ 见下方注意1
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \ 见下方注意2
--train_crop_size=769 \ 训练图片的裁剪大小,代码中默认为513,最小不低于312
--train_crop_size=769 \
--train_batch_size=1 \如要复现论文中的效果则至少为8(注意显卡显存是否足够),同时设置fine_tune_batch_norm = True
--dataset="cityscapes" \ 使用的数据集名称
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" 运行DCP时需要添加此项
--tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \ 预训练模型路径
--train_logdir=${PATH_TO_TRAIN_DIR} \ 训练日志存放目录
--dataset_dir=${PATH_TO_DATASET} TFRecord目录
注意1:
xception71_dpc_cityscapes_trainfine的output_stride为16
xception71_dpc_cityscapes_trainval 的output_stride为8,所以使用后者作为预训练模型时,则atrous_rates 需要从 [6, 12, 18] 变为 [12, 24, 36]。
注意2:
如果不想使用decoder结构,可以去掉命令中的decoder_output_stride。
注意3:
当batch_size 小于12时,应将fine_tune_batch_norm设为false,故在训练时还需要带上这个变量。
xception71_dpc_cityscapes_trainfine调用命令
我的机器显卡为1080ti ,batch_size只能设为1 ┓( ´∀` )┏,或者你可以选择把图片裁剪到更小,比如设为默认的513
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=1000 \
--train_split="train" \
--model_variant="xception_71" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--train_crop_size=769 \
--train_crop_size=769 \
--train_batch_size=1 \
--fine_tune_batch_norm=False \
--dataset="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--tf_initial_checkpoint="deeplab/backbone/train_fine/model.ckpt"\
--train_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord"
训练过程如下图:
xception71_dpc_cityscapes_trainval调用命令
这个模型batch_size直接设为1,1080Ti显存不足,所以我把图片也裁剪到513后运行通过。
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=1000 \
--train_split="train" \
--model_variant="xception_71" \
--atrous_rates=12 \
--atrous_rates=24 \
--atrous_rates=36 \
--output_stride=8 \
--decoder_output_stride=4 \
--train_crop_size=513 \
--train_crop_size=513 \
--train_batch_size=1 \
--fine_tune_batch_norm=False \
--dataset="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--tf_initial_checkpoint="deeplab/backbone/trainval_fine/model.ckpt" \
--train_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord"
2.模型评估
官方给出的评估样例为:
# From tensorflow/models/research/
python deeplab/eval.py \
--logtostderr \
--eval_split="val" \
--model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
--atrous_rates=6 \ 设置同上,使用tarinval时,需要修改为[12,24,36,8]
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--eval_crop_size=1025 \ 测试图片时,图片裁剪可以大一些
--eval_crop_size=2049 \
--dataset="cityscapes" \
--checkpoint_dir=${PATH_TO_CHECKPOINT} \ 训练模型存放的目录
--eval_logdir=${PATH_TO_EVAL_DIR} \ 保存验证结果的目录
--dataset_dir=${PATH_TO_DATASET} TFRecord目录
一开始我评估和可视化的时候都报错了,提示Key aspp0/BatchNorm/beta not found in checkpoint,后来向作者提问之后才知道 --dense_prediction_cell_json=“deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json”
也是需要加上的……只能怪自己阅读理解能力不好o(╥﹏╥)o https://github.com/tensorflow/models/issues/5630
xception71_dpc_cityscapes_trainfine调用命令
python deeplab/eval.py \
--logtostderr \
--eval_split="val" \
--model_variant="xception_71" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--eval_crop_size=1025 \
--eval_crop_size=2049 \
--dataset="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
--eval_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/eval_fine" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord"
注意:eval.py 和vis.py在评估完毕后,并不会主动停止,它们会一直等待新的checkpoint,所以需要我们手动按ctrl+c把程序停止。
xception71_dpc_cityscapes_trainval调用命令
可能由于我训练的时候设置的crop size是513,所以mIOU比官方低一些。
python deeplab/eval.py \
--logtostderr \
--eval_split="val" \
--model_variant="xception_71" \
--atrous_rates=12 \
--atrous_rates=24 \
--atrous_rates=36 \
--output_stride=8 \
--decoder_output_stride=4 \
--eval_crop_size=1025 \
--eval_crop_size=2049 \
--dataset="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
--eval_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/eval_val" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord"
3.分割可视化
官方给出的评估样例为:
# From tensorflow/models/research/
python deeplab/vis.py \
--logtostderr \
--vis_split="val" \
--model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
--atrous_rates=6 \ 设置同上,使用tarinval时,需要修改为[12,24,36,8]
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--vis_crop_size=1025 \ 测试图片时,图片裁剪可以大一些
--vis_crop_size=2049 \
--dataset="cityscapes" \
--colormap_type="cityscapes" \
--checkpoint_dir=${PATH_TO_CHECKPOINT} \ 训练模型存放的目录
--vis_logdir=${PATH_TO_VIS_DIR} \ 保存分割结果的目录
--dataset_dir=${PATH_TO_DATASET} TFRecord目录
--also_save_raw_predictions=True 是否保存原始的预测图
注意:如果想保存分割结果用于evaluation server,可设置also_save_raw_predictions=True
xception71_dpc_cityscapes_trainfine调用命令
python deeplab/vis.py \
--logtostderr \
--vis_split="val" \
--model_variant="xception_71" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--vis_crop_size=1025 \
--vis_crop_size=2049 \
--dataset="cityscapes" \
--colormap_type="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
--vis_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/vis_fine" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord" \
--also_save_raw_predictions=True
部分分割结果图:
xception71_dpc_cityscapes_trainval调用命令
python deeplab/vis.py \
--logtostderr \
--vis_split="val" \
--model_variant="xception_71" \
--atrous_rates=12 \
--atrous_rates=24 \
--atrous_rates=36 \
--output_stride=8 \
--decoder_output_stride=4 \
--vis_crop_size=1025 \
--vis_crop_size=2049 \
--dataset="cityscapes" \
--colormap_type="cityscapes" \
--dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
--checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
--vis_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/vis_val" \
--dataset_dir="deeplab/datasets/cityscapes/tfrecord" \
--also_save_raw_predictions=True
部分分割结果图:
按照官方的说法,trainval的mIOU比trainfine高,而我这里测试效果相反,应该是因为trainval我训练时裁剪得更小导致的。啊啊啊啊,想要显存更大的显卡!w(゚Д゚)w