目標檢測Faster_r_cnn代碼的使用(python+caffe版本)

代碼資源

Faster_r_cnn代碼鏈接: https://pan.baidu.com/s/1eS8JcIY 密碼: mqrh
論文作者源碼下載:git clone –recursive https://github.com/rbgirshick/py-faster-rcnn.git

配置,編譯與安裝環境

1:在本機已經配置好了caffe環境以及各種依賴的安裝,還要配置以下幾個python包:cython,easydict和python-opencv,安裝命令如下:

$ pip install cython
$ pip install easydict
$ sudo apt-get install python-opencv

2:Cython模塊編譯

$ cd $FRCN_ROOT/lib
$ make

3:caffe和pycaffe的編譯
在編譯之前,需要複製$FRCN_ROOT/caffe-fast-rcnn 的Makefile.config.example,然後重命名爲Makefile.config。
需要注意的是裏面有幾個配置需要添加
打開USE_CUDNN=1,這個選項默認情況下是關閉的,需要打開讓CUDA支持DNN
打開WITH_PYTHON_LAYER=1,默認關閉,需打開,因爲FasterRCNN需要支持Python接口。

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include後面打上一個空格 然後添加/usr/include/hdf5/serial如果沒有這一句可能會報一個找不到hdf5.h的錯誤

4:執行以下命令進行編譯

make all -j4
make過程中出現找不到lhdf5_hl和lhdf5的錯誤,
解決方案:
在計算機中搜索libhdf5_serial.so.10.1.0,找到後右鍵點擊打開項目位置
該目錄下空白處右鍵點擊在終端打開,打開新終端輸入
sudo ln libhdf5_serial.so.10.1.0 libhdf5.so
sudo ln libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so
最後在終端輸入sudo ldconfig使鏈接生效
原終端中輸入make clean清除第一次編譯結果
再次輸入make all -j4重新編譯

終端輸入
make test -j4
make runtest -j4
make pycaffe -j4
make distribute 生成發佈安裝包

運行demo

1:下載訓練好的模型,下載好的模型在$FRCN_ROOT/data下面

$ cd $FRCN_ROOT
$ ./data/scripts/fetch_faster_rcnn_models.sh

faster_rcnn模型鏈接: https://pan.baidu.com/s/1miDWCEc 密碼: xq4y

2:運行模型

$ cd $FRCN_ROOT
$ ./tools/demo.py

結果如下:
這裏寫圖片描述

訓練自己的數據集

1.工程目錄介紹

  • caffe-fast-rcnn:caffe框架目錄
  • data:用來存放pretrained模型以及讀取文件的cache緩存,還有一些下載模型的腳本
  • experiments:存放配置文件以及運行的log文件,另外這個目錄下有scripts,裏面存放end2end和all_opt兩種訓練方式的腳本
  • lib: 用來存放一些python的接口文件,如darasets主要負責數據庫的讀取,config負責一些訓練的配置選項
  • models:裏面存放了三個模型文件,小型網絡ZF,中型網絡VGG_CNN_M_1024以及大型網絡VGG16,根據你的硬件條件來選擇使用哪種網絡,ZF和VGG_CNN_M_1024需要至少3G內存,VGG16需要更多的內存,但不會超過11G。
  • outputs:這裏存放的是訓練後的輸出目錄,這是運行訓練後纔會出現的目錄
  • tools:裏面存放的訓練和測試python文件

2.創建數據集

仿照VOC2007數據集的格式來準備
具體參考我的這篇博客:http://blog.csdn.net/Lin_xiaoyi/article/details/78180705
生成好之後把所有的xml放到VOC2007下的Annotation中,可參考如下linux命令:
for xml in *.xml;do mv $xml Annotations/;done

1.將所有的訓練圖片都放入JPEGImages文件夾中,
生成ImageSet\Main裏的四個txt文件,分別是:trainval.txt(訓練和驗證集總和)、train.txt(訓練集)、val.txt(驗證集)、test.txt(測試集),trainval集佔整個數據集的70%,train集佔trainval集的70%,val集佔trainval集的30%,test集佔整個數據集的30%。可參考以下代碼進行數據集的劃分:

%%
%該代碼根據已生成的xml,製作VOC2007數據集中的trainval.txt;train.txt;test.txt和val.txt
%trainval佔總數據集的70%,test佔總數據集的30%;train佔trainval的70%,val佔trainval的30%;
%上面所佔百分比可根據自己的數據集修改
%注意修改下面兩個路徑
xmlfilepath='/home/linbiyuan/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations';
txtsavepath='/home/linbiyuan/py-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main/';

xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2;%減去.和..  總的數據集大小

trainval=sort(randperm(numOfxml,floor(numOfxml*0.7)));%trainval爲數據集的50%
test=sort(setdiff(1:numOfxml,trainval));%test爲剩餘50%

trainvalsize=length(trainval);%trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*0.7))));
val=sort(setdiff(trainval,train));

ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');

for i=1:numOfxml
    if ismember(i,trainval)
        fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
        if ismember(i,train)
            fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
        else
            fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
        end
    else
        fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
    end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);

至此,數據集的構建就完成啦,你可以新建一個文件夾,將上述三個文件夾放到裏面去,也可將上述三個文件夾分貝替換VOC2007數據集中的Annotations、ImageSets和JPEGImages,這樣可免去一些訓練的修改。本文選擇的是替換~

把數據集放到./data文件夾下

3.訓練自己的數據集

1.修改prototxt配置文件
這些配置文件都在models下的pascal_voc下。裏面有三種網絡結構:ZF, VGG16, VGG_CNN_M_1024,本文選擇的是VGG_CNN_M_1024。每個網絡結構中都有三個文件夾,分別是faster_rcnn_end2end , faster_rcnn_alt_opt , fast_rcnn 。使用近似聯合訓練faster_rcnn_end2end ,比交替優化快1.5倍,但是準確率差不多,所以推薦使用這種方法。更改faster_rcnn_end2end文件夾的train.prototxt和test.prototxt,train中需要改的地方有三處,
第一處是input-data層,將原來的21改成:你的實際類別數+1(背景),我目標檢測一共有46類,所以加上背景這一類,一共47類。
這裏寫圖片描述

第二處是cls_score層,將原來的21改成:你的實際類別數+1(背景),我目標檢測一共有46類,所以加上背景這一類,一共47類。
這裏寫圖片描述

第三處是bbox_pred,這裏需將原來的84改成(你的類別數+1)×4,即(46+1)×4=188
這裏寫圖片描述

**

test.prototxt中沒有input-data層,所以只需要按照train中修改cls_score層以及bbox_pred層即可

**

2.修改lib/datasets/pascal_voc.py,將類別改成自己的類別
這裏寫圖片描述

這裏有一個注意點就是,這裏的類別以及你之前的類別名稱最好是全部小寫,假如是大寫的話,則會報keyError的錯誤,這時只需要在pascal_voc。py中第212行的lower去掉即可
這裏寫圖片描述

dataset目錄下主要有三個文件,分別是

  • factory.py:這是一個工廠類,用類生成imdb類並且返回數據庫供網絡訓練和測試使用
  • imdb.py:是數據庫讀寫類的基類,封裝了許多db的操作
  • pascl_voc.pyRoss用這個類來操作

3.修改py-faster-rcnn/lib/datasets/imdb.py
在使用自己的數據進行訓練時,假如你的數據集中的圖片沒有統一整理過就會報assert(boxes[:,2]>=boxes[:,0].all()這個錯誤,故需在imdb.py中加入如下幾行
這裏寫圖片描述

4.開始訓練
下載預訓練的ImageNet的模型

$ cd py-fasyer-rcnn
$ ./data/scripts/fetch_imagenet_models.sh

下載的imagenet.model是在/data文件夾下
imagenet.model鏈接: https://pan.baidu.com/s/1bpJFguV 密碼: 7u5v

$ cd py-faster-rcnn
$ ./experiments/scripts/faster_rcnn_end2end.sh 0 VGG_CNN_M_1024 pascal_voc

由於訓練過程太長,可以將訓練過程產生的輸出定下輸入到log文件中,這樣可以方便查看。只需要在上述命令中加入定向輸入的命令即可,如下:

$ ./experiments/scripts/faster_rcnn_end2end.sh 0 VGG_CNN_M_1024 pascal_voc >/home/xiaoyi/log/clothdirector.log 2>&1

! ! ! 訓練前需要將cache中的cache中的pkl文件及VOCdevkit2007中annotations_cache的緩存刪掉。

5.測試結果
訓練完成之後,將output中的最終模型拷貝到data/faster_rcnn_models,修改tools下的demo.py,我是使用VGG_CNN_M_1024這個中型網絡,不是默認的ZF,所以要改的地方挺多
1.修改class
這裏寫圖片描述

2.增加你自己訓練的模型
這裏寫圖片描述

3.修改prototxt,如果你用的ZF,就不用改了
這裏寫圖片描述

6.開始檢測
執行 ./tools/demo.py –net myvgg1024
假如不想那麼麻煩輸入參數,可以在demo的parse_args()裏修改默認參數
parser.add_argument(‘–net’, dest=’demo_net’, help=’Network to use [myvgg1024]’,
choices=NETS.keys(), default=’myvgg1024’)
這樣只需要輸入 ./tools/demo.py 就可以了

參考博客: 
https://bealin.github.io/2016/10/23/Caffe%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97%E2%80%94%E2%80%946%E4%BD%BF%E7%94%A8Faster-RCNN%E8%BF%9B%E8%A1%8C%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章