本文爲做者原創,轉載請註明出處(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
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目錄下。
這個API的主要任務是進行ObjectDetection,因此只會用到數據集中的前三個目錄,這裏使用VOC2012進行訓練。
1、數據格式轉換
在第一部分介紹中,我已經把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文件夾。
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 --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'
2、運行訓練後報錯:「WARNING:root:Variable ……not available in checkpoint」
3、其餘錯誤
訓練狀況:
綜上,若是有可能。。。Windows下的配置仍是很糟心,奇葩問題比較多,建議仍是在Linux下訓練,明天週末,我先丟在機器上跑吧。。。