日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

py-faster-rcnn + ZF 实现自己的数据训练与检测(二)

發(fā)布時間:2024/9/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 py-faster-rcnn + ZF 实现自己的数据训练与检测(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0.前言

在前面的一篇博客中,介紹了如何實現(xiàn)py-faster-rcnn的配置以及在PASCAL VOC 2007上面的訓(xùn)練,本節(jié),來講訴如何制作并訓(xùn)練自己的數(shù)據(jù)集。如果自己使用的是matlab版本的faster rcnn的話,請移步這里:http://blog.csdn.NET/sinat_30071459/article/details/50546891

1.制作自己的數(shù)據(jù)集

訓(xùn)練模型最頭疼的估計就是數(shù)據(jù)集的整理與標記了,本例中我以人臉識別為例來說明數(shù)據(jù)集的安排。首先,這里為了方便,我沒有更改VOC2007的任何格式,只是將data/VOCdevkit2007/VOC2007/Annotations和ImageSets以及JPEGImages文件夾的內(nèi)容進行了替換。假設(shè)你的數(shù)據(jù)集已經(jīng)進行了標記,所做的標記框已經(jīng)輸出到txt文檔中,如下所示。

0001.jpg f 67 55 195 201 0001.jpg f 339 49 479 206 從左到右依次是圖片名稱,打框的標簽和框的4個坐標

然后是將文檔中的數(shù)據(jù)寫入xml文件,如何制作數(shù)據(jù)可以參考這篇文章http://blog.csdn.net/liumaolincycle/article/details/50540487,這里不在贅述。不過和它不同的是,我為了方便,依然使用原有的數(shù)據(jù)集名稱,只是對相應(yīng)的文件進行了替換。最后是生成4個txt文檔,分別為train.txt? trainval.txt? test.txt 和 val.txt。據(jù)我發(fā)現(xiàn),在實驗時好像只用到了trainval.txt和test.txt,他們兩個構(gòu)成完整的一個數(shù)據(jù)集。最后,可以將原有的一些SegmenttationClass和SegmentationObject等文件夾刪除,在我的實驗中,所需要的完整結(jié)構(gòu)如下所示。

2.訓(xùn)練自己的數(shù)據(jù)

自己的數(shù)據(jù)集制作完成之后,就可以著手對文件進行修改以便訓(xùn)練了

(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文件,將類別數(shù)量改成自己的類別數(shù)量+1(檢測時,背景也要作為1類),比如我的是人臉檢測,就一個類別,就要將pt文件中的類別改為2,再將bbox預(yù)測層改為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

    在使用自己的數(shù)據(jù)進行訓(xùn)練時,基本上都會報錯:assert(boxes[:,2] >= boxes[:,0]).all() ,主要是因為自己的圖片數(shù)據(jù)沒有統(tǒng)一整理過而導(dǎo)致的,將該文件加入幾行修改如下:

    [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文件刪除后再重新運行


    修改到這里時,訓(xùn)練前的準備工作已經(jīng)完成了,現(xiàn)在可以直接進行訓(xùn)練。


    cd py-faster-rcnn
    ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

    訓(xùn)練完成之后,將output中的最終模型拷貝到data/faster_rcnn_models中,接下來測試訓(xùn)練完成的模型。


    3.測試結(jié)果

    修改./tools/demo.py

    和上面的pascal_voc.py一樣,將類別改成自己的類別,然后將加載的模型改為自己訓(xùn)練出來的模型。以我的為例

    [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')??
  • ??????????????????}??

  • 執(zhí)行./tools/demo.py --net myzf即可得到如下的訓(xùn)練結(jié)果







    總結(jié)

    以上是生活随笔為你收集整理的py-faster-rcnn + ZF 实现自己的数据训练与检测(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。