Keras-RetinaNet
在自標數據集 alidq
上訓練 detection model RetinaNet
模型部署與環境配置
參考README
數據預處理
數據統計信息:
- 類別:gun1, gun2
- 有效數據量:23216
- 測試集大小:1000
- 訓練驗證集大小:22216
由於此次 detection 任務比較簡單,為了實驗 fine tuning 對模型的影響,我們將訓練數據分為 3 個部分,實驗在第 1 部分數據上完成。
Part 1 訓練數據統計量:
- gun1 數量:2826
- gun2 數量:3170
- 預處理需要將標注數據文件格式轉換為固定格式的
csv
文件,schema 為:
path/to/imagefile,xmin,ymin,xmax,ymax,classname
- 我們標注的 Raw data 中包含的信息量是足夠的,但需要一些針對模型的數據格式調整;
- 除了 Bounding Box 的坐標和類別名,我們還需要定義類別名到類別ID 映射(class name to class ID mapping),ID 從 0 開始。在這次的例子里很簡單,在數據集目錄新建一個 csv 文件,其內容為:
gun1,0
gun2,1
- 需要提出的一點是:如果沒有特殊要求,我們交付的數據中,Bounding Box 的坐標最好按照普遍通用的順序處理好,即
xmin,ymin,xmax,ymax
; - 預處理完成后,可以使用
keras-retinanet
中的調試工具debug.py
檢查 csv 是否有效且觀察標注框在圖中的效果:
$ python keras-retinanet/bin/debug.py csv
/path/to/annotations /path/to/class_label_mapping
或
$ retinanet-debug csv /path/to/annotations /path/to/class_label_mapping
注:無效標注的框呈紅色,有效標注為綠色。
訓練
下載在 coco 數據集上訓練好的模型 resnet50_coco_best_v2.1.0.h5 到snapshot/
數據准備完成且確認無誤后就可以開始訓練了。
此次訓練起點是預訓練過的 resnet50_coco_best_v2.1.0.h5
,steps=6000
,epochs=5
,在 K80 顯卡訓練的時間大概是 5-6 小時。
$ python keras-retinanet/bin/train.py --weights snapshots/resnet50_coco_best_v2.1.0.h5 --steps 6000 --epochs 5 --gpu 0 csv /path/to/annotations /path/to/class_label_mapping
$ retinanet-train --weights snapshots/resnet50_coco_best_v2.1.0.h5 --steps 6000 --epochs 5 --gpu 0 csv /path/to/annotations /path/to/class_label_mapping
評價
訓練完成后,我們需要用 1000 條測試數據對模型的 performance 做出評價。我在准備評價數據時,發現標注數據(我們標注的 Ground Truth)存在大約 5% 的錯誤分類。這些錯誤分類是我通過人工辨識 model 預測的結果與 GT 的差別而得到的。也就是說,剛剛訓練好的 model 幫助我找到了很多標注數據的錯誤標注!
雖然這些錯誤標注在訓練的時候不會產生太大影響(否則也不會幫我找錯),但在做評價時會嚴重影響模型的 performance。可能需要借助剛訓練好的 model 對 1000 個測試數據做清洗。
Written with StackEdit.