一、参考资料:
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、数据集工作目录:
这里是我的本地数据以及数据处理代码存放目录;cityscapesscripts 是下载的数据集处理代码,详细下步; gtfine和leftimagbbit是刚刚下载的数据解压得到;tfrecord是TensorFlow讲数据集转换得到的格式,详细见下下步;
3、克隆cityscapesscripts 的脚本代码:
git clone https://github.com/mcordts/cityscapesScripts.git
根据本地所设地址,对代码进行微调:
修改/home/jerry/dataset/cityscapes/cityscapesscripts/preparation/createTrainIdLabelImgs.py
要保证能够利用该数据生成lable。
修改后如下:
4、生成CityScapes的TFRecords
(1)在上面下载的代码里,我的本地保存目录/home/jerry/Deeplab/research/deeplab/datasets/convert_cityscapes.sh
找到并修改convert_cityscapes.sh文件。将其中的CITYSCAPES_ROOT设置到对应的cityscapes主目录:
(2)运行生成脚本
sh convert_cityscapes.sh
结果保存在tfrecord中,见我们第二步的工作目录。
3、训练
1、下载预训练模型
在model_zoo上下载预训练模型:
tar -zxvf deeplabv3_cityscapes_train_2018_02_06.tar.gz
我的本地保存目录:/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)脚本训练:由于感觉在终端里直接训练,每次修改参数很烦,所以编了个脚本,直接在脚本里修改参数,然后直接运行脚本就可以了。
脚本如下:
(2)部分修改:第一次训练时,用了官方提供的与训练的模型,然后每次训练终端本地会保存刚训练的模型,所以我就想下次我是否可以接着刚刚训练的模型继续训练,看了部分代码,然后尝试修改,终于完成。
很简单,只需要将 tf_initial_checkpoint 这个参数屏蔽掉,程序就会自动检索上次训练保存的模型,接着训练。除了修改调用参数还需要讲train.py修改一点;
,上述我的训练脚本,就是已经修改后的了。
训练结果:
我程序没有全跑完,我估计得到很好的结果,得跑90万次左右3天左右吧。所以就不贴最后的图了。
4、测试与可视化
测试和可视化步骤和上述训练的步骤基本一致,没有什么太大的变化。
贴一下我测试的脚本吧: