一、参考资料:

1、大神博客:
https://blog.csdn.net/u011974639/article/details/80574306
2、官方代码:
githup

二、准备工作:

环境:

环境: anaconda3 + python3 + tensorflow-gpu1.8
机器:1 块 GTX1070(8G)

git代码:

git clone https://github.com/tensorflow/models
代码一共有400+M,可以自己直接去上面给的官方githup里面下载;

数据集:

1、数据集下载:先从Cityscapes website上下载数据集。这需要注册账号(最好用带edu的邮箱注册).下载数据集 leftImg8bit_trainvaltest.zip (11GB)和对应的标注集 gtFine_trainvaltest.zip (241MB)。
2、数据集工作目录:
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP

这里是我的本地数据以及数据处理代码存放目录;cityscapesscripts 是下载的数据集处理代码,详细下步; gtfine和leftimagbbit是刚刚下载的数据解压得到;tfrecord是TensorFlow讲数据集转换得到的格式,详细见下下步;
3、克隆cityscapesscripts 的脚本代码:

git clone https://github.com/mcordts/cityscapesScripts.git

根据本地所设地址,对代码进行微调:
修改/home/jerry/dataset/cityscapes/cityscapesscripts/preparation/createTrainIdLabelImgs.py要保证能够利用该数据生成lable。
修改后如下:
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP

4、生成CityScapes的TFRecords
(1)在上面下载的代码里,我的本地保存目录/home/jerry/Deeplab/research/deeplab/datasets/convert_cityscapes.sh找到并修改convert_cityscapes.sh文件。将其中的CITYSCAPES_ROOT设置到对应的cityscapes主目录:
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP
(2)运行生成脚本

sh convert_cityscapes.sh

Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP
结果保存在tfrecord中,见我们第二步的工作目录。

3、训练

1、下载预训练模型

model_zoo上下载预训练模型:

我的本地保存目录:/home/jerry/Deeplab/research/deeplab/backbone/deeplabv3_cityscapes_train/model.ckpt.index

2、训练指令:

官方给出的指令格式:

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=90000 \
    --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=769 \
    --train_crop_size=769 \
    --train_batch_size=1 \
    --dataset="cityscapes" \
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
    --train_logdir=${PATH_TO_TRAIN_DIR} \
    --dataset_dir=${PATH_TO_DATASET}

实际训练所用代码:

python "${WORK_DIR}"/train.py \
  --logtostderr \
  --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 \
  --training_number_of_steps=1000000 \
  --fine_tune_batch_norm=False \
  --tf_initial_checkpoint=/home/jerry/Deeplab/research/deeplab/backbone/deeplabv3_cityscapes_train/model.ckpt.index \
  --train_logdir="/home/jerry/Deeplab/research/deeplab/exp/train_on_train_set/train/" \
  --dataset_dir="/home/jerry/dataset/cityscapes/tfrecord"

参数分析:

  • training_number_of_steps: 训练迭代次数,这里只是验证,故设置较小为1000
  • train_crop_size:训练图片的裁剪大小,因为我的GPU只有8G,故我将这个设置为513了
  • train_batch_size: 训练的batchsize,也是因为硬件条件,故保持1
  • fine_tune_batch_norm=False :是否使用batch_norm,官方建议,如果训练的batch_size小于12的话,须将该参数设置为False,这个设置很重要,否则的话训练时会在2000步左右报错
  • tf_initial_checkpoint:预训练的初始checkpoint,这里设置的即是前面下载的/home/jerry/Deeplab/research/deeplab/backbone/deeplabv3_cityscapes_train/model.ckpt.index
  • train_logdir: 保存训练权重的目录,注意在开始的创建工程目录的时候就创建了,这里设置为"/home/jerry/Deeplab/research/deeplab/exp/train_on_train_set/train/" \
  • dataset_dir:数据集的地址,前面创建的TFRecords目录。这里设置为"/home/jerry/dataset/cityscapes/tfrecord"

训练心得补充:
(1)脚本训练:由于感觉在终端里直接训练,每次修改参数很烦,所以编了个脚本,直接在脚本里修改参数,然后直接运行脚本就可以了。
脚本如下:
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP
(2)部分修改:第一次训练时,用了官方提供的与训练的模型,然后每次训练终端本地会保存刚训练的模型,所以我就想下次我是否可以接着刚刚训练的模型继续训练,看了部分代码,然后尝试修改,终于完成。
很简单,只需要将 tf_initial_checkpoint 这个参数屏蔽掉,程序就会自动检索上次训练保存的模型,接着训练。除了修改调用参数还需要讲train.py修改一点;
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP
,上述我的训练脚本,就是已经修改后的了。

训练结果:
我程序没有全跑完,我估计得到很好的结果,得跑90万次左右3天左右吧。所以就不贴最后的图了。

4、测试与可视化

测试和可视化步骤和上述训练的步骤基本一致,没有什么太大的变化。
贴一下我测试的脚本吧:
Tensoflow-代码实战篇--Deeplab-V3+代码复现-LMLPHP

5、希望接下来自己能够好好了解代码吧,这只是吧别人的代码跑一下,至于里面的结构构建还不懂,继续。

10-06 16:37