本文為作者原創,轉載請注明出處(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數據集的介紹
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工具進行標注,具體就不演示了,可以參考的博客很多。
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 --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下訓練,明天周末,我先丟在機器上跑吧。。。