环境:ubuntu 16.04 + TensorFlow 1.6.1 + cuda 9.0 + cudnn 7.0 +python2.7 

tensorflow 项目链接 https://github.com/tensorflow/models.git
下载后解压,所需要的工程在 models / research / deeplab / 目录下

1. 测试本地环境

首先添加slim路径,每次打开terminal都要加载路径

    
    
  1. # From tensorflow/models/research/
  2. 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

   
   
  1. python build_voc2012_data.py \
  2. --image_folder="保存images的路径" \
  3. --semantic_segmentation_folder="保存labels的路径" \
  4. --list_folder="保存train.txt文件的路径" \
  5. --image_format="jpeg(image格式)" \
  6. --output_dir="生成tfrecord格式的数据所要保存的位置"

3. 开始训练

修改 /models/research/deeplab/dataset 下 segmentation_dataset.py

    
    
  1. PASCAL_VOC_SEG_INFORMATION = DatasetDescriptor(
  2. splits_to_sizes={
  3. ‘train’: 1464,
  4. ‘trainval’: 2913,
  5. ‘val’: 1449,
  6. },
  7. num_classes= 21,
  8. ignore_label= 255,
  9. )
我是在Pascal_voc上修改的,改成自己的数据集大小以及输出label的类别数,num_classes已经包含了背景

修改 /models/research/deeplab/下train.py

    
    
  1. # Set to False if one does not want to re-use the trained classifier weights.
  2. flags.DEFINE_boolean( ‘initialize_last_layer’, True,
  3. ‘Initialize the last layer.’)
把 True 改成 False ,重新训练最后一层。
开始训练:

   
   
  1. python train.py \
  2. --logtostderr \
  3. --train_split="trainval" \ 可以选择train/val/trainval 不同的数据集
  4. --model_variant="xception_65" \
  5. --atrous_rates=6 \
  6. --atrous_rates=12 \
  7. --atrous_rates=18 \
  8. --output_stride=16 \
  9. --decoder_output_stride=4 \
  10. --train_crop_size=512 \
  11. --train_crop_size=512 \
  12. --train_batch_size=12 \
  13. --training_number_of_steps=30000 \
  14. --fine_tune_batch_norm=True \
  15. --tf_initial_checkpoint="加载与训练模型/model.ckpt" \
  16. --train_logdir="保存训练的中间结果" \
  17. --dataset_dir="生成的tfrecord的路径"

参数设置注意事项:
1.

   
   
  1. # When fine_tune_batch_norm=True, use at least batch size larger than 12
  2. # (batch size more than 16 is better). Otherwise, one could use smaller batch
  3. # size and set fine_tune_batch_norm=False.
2.

   
   
  1. # For `xception_65`, use atrous_rates = [12, 24, 36] if output_stride = 8, or
  2. # rates = [6, 12, 18] if output_stride = 16. Note one could use different
  3. # atrous_rates/output_stride during training/evaluation.

4. eval


   
   
  1. python "${WORK_DIR}"/eval.py \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --logtostderr \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --eval_split="val" \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --model_variant="xception_65" \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --atrous_rates=6 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --atrous_rates=12 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --atrous_rates=18 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --output_stride=16 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --decoder_output_stride=4 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --eval_crop_size=512 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --eval_crop_size=512 \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --checkpoint_dir="${TRAIN_LOGDIR}" \
  2. --eval_logdir="${EVAL_LOGDIR}" \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --dataset_dir="${DATASET}"

输出mean iou 

5. 输出预测结果


   
   
  1. python vis.py \
  2. --logtostderr \
  3. --vis_split="val" \
  4. --model_variant="xception_65" \
  5. --atrous_rates=6 \
  6. --atrous_rates=12 \
  7. --atrous_rates=18 \
  8. --output_stride=16 \
  9. --decoder_output_stride=4 \
  10. --vis_crop_size=513 \
  11. --vis_crop_size=513 \
  12. --checkpoint_dir="${TRAIN_LOGDIR}" \&amp;lt;/div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --vis_logdir="${VIS_LOGDIR}" \
  13. --dataset_dir="${DATASET}"
输出图片的预测结果到 vis_logdir中



Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐