TensorFlow Object Detection API(Windows下訓練)

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

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

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

第一部分  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/
 
1、 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

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

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

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

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

  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個分類中),做爲干擾測試.ide

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

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

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

  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進行訓練。 

1、數據格式轉換

  在第一部分介紹中,我已經把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文件夾。

2、下載預訓練模型 

  一般模型的訓練都不是從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目錄須要新建一個。 

3、修改配置文件 

  剛纔下載的數據集是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"

  其餘訓練的配置信息能夠本身研究一下,能夠針對本身的數據集進行調整。 

4、開始訓練

  由於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

第三部分 可能產生的錯誤

1、執行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環境變量中。

2、運行訓練後報錯:「WARNING:root:Variable ……not available in checkpoint」

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

 3、其餘錯誤

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

訓練狀況:

 

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

相關文章
相關標籤/搜索