【代码实现】Searching for Efficient Multi-Scale Architectures for Dense Image Prediction

相关资料

代码地址:https://github.com/tensorflow/models/tree/master/research/deeplab
论文地址:https://arxiv.org/abs/1809.04184
个人笔记:https://blog.csdn.net/mooneve/article/details/83144385
官方教程:
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/installation.md
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/cityscapes.md

参考资料

https://blog.csdn.net/cs_hnu_scw/article/details/79695347
https://blog.csdn.net/u011974639/article/details/80574306
https://blog.csdn.net/u011974639/article/details/80948990


环境要求

Ubuntu16.04
CUDA 9.0(若使用8.0,则tensorflow版本最高为1.4)
Python 3.6:

  • Numpy
  • Pillow 1.0
  • tf Slim (which is included in the “tensorflow/models/research/” checkout)
  • Jupyter notebook
  • Matplotlib
  • Tensorflow

安装Anaconda和tensorflow

下载地址:https://repo.anaconda.com/archive/
选择64位linux版 python下载,安装即可。可参考 https://blog.csdn.net/cs_hnu_scw/article/details/79695347
(在这里我创建的python虚拟环境名为deeplab)
在这里插入图片描述


配置代码环境

任意目录下打开Terminal,输入以下命令,将代码克隆到本地,获得models文件夹。

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

在这里插入图片描述
在命令行中,输入:

source activate deeplab

切换到tensorflow python虚拟环境中,输入:

sudo gedit ~/.bashrc

打开编辑~/.bashrc,在文件末尾将models/research/slim添加到PYTHONPATH中,避免以后每次打开Terminal都要手动输入,添加内容为:

export PYTHONPATH=/home/lab/ygy/models/research/slim:$PYTHONPATH

/home/lab/ygy为存放models文件夹的目录。
在这里插入图片描述
完成后,命令行进入/models/research目录,在目录下输入:

python deeplab/model_test.py

运行model_test.py测试,结果报错:
在这里插入图片描述
原因:当前版本中model_test.py存在一处错误,代码第140行,scales_to_model_results.keys()的类型为dict_keys,需要将其转为list类型,故修改如下:

self.assertListEqual(list(scales_to_model_results.keys()),
                               expected_endpoints)

修改完成后即可运行通过。
在这里插入图片描述


Cityscapes数据集

下载

https://www.cityscapes-dataset.com/ 上下载数据集。由于直接分享违法,故需要注册账号(最好用带edu的邮箱注册)。
下载数据集leftImg8bit_trainvaltest.zip (11GB)和对应的标注集gtFine_trainvaltest.zip (241MB)。
将两个压缩包解压至:/ygy/models/research/deeplab/datasets/cityscapes。
解压完毕后,在cityscapes目录下运行命令:

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

将操作Cityscapes数据集标签的代码克隆到本地。接着在cityscapes下创建tfrecord, exp等目录。train_on_train_set 目录存储 train/eval/vis 的过程和结果。(后面为了分别测试trainfine和trainval模型,文件名做了相应修改)
此时cityscapes下的目录结构为:

+ /ygy/models/research/deeplab/datasets/cityscapes
  + cityscapesscripts
  + leftImg8bit
  + gtFine
  + tfrecord
  + exp
    + train_on_train_set
      + train_fine
      + train_val
      + eval_fine
      + eval_val
      + vis_fine
      + vis_val

修改代码生成Cityscapes的TFRecord

进入/ygy/models/research/deeplab/datasets/cityscapes/cityscapesscripts/preparation文件夹
修改createTrainIdLabelImgs.py代码第42行,将其指定为cityscapes数据集的位置:

cityscapesPath = '/home/lab/ygy/models/research/deeplab/datasets/cityscapes'

然后即可在/models/research/deeplab/datasets目录下运行convert_cityscapes.sh,生成TFRecord。如下图:

sh convert_cityscapes.sh

在这里插入图片描述
生成的TFRecord保存在cityscapes/tfrecord文件夹中
在这里插入图片描述


在CityScapes下训练

下载预训练模型

model_zoo上下载github上官方给出的预训练模型 ,目前在CityScapes下有两种模型可供选择:xception71_dpc_cityscapes_trainfine(445 M)和xception71_dpc_cityscapes_trainval(446 M)。将两个模型下载后,解压放到deeplab/backbone目录下(该目录自己手动创建)。
在这里插入图片描述

1.模型训练

官方给出的训练样例为:

# From tensorflow/models/research/
python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=90000 \ 训练迭代次数,初次实验时刻设置为500,1000等,验证是否正确
    --train_split="train" \
    --model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
    --atrous_rates=6 \  见下方注意1
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \ 见下方注意2
    --train_crop_size=769 \ 训练图片的裁剪大小,代码中默认为513,最小不低于312
    --train_crop_size=769 \
    --train_batch_size=1 \如要复现论文中的效果则至少为8(注意显卡显存是否足够),同时设置fine_tune_batch_norm = True
    --dataset="cityscapes" \ 使用的数据集名称
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" 运行DCP时需要添加此项
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \  预训练模型路径
    --train_logdir=${PATH_TO_TRAIN_DIR} \ 训练日志存放目录
    --dataset_dir=${PATH_TO_DATASET}  TFRecord目录

注意1
xception71_dpc_cityscapes_trainfine的output_stride为16
xception71_dpc_cityscapes_trainval 的output_stride为8,所以使用后者作为预训练模型时,则atrous_rates 需要从 [6, 12, 18] 变为 [12, 24, 36]。
注意2
如果不想使用decoder结构,可以去掉命令中的decoder_output_stride。
注意3
当batch_size 小于12时,应将fine_tune_batch_norm设为false,故在训练时还需要带上这个变量。

xception71_dpc_cityscapes_trainfine调用命令

我的机器显卡为1080ti ,batch_size只能设为1 ┓( ´∀` )┏,或者你可以选择把图片裁剪到更小,比如设为默认的513

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=1000 \
    --train_split="train" \
    --model_variant="xception_71" \
    --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 \
    --fine_tune_batch_norm=False \ 
    --dataset="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \ 
    --tf_initial_checkpoint="deeplab/backbone/train_fine/model.ckpt"\ 
    --train_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

训练过程如下图:
在这里插入图片描述

xception71_dpc_cityscapes_trainval调用命令

这个模型batch_size直接设为1,1080Ti显存不足,所以我把图片也裁剪到513后运行通过。

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=1000 \
    --train_split="train" \
    --model_variant="xception_71" \
    --atrous_rates=12 \
    --atrous_rates=24 \
    --atrous_rates=36 \
    --output_stride=8 \
    --decoder_output_stride=4 \
    --train_crop_size=513 \
    --train_crop_size=513 \
    --train_batch_size=1 \
    --fine_tune_batch_norm=False \ 
    --dataset="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \ 
    --tf_initial_checkpoint="deeplab/backbone/trainval_fine/model.ckpt" \ 
    --train_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

2.模型评估

官方给出的评估样例为:

# From tensorflow/models/research/
python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
    --atrous_rates=6 \  设置同上,使用tarinval时,需要修改为[12,24,36,8]
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=1025 \  测试图片时,图片裁剪可以大一些
    --eval_crop_size=2049 \
    --dataset="cityscapes" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \ 训练模型存放的目录
    --eval_logdir=${PATH_TO_EVAL_DIR} \ 保存验证结果的目录
    --dataset_dir=${PATH_TO_DATASET}  TFRecord目录

一开始我评估和可视化的时候都报错了,提示Key aspp0/BatchNorm/beta not found in checkpoint,后来向作者提问之后才知道 --dense_prediction_cell_json=“deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json”
也是需要加上的……只能怪自己阅读理解能力不好o(╥﹏╥)o https://github.com/tensorflow/models/issues/5630

xception71_dpc_cityscapes_trainfine调用命令

python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_71" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=1025 \
    --eval_crop_size=2049 \
    --dataset="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
    --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
    --eval_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/eval_fine" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

在这里插入图片描述
注意eval.py 和vis.py在评估完毕后,并不会主动停止,它们会一直等待新的checkpoint,所以需要我们手动按ctrl+c把程序停止。

xception71_dpc_cityscapes_trainval调用命令

可能由于我训练的时候设置的crop size是513,所以mIOU比官方低一些。

python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_71" \
    --atrous_rates=12 \
    --atrous_rates=24 \
    --atrous_rates=36 \
    --output_stride=8 \
    --decoder_output_stride=4 \
    --eval_crop_size=1025 \
    --eval_crop_size=2049 \
    --dataset="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
    --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
    --eval_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/eval_val" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord"

在这里插入图片描述

3.分割可视化

官方给出的评估样例为:

# From tensorflow/models/research/
python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_65" \ 选择使用的模型,这里我们需要改为xception_71
    --atrous_rates=6 \ 设置同上,使用tarinval时,需要修改为[12,24,36,8]
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=1025 \ 测试图片时,图片裁剪可以大一些
    --vis_crop_size=2049 \
    --dataset="cityscapes" \
    --colormap_type="cityscapes" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \ 训练模型存放的目录
    --vis_logdir=${PATH_TO_VIS_DIR} \ 保存分割结果的目录
    --dataset_dir=${PATH_TO_DATASET} TFRecord目录
    --also_save_raw_predictions=True  是否保存原始的预测图

注意:如果想保存分割结果用于evaluation server,可设置also_save_raw_predictions=True

xception71_dpc_cityscapes_trainfine调用命令

python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_71" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=1025 \
    --vis_crop_size=2049 \
    --dataset="cityscapes" \
    --colormap_type="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
    --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_fine" \
    --vis_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/vis_fine" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord" \ 
    --also_save_raw_predictions=True

在这里插入图片描述
部分分割结果图:
在这里插入图片描述
在这里插入图片描述

xception71_dpc_cityscapes_trainval调用命令

python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_71" \
    --atrous_rates=12 \
    --atrous_rates=24 \
    --atrous_rates=36 \
    --output_stride=8 \
    --decoder_output_stride=4 \
    --vis_crop_size=1025 \
    --vis_crop_size=2049 \
    --dataset="cityscapes" \
    --colormap_type="cityscapes" \
    --dense_prediction_cell_json="deeplab/core/dense_prediction_cell_branch5_top1_cityscapes.json" \
    --checkpoint_dir="deeplab/datasets/cityscapes/exp/train_on_train_set/train_val" \
    --vis_logdir="deeplab/datasets/cityscapes/exp/train_on_train_set/vis_val" \
    --dataset_dir="deeplab/datasets/cityscapes/tfrecord" \ 
    --also_save_raw_predictions=True

在这里插入图片描述
部分分割结果图:
在这里插入图片描述
在这里插入图片描述

按照官方的说法,trainval的mIOU比trainfine高,而我这里测试效果相反,应该是因为trainval我训练时裁剪得更小导致的。啊啊啊啊,想要显存更大的显卡!w(゚Д゚)w

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值