1.数据集、脚本和模型下载
1.1下载Cityscapes
使用 Cityscapes官方数据:https://www.cityscapes-dataset.com/
Cityscapes数据集包括leftImg8bit(11GB)和对应的标注集gtFine(241MB)。
1.2下载脚本文件
在https://github.com/mcordts/cityscapesScripts下载cityscapesScripts脚本,用于处理Cityscapes 数据集。
1.3下载初始权重文件
http://download.tensorflow.org/models/deeplabv3_cityscapes_train_2018_02_06.tar.gz
更多预训练权重请参见:
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md
1.4构建目录
A.在Ubuntu系统的主目录/home/XX/下建立一个新的目录data.
B.将cityscapes拷贝到data目录下
C.将脚本所在目录cityscapesScripts拷贝到data目录下
D.将预训练权重所在目录deeplabv3_cityscapes_train拷贝到data目录下
2.生成数据集的tfrecord
2.1修改shell转换脚本文件
在/home/lw/models/research/deeplab/datasets目录中找到convert_cityscapes.sh,打开并修改数据集和脚本所在目录。(体现了第1.4构建目录的重要性)
2.2修改python脚本文件
在/home/lw/data/cityscapes/cityscapesscripts/preparation中找到createTrainldLabelImgs.py文件,并添加系统变量,如下图矩形框中代码。否则,下面两行代码所引包找不到目录所在位置。
2.3执行脚本
在终端跳到cd /home/lw/models/research/deeplab/datasets,在该目录所在位置执行shell文件:
sudo sh convert_cityscapes.sh
则,会在/home/lw/data/cityscapes/目录成生成tfrecord文件
2.4修改成tfrecord文件
由于所下载DeepLabV3+是版本为master版本,在执行时所用上述文件名tfrecord文件则会报错“段错误”,因此,需要将文件名修改为fine类型
可以使用“ sudo mv 原文名 新文件”,修改为如下格式的文件
3.训练模型
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=2000 \
--train_split="train_fine" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--train_crop_size="321,321" \
--train_batch_size=4 \
--fine_tune_batch_norm=false \
--dataset="cityscapes" \
--tf_initial_checkpoint='/home/lw/data/cityscapes/deeplabv3_cityscapes_train/model.ckpt' \
--train_logdir='/home/lw/data/cityscapes/train' \
--dataset_dir='/home/lw/data/cityscapes/tfrecord'
在终端将当前目录切换至train_logdir='/home/lw/data/cityscapes/train'的上一级目录,执行tensorboard,可以通过网页监控训练情况。
lw@lw:~/data/cityscapes$ tensorboard --logdir=train
会输出一网址,在浏览器中输出网址,则可以进行实时监控
4.验证模型效果
python deeplab/eval.py \
--logtostderr \
--eval_split="val_fine" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--eval_crop_size=1025,2049 \
--dataset="cityscapes" \
--checkpoint_dir='/home/lw/data/cityscapes/train' \
--eval_logdir='/home/lw/data/cityscapes/eval' \
--dataset_dir='/home/lw/data/cityscapes/tfrecord'
5.查看分割结果
python deeplab/vis.py \
--logtostderr \
--vis_split="val_fine" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--vis_crop_size=1025,2049 \
--dataset="cityscapes" \
--colormap_type="cityscapes" \
--checkpoint_dir='/home/lw/data/cityscapes/train' \
--vis_logdir='/home/lw/data/cityscapes/vis' \
--dataset_dir='/home/lw/data/cityscapes/tfrecord'
6.出现的一些错误:
执行官方给出的训练命令,会出现data split name train not recognized错误。
这是因为:在代码中已经没有“train”这个选项了,而是train_fine等等,这个问题在执行val和vis的时候都会遇到,将各自加后缀train_fine、val_fine就可以了。但是会发现这里改成train_fine后程序会意外停止。