Tensorflow之deeplab训练cityscapes数据集

在《TensorFlow之deeplab语义分割API接口调试》文章中,介绍了如何安装tensorflow model以及训练自己的语义分割模型,本文介绍对cityscapes数据集的训练方法

0 系统环境

  • ubuntu 16.04
  • CUDA 9.0
  • cuDNN 7.3.1
  • python 3.6.9
  • tensorflow-gpu 1.12.0

1 cityscapes介绍

Cityscapes拥有5000张在城市环境中驾驶场景的图像(2975train,500 val,1525test)。它具有19个类别的密集像素标注(97%coverage),其中8个具有实例级分割。Cityscapes数据集,即城市景观数据集,这是一个新的大规模数据集,其中包含一组不同的立体视频序列,记录在50个不同城市的街道场景。

城市景观数据集中于对城市街道场景的语义理解图片数据集,该大型数据集包含来自50个不同城市的街道场景中记录的多种立体视频序列,除了20000个弱注释帧以外,还包含5000帧高质量像素级注释。因此,数据集的数量级要比以前的数据集大的多。Cityscapes数据集共有fine和coarse两套评测标准,前者提供5000张精细标注的图像,后者提供5000张精细标注外加20000张粗糙标注的图像。

Cityscapes数据集包含2975张图片。包含了街景图片和对应的标签。大小为113MB。Cityscapes数据集,包含戴姆勒在内的三家德国单位联合提供,包含50多个城市的立体视觉数据。

关于数据集文件中的具体定义,可以参考《Cityscapes数据集介绍》

2 数据集准备

源码下载安装方法参考《TensorFlow之目标检测API接口调试》,注意tensorflow版本有点区别

git clone https://github.com/tensorflow/models.git

在百度云下载数据集(提取码:1bln)或者官网下载

官方给的数据集目录结构如下

+ datasets
  + cityscapes
    + leftImg8bit
    + gtFine
    + tfrecord
    + exp
      + train_on_train_set
        + train
        + eval
        + vis

将下载的数据集cityscapes文件移动至 model-master/research/deeplab/datasets/并解压

unzip cityscapes.zip -d model-master/research/deeplab/datasets/

解压gtFine文件,并下载数据集相关脚本

cd model-master/research/deeplab/datasets/cityscapes && \
unzip gtFine.zip
#git clone https://github.com/mcordts/cityscapesScripts
python -m pip install cityscapesscripts

exp文件夹及子文件夹后边运行时会自动创建,我们不需要手动创建

3 转换数据集格式

接下来将cityscapes的json数据转化为tfrecord格式,用来训练,首先创建文件夹

mkdir ~/models-master/research/deeplab/datasets/cityscapes/tfrecord

然后执行格式转换脚本

cd models-master/research/deeplab/datasets/
chmod +x convert_cityscapes.sh
bash ./convert_cityscapes.sh

4 开始训练

首先在model zoo中下载deeplab预训练模型,模型细节如下,我们使用xception65_cityscapes_trainfine来进行训练

Tensorflow之deeplab训练cityscapes数据集_第1张图片

下载好之后解压到deeplab/model路径下

mkdir ~/models-master/research/deeplab/model
tar zxvf deeplabv3_cityscapes_train_2018_02_06.tar.gz ~/models-master/research/deeplab/model

训练方法

python deeplab/train.py --logtostderr --training_number_of_steps=50000 --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,513" --train_batch_size=1 --dataset="cityscapes" --tf_initial_checkpoint="deeplab/model/deeplabv3_cityscapes_train/model.ckpt" --train_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/train" --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

其中:

  • training_number_of_steps:迭代次数
  • train_crop_size:图片裁剪大小,默认 513,最小 321,设置原则为(val - 1)/ 4为整数
  • fine_tune_batch_norm=false:是否使用 batch_norm,官方建议,如果训练的 batch_size 大于8的话,须将该参数设置为True
  • tf_initial_checkpoint:预训练的初始 checkpoint,即预训练模型中的 model.ckpt
  • train_logdir:保存训练权重的目录
  • dataset_dir:使用转换后的 tfrecord 数据集目录

5 验证方法

5.1 eval.py

可以使用deeplab/eval.py来监控训练的过程,具体指令如下,作用原理可参考《Tensorflow之eval.py使用方法》

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="1025,2049" --dataset="cityscapes"  --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train" --eval_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/eval"  -dataset_dir="deeplab/datasets/cityscapes/tfrecord"

运行时输出如下(时间比较久)

INFO:tensorflow:Restoring parameters from deeplab/datasets/cityscapes/exp/train_on_train_set/train/model.ckpt-1403
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Starting evaluation at 2020-05-08-12:21:59
INFO:tensorflow:Waiting for new checkpoint at deeplab/datasets/cityscapes/exp/train_on_train_set/train

同时可结合tensorboard来实时监测训练情况

tensorboard --logdir='deeplab/datasets/cityscapes/exp/train_on_train_set/eval'

5.2 vis.py

运行deeplab/vis.py可以保存分割结果图片

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="1025,2049" --dataset="cityscapes" --colormap_type="cityscapes" --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train" --vis_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/vis" --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

5.3 模型转换

python deeplab/export_model.py --logtostderr --checkpoint_path="deeplab/datasets/cityscapes/exp/train_on_train_set/train/model.ckpt-50000" --export_path="deeplab/datasets/cityscapes/exp/train_on_train_set/train/frozen_inference_graph.pb" --model_variant="xception_65" --atrous_rates=6  --atrous_rates=12 --atrous_rates=18 --output_stride=16 --decoder_output_stride=4 --num_classes=19 --crop_size=1025 --crop_size=2049 --inference_scales=1.0

注意crop_size的写法,我写成"1025,2049"时报错如下

absl.flags._exceptions.IllegalFlagValueError: flag --crop_size=1025,2049: invalid literal for int() with base 10: '1025,2049'

因此写成上边的写法,然后继续转化又报错如下,这个错一般是由输入图片大小设置不对引起的

InvalidArgumentError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a mismatch between the current graph and the graph from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint. Original error:

Assign requires shapes of both tensors to match. lhs shape= [1,1,1024,256] rhs shape= [1,1,1280,256]
         [[node save/Assign_29 (defined at deeplab/export_model.py:165)  = Assign[T=DT_FLOAT, _class=["loc:@concat_projection/weights"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](concat_projection/weights, save/RestoreV2/_59)]]
         [[{ {node save/RestoreV2/_110}} = _Send[T=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_115_save/RestoreV2", _device="/job:localhost/replica:0/task:0/device:CPU:0"](save/RestoreV2:55)]]

你可能感兴趣的:(TensorFlow)