环境:ubuntu 16.04 + TensorFlow 1.6.1 + cuda 9.0 + cudnn 7.0 +python2.7
tensorflow 项目链接 https://github.com/tensorflow/models.git
1. 测试本地环境
首先添加slim路径,每次打开terminal都要加载路径
# From tensorflow/models/research/ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
Quick test by running model_test.py:
# From tensorflow/models/research/
python deeplab/model_test.py
Quick running the whole code on the PASCAL VOC 2012 dataset:
# From tensorflow/models/research/deeplab
sh local_test.sh
如果都运行成功,说明本地环境已经可以了,接下来训练自己的数据集。
2. 准备数据
数据包括两部分 images 和labels ,image 为[n*m*3],jpeg 格式,label为[n*m*1],png格式。
还需要一个train.txt文件,其中是所有训练数据的文件名。
接下来运行
/models/research/deeplab/dataset 下的build_voc2012_data.py
python build_voc2012_data.py \ --image_folder="保存images的路径" \ --semantic_segmentation_folder="保存labels的路径" \ --list_folder="保存train.txt文件的路径" \ --image_format="jpeg(image格式)" \ --output_dir="生成tfrecord格式的数据所要保存的位置"
3. 开始训练
修改
/models/research/deeplab/dataset 下 segmentation_dataset.py
PASCAL_VOC_SEG_INFORMATION = DatasetDescriptor( splits_to_sizes={ 'train': 1464, 'trainval': 2913, 'val': 1449, }, num_classes=21, ignore_label=255, )
我是在Pascal_voc上修改的,改成自己的数据集大小以及输出label的类别数,num_classes已经包含了背景
修改 /models/research/deeplab/下train.py
# Set to False if one does not want to re-use the trained classifier weights.
flags.DEFINE_boolean('initialize_last_layer', True,
'Initialize the last layer.')
把 True 改成 False ,重新训练最后一层。
开始训练:
python train.py \ --logtostderr \ --train_split="trainval" \ 可以选择train/val/trainval 不同的数据集 --model_variant="xception_65" \ --atrous_rates=6 \ --atrous_rates=12 \ --atrous_rates=18 \ --output_stride=16 \ --decoder_output_stride=4 \ --train_crop_size=512 \ --train_crop_size=512 \ --train_batch_size=12 \ --training_number_of_steps=30000 \ --fine_tune_batch_norm=True \ --tf_initial_checkpoint="加载与训练模型/model.ckpt" \ --train_logdir="保存训练的中间结果" \ --dataset_dir="生成的tfrecord的路径"
参数设置注意事项:
1.
# When fine_tune_batch_norm=True, use at least batch size larger than 12 # (batch size more than 16 is better). Otherwise, one could use smaller batch # size and set fine_tune_batch_norm=False.2.
# For `xception_65`, use atrous_rates = [12, 24, 36] if output_stride = 8, or # rates = [6, 12, 18] if output_stride = 16. Note one could use different # atrous_rates/output_stride during training/evaluation.
4. eval
python "${WORK_DIR}"/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=512 \ --eval_crop_size=512 \ --checkpoint_dir="${TRAIN_LOGDIR}" \ --eval_logdir="${EVAL_LOGDIR}" \ --dataset_dir="${DATASET}"
输出mean iou
5. 输出预测结果
python 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=513 \ --vis_crop_size=513 \ --checkpoint_dir="${TRAIN_LOGDIR}" \ --vis_logdir="${VIS_LOGDIR}" \ --dataset_dir="${DATASET}"输出图片的预测结果到 vis_logdir中