UPDATE:如果想對自己滴資料進行訓練,參見這一篇《(超詳細很完整)tensorflow下利用deeplabv3+對自己的資料進行訓練》,不過得先完成本文滴配置~
最近在做語義分割,于是實作
deeplabv3+
?
我的環境:
ubuntu 16.04
anaconda3
tensorflow-gpu 1.11.0
文章目錄
- clone models檔案
- 測試model_test.py
- Cityscapes Dataset準備
- 生成資料集的tfrecord
- 訓練模型
- 驗證模型效果
- 檢視分割結果
- ==**DONE ;)**==
clone models檔案
首先clone官方提供的
tensorflow/models
檔案。
git clone https://github.com/tensorflow/models.git
如果嫌棄下載下傳慢,可以參看我的另外一篇blog,介紹了如何實作下載下傳速度質的飛躍。
對于這裡選擇clone不同branch可能會導緻的問題,參見Issue #6567。問題焦點在于
master
branch可能會出現
Eval.py
不出結果,切換
r1.12.0
branch可能有用。
測試model_test.py
測試一下環境配置是否成功。
添加依賴庫到PYTHONPATH,在目錄
/home/user/models/research/
下:
# From /home/user/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
source ~/.bashrc
調用
model_test.py
測試:
# From /home/user/models/research/
python deeplab/model_test.py
Cityscapes Dataset準備
實作過程使用
Cityscapes Dataset
作為資料集。
從www.cityscapes-dataset.com上下載下傳
Cityscapes Dataset
——資料集
leftImg8bit_trainvaltest.zip (11GB)
和對應的标注集
gtFine_trainvaltest.zip (241MB)
。下載下傳完成後解壓到目錄
/home/user/data/cityscapesScripts/
(路徑可自己選擇)。
之後在
/home/user/data/cityscapesScripts/
下clone
Cityscapes Dataset
的腳本代碼:
git clone https://github.com/mcordts/cityscapesScripts.git
完成clone之後的目錄結構:
/home/user/data/cityscapesScripts
- cityscapesScripts
- leftImg8bit
- gtFine
- tfrecord
将clone的腳本代碼裡面的
createTrainIdLabelImgs.py
複制一份到目錄
/home/user/data/cityscapesScripts/
下,修改以下代碼為自己的路徑:
生成資料集的tfrecord
将資料集轉換成tensorflow訓練需要的
tfrecord
格式。
在目錄
models/research/deeplab/datasets
中,修改
convert_cityscapes.sh
檔案:
CITYSCAPES_ROOT="/home/user/data/cityscapesScripts"
...
python "${CITYSCAPES_ROOT}/createTrainIdLabelImgs.py"
之後運作
convert_cityscapes.sh
檔案,生成
tfrecord
:
sh convert_cityscapes.sh
生成的
tfrecord
在目錄
/home/user/data/cityscapesScripts/tfrecord
下:
訓練模型
首先下載下傳預訓練權重
xception_cityscapes_trainfine
:http://download.tensorflow.org/models/deeplabv3_cityscapes_train_2018_02_06.tar.gz (更多預訓練權重請參見 https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md )
在目錄
models/research/deeplab//backbone/deeplabv3_cityscapes_train
下解壓預訓練權重。
然後編輯訓練指令:
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=1000 \
--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=2 \
--dataset="cityscapes" \
--tf_initial_checkpoint='/home/user/models/research/deeplab/backbone/deeplabv3_cityscapes_train/model.ckpt' \
--train_logdir='/home/user/models/research/deeplab/exp/train_on_train_set/train' \
--dataset_dir='/home/user/data/cityscapesScripts/tfrecord'
在目錄
/home/user/models/research
下運作以上指令。
note:在這一步有小夥伴 @methy010 提出
“list index out of range”
的報錯解決方案:
關于“list index out of range”的問題及解答:在python deeplab/train.py 下面參數設定中,train_crop_size 那一句應改為:–train_crop_size=“769,769”, 或者按部落客的寫法應改為–train_crop_size[0]=513, --train_crop_size[1]=513, 就不會出現list index out of range的問題了。第一種是按照github上README改的,親測有效,第二種我沒有自己run,隻是推測部落客漏寫了[0][1]. 我是按照部落客的教程一步步運作,發現問題并解決了的,在此提出希望可以幫助到别人。最後感謝部落客這篇超詳細的教程~比心
我當時的版本是沒有這個問題的,是以可能就是我這篇文章開頭說的不同 branch 的影響,後面的小夥伴如果因為各種因素而出現這個問題,可以參照這種解決方案嘗試一下~
Finished training:
INFO:tensorflow:global step 970: loss = 0.4412 (0.504 sec/step)
INFO:tensorflow:global step 980: loss = 0.4016 (0.464 sec/step)
INFO:tensorflow:global step 990: loss = 0.6123 (0.520 sec/step)
INFO:tensorflow:global step 1000: loss = 0.3552 (0.492 sec/step)
INFO:tensorflow:Stopping Training.
INFO:tensorflow:Finished training! Saving model to disk.
驗證模型效果
編輯驗證指令:
python deeplab/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=1025 \
--eval_crop_size=2049 \
--dataset="cityscapes" \
--checkpoint_dir='/home/user/models/research/deeplab/exp/train_on_train_set/train' \
--eval_logdir='/home/user/models/research/deeplab/exp/train_on_train_set/eval' \
--dataset_dir='/home/user/data/cityscapesScripts/tfrecord'
在目錄
/home/user/models/research
下運作以上指令。
Finished evaluation:
INFO:tensorflow:Starting evaluation at 1995-04-01-08:49:56
INFO:tensorflow:Evaluation [50/500]
INFO:tensorflow:Evaluation [100/500]
INFO:tensorflow:Evaluation [150/500]
INFO:tensorflow:Evaluation [200/500]
INFO:tensorflow:Evaluation [250/500]
INFO:tensorflow:Evaluation [300/500]
INFO:tensorflow:Evaluation [350/500]
INFO:tensorflow:Evaluation [400/500]
INFO:tensorflow:Evaluation [450/500]
INFO:tensorflow:Evaluation [500/500]
INFO:tensorflow:Finished evaluation at 2019-04-01-08:52:12
miou_1.0[0.725369751]
如果之後顯示
INFO:tensorflow:Waiting for new checkpoint at /home/user/models/research/deeplab/exp/train_on_train_set/train
則直接跳出不用理睬。
檢視分割結果
編輯可視化指令:
python deeplab/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=1025 \
--vis_crop_size=2049 \
--dataset="cityscapes" \
--colormap_type="cityscapes" \
--checkpoint_dir='/home/user/models/research/deeplab/exp/train_on_train_set/train' \
--vis_logdir='/home/user/models/research/deeplab/exp/train_on_train_set/vis' \
--dataset_dir='/home/user/data/cityscapesScripts/tfrecord'
在目錄
/home/user/models/research
下運作以上指令。
開始可視化:
INFO:tensorflow:Restoring parameters from /home/user/models/research/deeplab/exp/train_on_train_set/train/model.ckpt-1000
INFO:tensorflow:Visualizing batch 1 / 500
INFO:tensorflow:Visualizing batch 2 / 500
INFO:tensorflow:Visualizing batch 3 / 500
INFO:tensorflow:Visualizing batch 4 / 500
...
輸出的對比結果: