小熊飛槳練習冊-08PaddleX底特律街景
簡介
小熊飛槳練習冊-08PaddleX底特律街景,是學習影像分割小專案,本專案開發和測試均在 Ubuntu 20.04 系統下進行。
專案最新程式碼檢視主頁:小熊飛槳練習冊
百度飛槳 AI Studio 主頁:小熊飛槳練習冊-08PaddleX底特律街景
Ubuntu 系統安裝 CUDA 參考:Ubuntu 百度飛槳和 CUDA 的安裝
- 鋸齒狼牙的預測結果,模型:BiSeNetV2
檔案說明
檔案 | 說明 |
---|---|
train.py | 訓練程式 |
prune.py | 裁剪程式 |
quant.py | 量化程式 |
infer.py | 預測程式 |
onekey.sh | 一鍵獲取資料到 dataset 目錄下 |
onetasks.sh | 一鍵訓練,量化指令碼 |
get_data.sh | 獲取資料到 dataset 目錄下 |
check_data.sh | 檢查 dataset 目錄下的資料是否存在 |
mod/args.py | 命令列引數解析 |
mod/pdxconfig.py | PaddleX 配置 |
mod/config.py | 配置 |
mod/utils.py | 雜項 |
mod/report.py | 結果報表 |
dataset | 資料集目錄 |
doc | 文件目錄 |
output | 訓練引數儲存目錄 |
result | 預測結果儲存目錄 |
環境依賴
資料集
資料集來源於自己收集標註的百度飛槳公共資料集:鋸齒狼牙的底特律街景
資料集包含訓練集,驗證集,測試集,包含 MASK 掩膜 和 COCO 格式資料集,適用影像分割,語義分割,例項分割學習。
如何自己標註資料
- 使用標註工具:EISeg
- 中文介面,支援 MASK 掩膜 和 COCO 格式
一鍵獲取資料
- 執行指令碼,包含以下步驟:獲取資料,生成影像路徑和標籤的文字檔案,檢查資料。
- 詳情檢視 onekey.sh
如果執行在本地計算機,下載完資料,檔案放到 dataset 目錄下,在專案目錄下執行下面指令碼。
如果執行在百度 AI Studio 環境,檢視 data 目錄是否有資料,在專案目錄下執行下面指令碼。
bash onekey.sh
配置模組
可以檢視修改 mod/pdxconfig.py 檔案,有詳細的說明
開始訓練
執行 train.py 檔案,檢視命令列引數加 -h
- 示例
python3 run/train.py \
--dataset ./dataset/detroit_streetscape \
--epochs 32 \
--batch_size 1 \
--learning_rate 0.01 \
--model BiSeNetV2 \
--pretrain_weights "CITYSCAPES"
- 引數
-h, --help show this help message and exit
--cpu 是否使用 cpu 計算,預設使用 CUDA
--num_workers 執行緒數量,預設 auto,為CPU核數的一半
--epochs 訓練幾輪,預設 4 輪
--batch_size 一批次數量,預設 16
--learning_rate 學習率,預設 0.025
--early_stop 是否使用提前終止訓練策略。預設為 False
--early_stop_patience
當使用提前終止訓練策略時,如果驗證集精度在early_stop_patience 個 epoch
內連續下降或持平,則終止訓練。預設為 5
--save_interval_epochs
模型儲存間隔(單位: 迭代輪數)。預設為 1
--log_interval_steps
訓練日誌輸出間隔(單位:迭代次數)。預設為 10
--resume_checkpoint 恢復訓練時指定上次訓練儲存的模型路徑, 預設不會恢復訓練
--save_dir 模型儲存路徑。預設為 ./output/
--dataset 資料集目錄,預設 ./dataset/
--train_list 訓練集列表,預設 '--dataset' 引數目錄下的 train_list.txt
--eval_list 評估集列表,預設 '--dataset' 引數目錄下的 val_list.txt
--label_list 分類標籤列表,預設 '--dataset' 引數目錄下的 labels.txt
--lr_decay_power 預設優化器學習率衰減指數。預設為 0.9
--use_mixed_loss 是否使用混合損失函式。如果為True,混合使用CrossEntropyLoss和LovaszSoftmaxLoss,權重分別為0
.8和0.2。如果為False,則僅使用CrossEntropyLoss。也可以以列表的形式自定義混合損失函式,列表的每一個元素
為(損失函式型別,權重)元組,損失函式型別取值範圍為['CrossEntropyLoss', 'DiceLoss',
'LovaszSoftmaxLoss']。預設為False。
--align_corners 是網路中對特徵圖進行插值時是否將四個角落畫素的中心對齊。若特徵圖尺寸為偶數,建議設為True。若特徵圖尺寸為奇數,建議設為Fal
se。預設為False。
--backbone 影像分割模型 DeepLabV3P 的 backbone 網路,取值範圍為['ResNet50_vd',
'ResNet101_vd'],預設為'ResNet50_vd'。
--hrnet_width 影像分割模型 HRNet 的 width 網路,高解析度分支中特徵層的通道數量。預設為48。可選擇取值為[18, 48]。
--pretrain_weights 若指定為'.pdparams'檔案時,則從檔案載入模型權重;若為字串'CITYSCAPES',則自動下載在CITYSCAPES
圖片資料上預訓練的模型權重;若為字串'PascalVOC',則自動下載在PascalVOC圖片資料上預訓練的模型權重;若為字元
串'IMAGENET',則自動下載在ImageNet圖片資料上預訓練的模型權重;若為None,則不使用預訓練模型。預設為'CIT
YSCAPES'。
--model PaddleX 模型名稱
--model_list 輸出 PaddleX 模型名稱,預設不輸出,選擇後只輸出資訊,不會開啟訓練
檢視支援的模型
- 執行命令
python3 run/train.py --model_list
- 結果
PaddleX 影像分割模型
['DeepLabV3P', 'BiSeNetV2', 'UNet', 'HRNet', 'FastSCNN']
DeepLabV3P backbone 網路
['ResNet50_vd', 'ResNet101_vd']
模型裁剪
- 執行 prune.py 檔案,檢視命令列引數加 -h。
- 注意:有的模型不支援裁剪。
- 裁剪後的精度大部分會降低。
- 參考文件:模型裁剪
- 示例
python3 run/prune.py \
--dataset ./dataset/detroit_streetscape \
--epochs 16 \
--batch_size 1 \
--learning_rate 0.001 \
--model_dir ./output/best_model \
--save_dir ./output/prune \
--pruned_flops 0.2
- 引數
-h, --help show this help message and exit
--cpu 是否使用 cpu 計算,預設使用 CUDA
--num_workers 執行緒數量,預設 auto,為CPU核數的一半
--epochs 訓練幾輪,預設 4 輪
--batch_size 一批次數量,預設 16
--learning_rate 學習率,預設 0.025
--early_stop 是否使用提前終止訓練策略。預設為 False
--early_stop_patience
當使用提前終止訓練策略時,如果驗證集精度在early_stop_patience 個 epoch 內連續下降或持平,則終止訓練。預設為 5
--save_interval_epochs
模型儲存間隔(單位: 迭代輪數)。預設為 1
--log_interval_steps
訓練日誌輸出間隔(單位:迭代次數)。預設為 10
--resume_checkpoint 恢復訓練時指定上次訓練儲存的模型路徑, 預設不會恢復訓練
--save_dir 模型儲存路徑。預設為 ./output/
--dataset 資料集目錄,預設 ./dataset/
--train_list 訓練集列表,預設 '--dataset' 引數目錄下的 train_list.txt
--eval_list 評估集列表,預設 '--dataset' 引數目錄下的 val_list.txt
--label_list 分類標籤列表,預設 '--dataset' 引數目錄下的 labels.txt
--lr_decay_power 預設優化器學習率衰減指數。預設為 0.9
--model_dir 模型讀取路徑。預設為 ./output/best_model
--skip_analyze 是否跳過分析模型各層引數在不同的裁剪比例下的敏感度,預設不跳過
--pruned_flops 根據選擇的 FLOPS 減小比例對模型進行裁剪。預設為 0.2
模型量化
- 執行 quant.py 檔案,檢視命令列引數加 -h
- model_dir 是正常訓練後的模型儲存目錄。
- 參考文件:模型量化
- 示例
python3 run/quant.py \
--dataset ./dataset/detroit_streetscape \
--epochs 16 \
--batch_size 1 \
--learning_rate 0.001 \
--model_dir ./output/best_model \
--save_dir ./output/quant
- 引數
-h, --help show this help message and exit
--cpu 是否使用 cpu 計算,預設使用 CUDA
--num_workers 執行緒數量,預設 auto,為CPU核數的一半
--epochs 訓練幾輪,預設 4 輪
--batch_size 一批次數量,預設 16
--learning_rate 學習率,預設 0.025
--early_stop 是否使用提前終止訓練策略。預設為 False
--early_stop_patience
當使用提前終止訓練策略時,如果驗證集精度在early_stop_patience 個 epoch 內連續下降或持平,則終止訓練。預設為 5
--save_interval_epochs
模型儲存間隔(單位: 迭代輪數)。預設為 1
--log_interval_steps
訓練日誌輸出間隔(單位:迭代次數)。預設為 10
--resume_checkpoint 恢復訓練時指定上次訓練儲存的模型路徑, 預設不會恢復訓練
--save_dir 模型儲存路徑。預設為 ./output/
--dataset 資料集目錄,預設 ./dataset/
--train_list 訓練集列表,預設 '--dataset' 引數目錄下的 train_list.txt
--eval_list 評估集列表,預設 '--dataset' 引數目錄下的 val_list.txt
--label_list 分類標籤列表,預設 '--dataset' 引數目錄下的 labels.txt
--lr_decay_power 預設優化器學習率衰減指數。預設為 0.9
--model_dir 模型讀取路徑。預設為 ./output/best_model
預測模型
- 執行 infer.py 檔案,檢視命令列引數加 -h
- 示例
python3 run/infer.py --model_dir ./output/best_model \
--predict_image ./dataset/detroit_streetscape/0183.jpg
- 引數
-h, --help show this help message and exit
--model_dir 讀取模型的目錄,預設 './output/best_model'
--predict_image 預測的影像檔案
--predict_image_dir 預測的影像目錄
--weight mask視覺化結果與原圖權重因子,weight表示原圖的權重,預設 0.6
--result_dir 預測結果視覺化的儲存目錄,預設 './result'
關於影像寬高
- 由於原始影像是 1920x1080 在訓練前填充為 1920 的正方形影像,然後調整為 1024x1024,參見 seg-train.py
T.Padding(target_size=1920, pad_mode=0, im_padding_value=[0, 0, 0]),
T.Resize(target_size=1024),
關於預測視覺化的結果顏色
- EISeg 顏色通道順序為 RGB,paddlex.seg.visualize 顏色通道順序為 BGR
部署模型匯出
- 影像分割的 --fixed_input_shape 引數無效
- 參考文件:部署模型匯出
- 示例
paddlex --export_inference --model_dir=./output/best_model/ --save_dir=./output/inference_model
VisualDL 視覺化分析工具
- 安裝和使用說明參考:VisualDL
- 如果是 AI Studio 環境訓練的把 output/vdl_log 目錄下載下來,解壓縮後放到本地專案目錄下 output/vdl_log 目錄
- 在專案目錄下執行下面命令
- 然後根據提示的網址,開啟瀏覽器訪問提示的網址即可
visualdl --logdir ./output/vdl_log