生活随笔
收集整理的這篇文章主要介紹了
py-faster-rcnn + ZF 实现自己的数据训练与检测(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0.前言
在前面的一篇博客中,介紹了如何實現py-faster-rcnn的配置以及在PASCAL VOC 2007上面的訓練,本節,來講訴如何制作并訓練自己的數據集。如果自己使用的是matlab版本的faster rcnn的話,請移步這里:http://blog.csdn.NET/sinat_30071459/article/details/50546891
1.制作自己的數據集
訓練模型最頭疼的估計就是數據集的整理與標記了,本例中我以人臉識別為例來說明數據集的安排。首先,這里為了方便,我沒有更改VOC2007的任何格式,只是將data/VOCdevkit2007/VOC2007/Annotations和ImageSets以及JPEGImages文件夾的內容進行了替換。假設你的數據集已經進行了標記,所做的標記框已經輸出到txt文檔中,如下所示。
0001.jpg f 67 55 195 201
0001.jpg f 339 49 479 206 從左到右依次是圖片名稱,打框的標簽和框的4個坐標
然后是將文檔中的數據寫入xml文件,如何制作數據可以參考這篇文章http://blog.csdn.net/liumaolincycle/article/details/50540487,這里不在贅述。不過和它不同的是,我為了方便,依然使用原有的數據集名稱,只是對相應的文件進行了替換。最后是生成4個txt文檔,分別為train.txt? trainval.txt? test.txt 和 val.txt。據我發現,在實驗時好像只用到了trainval.txt和test.txt,他們兩個構成完整的一個數據集。最后,可以將原有的一些SegmenttationClass和SegmentationObject等文件夾刪除,在我的實驗中,所需要的完整結構如下所示。
2.訓練自己的數據
自己的數據集制作完成之后,就可以著手對文件進行修改以便訓練了
(1)prototxt配置文件
file1:models/pascal_voc/ZF/faster_rcnn_alt_opt/
stage1_rpn_train.pt
file2:models/pascal_voc/ZF/faster_rcnn_alt_opt/
stage1_fast_rcnn_train.ptfile3:models/pascal_voc/ZF/faster_rcnn_alt_opt/
stage2_rpn_train.pt
file4:models/pascal_voc/ZF/faster_rcnn_alt_opt/
stage2_fast_rcnn_train.ptfile5:models/pascal_voc/ZF/faster_rcnn_alt_opt/
fast_rcnn_test.pt
修改上面5個pt文件,將類別數量改成自己的類別數量+1(檢測時,背景也要作為1類),比如我的是人臉檢測,就一個類別,就要將pt文件中的類別改為2,再將bbox預測層改為8(2*4),以stage1_fast_rcnn_train.pt為例
[plain] view plaincopy
name:?"ZF"??layer?{????name:?'data'????type:?'Python'????top:?'data'????top:?'rois'????top:?'labels'????top:?'bbox_targets'????top:?'bbox_inside_weights'????top:?'bbox_outside_weights'????python_param?{??????module:?'roi_data_layer.layer'??????layer:?'RoIDataLayer'??????param_str:?"'num_classes':?2"????}??}??......???layer?{????name:?"cls_score"????type:?"InnerProduct"????bottom:?"fc7"????top:?"cls_score"????param?{?lr_mult:?1.0?}????param?{?lr_mult:?2.0?}????inner_product_param?{??????num_output:?2??????weight_filler?{????????type:?"gaussian"????????std:?0.01??????}??????bias_filler?{????????type:?"constant"????????value:?0??????}????}??}??layer?{????name:?"bbox_pred"????type:?"InnerProduct"????bottom:?"fc7"????top:?"bbox_pred"????param?{?lr_mult:?1.0?}????param?{?lr_mult:?2.0?}????inner_product_param?{??????num_output:?8??????weight_filler?{????????type:?"gaussian"????????std:?0.001??????}??????bias_filler?{????????type:?"constant"????????value:?0??????}????}??}??
(2)修改lib/datasets/pascal_voc.py,將類別改成自己的類別
[plain] view plaincopy
self._data_path?=?os.path.join(self._devkit_path,?'VOC'?+?self._year)??self._classes?=?('__background__',?#?always?index?0???????????????????????????'face')??
(3)
修改py-faster-rcnn/lib/datasets/imdb.py
在使用自己的數據進行訓練時,基本上都會報錯:assert(boxes[:,2] >= boxes[:,0]).all() ,主要是因為自己的圖片數據沒有統一整理過而導致的,將該文件加入幾行修改如下:
[python] view plaincopy
def?append_flipped_images(self):??????num_images?=?self.num_images??????widths?=?self._get_widths()??????for?i?in?xrange(num_images):??????????boxes?=?self.roidb[i]['boxes'].copy()??????????oldx1?=?boxes[:,?0].copy()??????????oldx2?=?boxes[:,?2].copy()??????????boxes[:,?0]?=?widths[i]?-?oldx2?-?1??????????boxes[:,?2]?=?widths[i]?-?oldx1?-?1????????????for?b?in?range(len(boxes)):??????????????if?boxes[b][2]?<?boxes[b][0]:?????????????????boxes[b][0]?=?0???????????????????????????assert?(boxes[:,?2]?>=?boxes[:,?0]).all()??????????entry?=?{'boxes'?:?boxes,???????????????????'gt_overlaps'?:?self.roidb[i]['gt_overlaps'],???????????????????'gt_classes'?:?self.roidb[i]['gt_classes'],???????????????????'flipped'?:?True}??????????self.roidb.append(entry)??????self._image_index?=?self._image_index?*?2??
如果是在報錯之后再修改這個文件的話,記得在修改之后將data/cache/里面的pki文件刪除后再重新運行
修改到這里時,訓練前的準備工作已經完成了,現在可以直接進行訓練。
cd py-faster-rcnn
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
訓練完成之后,將output中的最終模型拷貝到data/faster_rcnn_models中,接下來測試訓練完成的模型。
3.測試結果
修改./tools/demo.py
和上面的pascal_voc.py一樣,將類別改成自己的類別,然后將加載的模型改為自己訓練出來的模型。以我的為例
[python] view plaincopy
NETS?=?{'vgg16':?('VGG16',????????????????????'VGG16_faster_rcnn_final.caffemodel'),??????????'zf':?('ZF',????????????????????'ZF_faster_rcnn_final.caffemodel'),??????????'myzf':?('ZF',????????????????????'ZF_faster_rcnn_final_4000.caffemodel')????????????????????}??
執行./tools/demo.py --net myzf即可得到如下的訓練結果
總結
以上是生活随笔為你收集整理的py-faster-rcnn + ZF 实现自己的数据训练与检测(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。