RetinaNet 遷移學習到自標數據集


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.h5snapshot/
數據准備完成且確認無誤后就可以開始訓練了。
此次訓練起點是預訓練過的 resnet50_coco_best_v2.1.0.h5steps=6000epochs=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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM