基於tensorflow的目標檢測fine-tuning(使用自己標註的影象)
目標檢測fine-tuning(男女檢測)
- 資料集
在資料庫中下載了2000張標籤為肖像畫的畫作,選擇1000張作為訓練集和驗證集,1000張作為測試集。
- 資料標註
採用labelImg軟體來標記自己的資料集,選擇存放圖片的資料夾,選擇影象,然後手動框出影象上的物體,並加類別標籤(對於類別標籤我們應該根據畫作首先確定我們需要檢測出來的類別數量,本次實驗標記了男人和女人兩個類別),然後儲存就能夠生成XML格式的標註檔案,點選NEXT IMAGE 進行下一張影象的標註。如下圖所示:在這幅圖中手動標註出來了女人,並生成了對應的XML標註檔案。
- 格式轉換
- 將XML的標註檔案轉換為CSV檔案,並且將標記好的圖片分為訓練集和驗證集。
這個指令碼為wanglirui/TRF_data_get/data_split.py.
- CSV檔案轉換為TFRecord檔案
該專案需要把將圖片和標註轉換為TFRecord格式,這需要編寫一個python的指令碼檔案wanglirui/ TRF_data_get/ csv_to_TFrecord.py。同時也需要一個類別ID與類別名稱的關係檔案,這個關係通常用pbtxt格式檔案儲存,例如新建一個person_map.pbtxt的文字檔案,內容如下:
最後執行格式轉換的指令碼來獲分別得TFRecord格式訓練集和驗證集的資料。
- 選擇預訓練模型
選擇我們需要的預訓練模型並下載,比如之前用的rfcn_resnet101_coco, faster_rcnn_nas_coco, ssd_mobilenet_v1_coco等。然後使用我們自己標註的資料在這個模型上進行fine-tuning。將模型上傳到伺服器。
- 修改訓練配置檔案
例如使用ssd_mobilenet_v1_coco_2018_01_28模型,需要複製object_detection/samples/configs下對應的ssd_mobilenet_v1_coco.config,在複製的配置檔案中修改,改成我們對應的檔案路徑即可:
- fine_tune_checkpoint: "/ 上面第四步下載的預訓練模型路徑/model.ckpt"
- input_path: "/預處理資料生成的tfrecords格式資料的檔案路徑”,分為訓練集和驗證集兩個。
- label_map_path: “/格式轉換過程中使用過的類別與ID對應的pbtxt檔案”
- num_classes: 我們自己的資料集的類別數
同時在這個配置檔案中還可以更改訓練時的batch_size,學習率,epoch數量,資料增強的方式,優化演算法的選擇,評價指標等。
- 重新訓練模型
啟動配置好的虛擬環境
配置一下環境變數
開始訓練,執行object_detection/legacy/train.py這個檔案,需要告訴訓練集的路徑和對應的配置檔案的路徑。
python./legacy/train.py --logtostderr --pipeline_config_path=./mymodel_ssd/ssd_mobilenet_v1_coco.config --train_dir=./training_result/ssd_mobiel_model
在訓練過程中使用驗證集來評估模型的效能,執行object_detection/eval.py這個檔案。執行訓練完成後,儲存模型。匯出訓練好的模型,執行object_detection/export_inference_graph.py:
python export_inference_graph.py --pipeline_config_path=./mymodel_ssd/ssd_mobilenet_v1_coco.config --trained_checkpoint_prefix=./training_result/ssd_mobiel_model/model.ckpt-2000 --output_directory=./training_result//ssd_mobiel_model
然後就可以用訓練得到的模型來對新的圖片進行目標檢測了。
- 目標檢測
將到出的模型中frozen_inference_graph.pb檔案單獨儲存到mymodel_ssd中,開啟jupyter notebook,執行object_detection/
object_detection_tutorial.ipynb 。最後的檢測結果會儲存到預習設定的資料夾result裡面。
- 實驗結果