在目標檢測實驗中使用遷移學習開發說明書

在目標檢測實驗中使用遷移學習.

本實驗借鑑https://blog.csdn.net/ctwy291314/article/details/80999645, 該實驗是將目標檢測遷移到人臉檢測上.

1. 下載訓練數據和驗證數據.

這裏使用WIDER FACE數據集作爲訓練集合驗證集. 爲了簡單, 快速實現在目標檢測任務中採用遷移學習. 只下載WIDER Face Validation Images作爲訓練集, 必要的時候也可以作爲驗證集.
將WIDER_val和wider_face_split文件夾放在./datasets下.

2. 下載訓練好的模型.

這裏採用Tensorflow在COCO數據集上訓練好的模型, 下載地址https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md. 這裏下載faster_rcnn_inception_v2_coco.
原文中使用代碼001_down_data.py進行數據集和訓練好模型的下載, 這裏暫時不需要!

3. 數據預處理

數據預處理工作包括:

  1. 將WIDERFace轉換爲Pascal XML. 將使用scripts/data-to-pascal-xml.py轉換WIDERFace數據並且將數據複製到一個不同的子文件夾中. 並修改scripts/data-to-pascal-xml.py中的一些路徑.
    運行scripts/data-to-pascal-xml.py, 將會在datasets下生成tf_wider_train和tf_wider_val文件夾, 裏面包含xmls文件夾, images文件夾和txt文件. 這是訓練集和驗證集的源數據.

  2. 創建Pascal XML到Tensorflow CSV的索引. 詳見scripts/xml-to-csv.py, 並簡單修改一些路徑. 這樣tf_wider_train和tf_wider_val文件夾下面的txt文件, 就會變成csv文件.

  3. 創建TFRecord文件. 訓練和驗證數據將被轉換成二進制文件. 詳見scripts/generate_tfrecord.py, 並簡單修改一些路徑. 運行方式如下:

# creates  train.record
python generate_tfrecord.py --images_path=../datasets/tf_wider_train/images --csv_input=../datasets/tf_wider_train/train.csv  --output_path=../datasets/train.record
# Create test/validation data:
python generate_tfrecord.py --images_path=../datasets/tf_wider_val/images --csv_input=../datasets/tf_wider_val/val.csv  --output_path=../datasets/val.record

代碼對圖像沒有進行resize, 因此batch size只能是1. 將圖像進行resize, 這樣可以提高運行效率.

在運行以上兩個程序之前, 確保python已經安裝了object_detection. object_detection是Tensorflow做目標檢測所需的包, 可見https://github.com/tensorflow/models/tree/master/research/object_detection.
1> 直接pip install object_detection時, Tensorflow的版本要求是最高的. 這樣, 又會涉及到CUDA版本和CUDNN版本的問題. 所以, 直接將https://github.com/tensorflow/models clone下來, 然後指定PYTHONPATH環境變量即可. 如將models/research/加到PYTHONPATH環境變量中即可.

2> Protobuf Compilation. 首先安裝protobuf. https://github.com/protocolbuffers/protobuf源碼編譯安裝.

3> cd /home/ly/downloads/models/research/
From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.

4> 將models/research/和models/research/slim都加進PYTHONPATH環境變量.

4. 訓練/驗證

  1. 新建./face_faster_rcnn目錄. 在該目錄下新建face_label.pbtxt, 內容見https://www.cnblogs.com/gmhappy/p/9472361.html.
  2. 將./models/research/object_detection/samples/configs下的faster_rcnn_inception_v2_coco.config拷貝至face_faster_rcnn目錄.
  3. 根據鏈接https://www.cnblogs.com/gmhappy/p/9472361.html, 修改faster_rcnn_inception_v2_coco.config文件.
  4. 訓練和驗證的代碼見: /home/ly/downloads/models/research/object_detection/legacy下的train.py和eval.py.
    將train.py拷貝至face_faster_rcnn目錄, 運行: python train.py --logtostderr --train_dir=…/datasets/ --pipeline_config_path=faster_rcnn_inception_v2_coco.config --train_dir=model_output

5. 檢查點轉換爲protobuf變爲可運行的模型

cd ./face_faster_rcnn
python export_inference_graph.py --input_type image_tensor --pipeline_config_path faster_rcnn_inception_v2_coco.config --trained_checkpoint_prefix model_output/model.ckpt-100000 --output_directory face_faster_rcnn_model/

6. 預測

tar zcvf face_faster_rcnn_model.tar.gz face_faster_rcnn_model
python transfer_learning_object_detection.py

7. 上述在目標檢測中做的遷移學習是將原有多類目標檢測轉換成了只有一類的目標檢測, 這是第一種利用遷移學習來做目標檢測.

第二種: 將人臉檢測加入到目標檢測中, 即在實現原有目標檢測的同時, 加入新的目標檢測.
第二種實現方式有兩種: 1) 先對圖像做目標檢測, 再對圖像做人臉檢測, 將結果進行融合即可. 2) 實現端到端的, 即將新的目標檢測加入到原來的目標檢測中去, 而不是分開!
對於第二種實現方法, 目前這一處理:
object_face_detection_faster_rcnn目錄下.
1> 還是僅採用WIDER FACE數據集作爲訓練集, 將num_classes改成91.
2> 修改object_face_label.pbtxt, 將91類的目標name都寫上. 原始的*.pbtxt在/home/ly/downloads/models/research/object_detection/data下. 如80類的COCO數據集, 採用的是mscoco_label_map.pbtxt.
3> python train.py --logtostderr --train_dir=…/datasets/ --pipeline_config_path=faster_rcnn_inception_v2_coco.config --train_dir=model_output
4> python export_inference_graph.py --input_type image_tensor --pipeline_config_path faster_rcnn_inception_v2_coco.config --trained_checkpoint_prefix model_output/model.ckpt-100000 --output_directory object_face_detection_faster_rcnn_model/
需要修改/home/ly/downloads/models/research/object_detection/meta_architectures/faster_rcnn_meta_arch.py, 因爲tf 1.10沒有tf.batch_gather(), 可以將這個操作自行添加. 藉助tf 1.13版本即可.
5> tar zcvf object_face_detection_faster_rcnn_model.tar.gz object_face_detection_faster_rcnn_model
python transfer_learning_object_detection.py

對7.的部分進行實驗, 發現實驗結果並不好. 還是隻有人臉檢測部分. 直接將new class加入到old class中(即分類層的結點數增多), 並且訓練集只有new class的數據集. 開始retain, 這裏的問題是: 1) 只採用新數據集進行訓練, 分類層結點個數是(old class + new class數目), 網絡前N-1層freeze, 這樣新數據集可能並不能很好的適應網絡. 因爲我們只有new class的數據集. 2) 只採用新數據集進行訓練, 分類層結點個數是(old class + new class數目), 網絡前N-1層不freeze, 這樣新數據集可能並不能很好的適應網絡, 並且可能會破壞原有class的識別精度. 因爲我們只有new class的數據集.

因此, 將new class加入到old class的遷移學習, 並不是很容易做. 目前的遷移學習還是集中在將原始任務遷移到一個新任務上, 減少訓練量和訓練難度.

8. 爲了實現new class和old class的融合, 這裏採用兩階段的方法.

first stage: 做圖像做目標檢測, 得到檢測結果1, 這裏採用的是已經訓練好的通用目標檢測框架; second stage: 對圖像做目標檢測, 得到檢測結果2, 這裏採用的是將遷移學習應用到目前檢測中, 將原始檢測任務遷移到新的目標檢測任務中. 最後, 將檢測結果1和檢測結果2進行融合, 進行展示或將檢測結果進行格式化輸出.
具體代碼可見: ./object_face_detection_faster_rcnn/transfer_learning_object_face_detection.py.

Faster RCNN多小目標檢測效果較差, 這是由於Faster RCNN scale的問題, faster rcnn只在con5_3進行roi pooling; fpn和mask-rcnn則正好解決了這個缺陷, 在多級特徵上進行roi pooling.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章