介紹
DeepLab是谷歌使用tensorflow基於CNN開發的語義分割模型,至今已更新4個版本。最新版本是DeepLabv3+,在此模型中進一步將深度可分離卷積應用到孔空間金字塔池化和解碼器模塊,從而形成更快,更強大的語義分割編碼器-解碼器網絡。本文從官方案例出發,介紹如何訓練以及使用DeepLabv3+模型。
模型安裝
1,下載tensorflow model,然後將解壓後的文件重命名爲”models“並移動到tensorflow文件夾下。
2,添加環境變量
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
3,測試是否安裝成功
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/model_test.py
結果出現如下錯誤:
解決方法如下:
準備數據
下載數據:
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab/datasets/
sh download_and_convert_voc2012.sh
具體執行步驟:
- 下載並解壓VOC2012數據集
- 移除colormap
- 在數據集中創建TFRecord文件
下載預訓練模型
官方提供了多種模型,可以根據自己的實際需求下載安裝。
使用PASCAL VOC2012數據集訓練
文件結構:
tensorflow deeplab文件夾:
訓練:
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
填寫相關路徑,執行訓練
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=30000 \
--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 \
--dataset="pascal_voc_seg" \
--tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
--train_logdir=${PATH_TO_TRAIN_DIR} \
--dataset_dir=${PATH_TO_DATASET}
PATH_TO_INITIAL_CHECKPOINT:初始checkpoint文件路徑(遷移學習)
PATH_TO_TRAIN_DIR:訓練模型保存路徑
PATH_TO_DATASET:數據集路徑
需要注意的問題:
- 當GPU顯存不夠,使用遷移學習方式進行訓練並減少學習率大小,設置”fine_tune_batch_norm=False“
- 當設置”output_stride=8“,”atrous_rates“取值區間應由[6,12,18]改爲[12,24,36]。
- 當不想使用解碼器結構,需要註釋掉”decoder_output_stride“。
驗證
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
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=513 \
--eval_crop_size=513 \
--dataset="pascal_voc_seg" \
--checkpoint_dir=${PATH_TO_CHECKPOINT} \
--eval_logdir=${PATH_TO_EVAL_DIR} \
--dataset_dir=${PATH_TO_DATASET}
PATH_TO_CHECKPOINT:訓練階段checkpoint文件路徑
PATH_TO_EVAL_DIR:評估模型保存路徑
PATH_TO_DATASET:數據集路徑
可視化模型輸出
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
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=513 \
--vis_crop_size=513 \
--dataset="pascal_voc_seg" \
--checkpoint_dir=${PATH_TO_CHECKPOINT} \
--vis_logdir=${PATH_TO_VIS_DIR} \
--dataset_dir=${PATH_TO_DATASET}
PATH_TO_CHECKPOINT:訓練階段checkpoint文件路徑
PATH_TO_VIS_DIR:評估模型保存路徑
PATH_TO_DATASET:數據集路徑
需要注意的問題:
當需要保存分割結果時,需要設置”also_save_raw_predictions = True“
Tensorboard
tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
將同時顯示”train“,”eval“,”vis“結果,如需要單獨顯示一類,可以指定顯示類別,如:
tensorboard --logdir train/
對於voc2012這樣的數據集,Tensorboard顯示數據可能需要幾分鐘的時間。
模型導出
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research
python deeplab/export_model.py \
--logtostderr \
--checkpoint_path="${PATH_TO_CHECKPOINT}" \
--export_path="${PATH_TO_EXPORT_PD}" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--num_classes=21 \
--crop_size=513 \
--crop_size=513 \
--inference_scales=1.0
PATH_TO_CHECKPOINT:checkpoint文件路徑
PATH_TO_EXPORT_PD:導出PD文件路徑(加後綴.pd)
案例
cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab
sh local_test.sh
Google Colab在線測試地址,可選擇預訓練模型,測試分割照片來查看模型輸出結果。
總結
基於深度學習的語義分割與傳統基於隨機森林的方法相比有了很大的進步,雖然目前基於深度學習的方法有多種思路,不過基本都是基於全卷積(FCN)衍變而來。FCN將網絡全連接層使用卷積替代,因此可以接受任意大小的輸入並且針對下采樣存在位置信息丟失等問題,採用轉置卷積用於恢復圖片尺寸,方便後續進行逐像素預測。
DeepLab模型爲了改善分割效果,使用atrous卷積(空洞卷積),ASPP,全連接條件隨機場等技術。