TensorFlow Object Detection API(Windows下訓練)


本文為作者原創,轉載請注明出處(http://www.cnblogs.com/mar-q/)by 負贔屓

  最近事情比較多,前面坑挖的有點久,今天終於有時間總結一下,順便把Windows下訓練跑通。Linux訓練建議仔細閱讀https://zhuanlan.zhihu.com/p/27469690,我借鑒頗多,此外還可以參考GitHub上的官方文檔https://github.com/tensorflow/models/tree/master/research/object_detection。

  總體而言Windows下訓練還是比較坑的,centos服務器上自己的模型已經訓練完了,我也是為了測試而嘗試。。。基本把坑趟了一遍。我是在辦公電腦上測試的,沒有GPU,還好內存是32G,訓練期間CPU使用率基本保持在99%。

第一部分  PASCAL VOC數據集的介紹 

The PASCAL VOC project(熟悉的小伙伴可以直接看第二部分)
首先了解一下本次訓練用的數據集和它的來歷
  注   冊http://host.robots.ox.ac.uk/需要公司或機構郵箱,個人郵箱(gmail等等)不可注冊,不注冊應該也不影響下載。
  PascalVOC的官方簡介:Provides standardised image data sets for object class recognition;Provides a common set of tools for accessing the data sets and annotations;Enables evaluation and comparison of different methods;Ran challenges evaluating performance on object class recognition (from 2005-2012, now finished)
  總而言之,它是一個視覺挑戰賽,舉辦到2012年就停止了,最后一次2012年挑戰賽的網址: http://host.robots.ox.ac.uk/eval/challenges/voc2012/
 
一、 PVOC2007&2012數據集一共20 object classes:
person
bird, cat, cow, dog, horse, sheep
aeroplane, bicycle, boat, bus, car, motorbike, train
bottle, chair, dining table, potted plant, sofa, tv/monitor

二、2012年的挑戰賽一共有5 個main tasks 和 2個 ``taster'' tasks:

  1. Classification: 對每個類判斷測試圖片中是否存在該類的至少1個對象.

  2. Detection: 對每個類判斷測試圖片中屬於該類對象的外包邊框.

  3. Segmentation: 對測試圖中的每個像素,判斷該像素屬於20個類對象還是屬於背景,即圖像的語義分割.

  4. Action Classification: 對每個動作類別,判斷測試圖片中是否有人(已通過外包邊框標明)正在做出相應的動作,動作共有10個分類:jumping; phoning; playing a musical instrument; reading; riding a bicycle or motorcycle; riding a horse; running; taking a photograph; using a computer; walking。此外,數據集中有一些人在做其他動作(不在10個分類中),作為干擾測試.

  5. Large Scale Recognition: 這個比賽項目由ImageNet組織,他們的網站: http://www.image-net.org/challenges/LSVRC/2012/index

  6.  2``taster'' tasks:Boxless Action Classification: 判斷測試圖中人是否在做相應動作,這些人僅通過身體某處的單個點標明,沒有外包邊框.Person Layout: 對測試圖中的每個人(已通過外包邊框標明),判斷這些人的頭、手、腳部位,並通過外包框標明。

三、目錄結構:如圖所示:

  1.JPEGImages存放圖片;

  2. Annotation存放對圖片的標注信息(XML文件),即外包邊框bounding box的位置信息;

  3. SegmentationClass和SegmentationObject存放了圖片的分割前景。

  4. ImageSets是對圖片集合的描述,分別對應了不同的競賽任務,例如Layout表示圖片中人體部位的數據,Main表示每個圖片包含的分類信息(20個類別),Segmentation表示用於分割的數據,2007沒有action,2012有了action數據,表示圖片中人的動作。

  紅框中的4個壓縮包分別是2012和2007的test、trainval文件,把2007的test和trainval解壓縮,2007的test和train目錄結構是一致的,只是圖片和標注內容互補。2012也是如此,在ImageSets的main中通過txt把數據集划分成train、train_test、train_val等幾個部分。

  以上文件下載並解壓縮到D:\dataset\VOCdevkit目錄下。 

第二部分TensorFlowObjectDetectionAPI的訓練詳細步驟

這個API的主要任務是進行ObjectDetection,所以只會用到數據集中的前三個目錄,這里使用VOC2012進行訓練。 

一、數據格式轉換

  在第一部分介紹中,我已經把PascalVOC數據集下載到D:\dataset\VOCdevkit目錄下,如果要制造自己的數據集,可以仿照VOC的目錄結構,通過lableImg工具進行標注,具體就不演示了,可以參考的博客很多。

  因為tf訓練需要使用tfrecord格式,所以首先需要把PascalVOC數據集轉換成TensorFlow record格式,ObjectDetectionAPI下提供了格式轉換的方法:create_pascal_tf_record.py,參考知乎的博客,需要把164行examples_path修改為:    
data_dir, year, 'ImageSets', 'Main',FLAGS.set + '.txt'

  VOC數據集和轉換后tfrecord數據集都存放在D:\dataset目錄下,這里需要為tfrecord新建一個文件夾D:\dataset\TFrecord,並在TFrecord下新建文件夾data。完成后可以運行命令:

python create_pascal_tf_record.py --data_dir=D:\dataset\VOCdevkit --year=VOC2012 --set=train --output_path=D:\dataset\TFrecord\data\pascal_train.record

  上面的命令中,data_dir為存放的VOC數據集目錄,year參數只接受VOC2012和VOC2007兩個數據集,這里選用了VOC2012,如果自己標注了數據,請按照VOC目錄結構存放,set表示使用VOC2012的train部分進行訓練,大概5700多張圖片,output_path為record數據集的輸出目錄,就是剛才新建的data文件夾。

二、下載預訓練模型 

  通常模型的訓練都不是從0開始的,利用fine-tuning的思想在已有模型基礎上訓練可以有一個好的performance,https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md官網上提供了5個模型,大家可以自行下載,這里我下載了mAP比較高的faster_rcnn_inception_resnet_v2_atrous_coco,這是一個coco數據集訓練的模型,解壓縮后把其中的model.ckpt.*三個文件復制到D:\dataset\TFrecord\models下,沒有models目錄需要新建一個。 

三、修改配置文件 

  剛才下載的數據集是faster_rcnn_inception_resnet_v2_atrous_coco,在object_detection\samples\configs目錄下找到對應的.config文件,如果沒有,可以到https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs復制對應的config文件, 把faster_rcnn_inception_resnet_v2_atrous_coco.config放到預訓練模型目錄下:D:\dataset\TFrecord\models 

   打開faster_rcnn_inception_resnet_v2_atrous_coco.config,修改num_classes為你自己的num_classes,這里VOC2012有20個分類,所以修改為20。然后修改其中5個路徑: 

112行 fine_tune_checkpoint: "D:\\dataset\\TFrecord\\models\\model.ckpt"
127行 input_path: "D:\\dataset\\TFrecord\\data\\pascal_train.record"
129行 label_map_path: "D:\\dataset\\TFrecord\\data\\pascal_label_map.pbtxt"
141行 input_path: "D:\\dataset\\TFrecord\\models\\pascal_val.record"
143行 label_map_path: "D:\\dataset\\TFrecord\\models\\pascal_label_map.pbtxt"

  其他訓練的配置信息可以自己研究一下,可以針對自己的數據集進行調整。 

四、開始訓練

  因為python環境變量配置問題,這里Windows下和Linux也有不同,在object_detection中訓練的文件為train.py,我們打開可以看到里面的model都是通過object_detection來加載的。 

  因為路徑問題,直接運行python train.py會產生model not found,兩個解決辦法,一是把object_detection加入python環境變量中,另一個辦法,把train.py復制到object_detection目錄外執行。這里我選用了后者。在object_detection外執行:
python train.py --train_dir=D:\dataset\TFrecord\train --pipeline_config_path=D:\dataset\TFrecord\models\faster_rcnn_inception_resnet_v2_atrous_coco.config

第三部分 可能產生的錯誤

一、執行python train.py報錯:trainer.py“ModuleNotFoundError: No module named 'deployment'”,或者報錯No module named 'nets'

  • 錯誤原因,這兩個model都是在TensorFlow/models/slim中,如果你閱讀了我的上一篇文章http://www.cnblogs.com/mar-q/p/7459845.html,就可以知道,需要把models/slim加入到PYTHONPATH環境變量中。

二、運行訓練后報錯:“WARNING:root:Variable ……not available in checkpoint”

  • 錯誤路徑train.py->trainer.py->train()->init_saver = tf.train.Saver(available_var_map),產生原因,第2步和第3步中預訓練模型和config文件沒有對應起來,請在官網下載相匹配的預訓練模型和config文件。

 三、其他錯誤

  •  如果還報一些ModuleNotFoundError錯誤建議把object_detection目錄下的.pyc文件清空一下再執行train。 

訓練情況:

 

綜上,如果有可能。。。Windows下的配置還是很糟心,奇葩問題比較多,建議還是在Linux下訓練,明天周末,我先丟在機器上跑吧。。。 

 


免責聲明!

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



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