Faster-rcnn在caffe的實踐操作+VOC2007(在自己電腦花了4天時間)完整版

文件夾介紹
py-faster-rcnn
–caffe-fast-rcnn:caffe框架文件
–data:預訓練模型、faster-rcnn模型、數據集鏈接
–experiments:存放配置文件以及運行的log文件
–lib:存放Python接口文件
----datasets:數據庫的讀取
-------修改讀寫數據的接口主要是datasets目錄下
---------factory.py
---------imdb.py
---------pascal_voc.py
---------voc_eval.py
----rpn:RPN的核心代碼
-------generate_anchors.py:生成多尺度和多比例的錨點
-------proposal_layer.py:用來將RPN的輸出轉變爲object proposals
-------anchor_target_layer.py:生成每個錨點的訓練目標和標籤,將其分類爲1(object),0(not object),-1(ignore).
-------proposal_target_layer.py:對於每一個object proposal生成訓練的目標和標籤,分類標籤從0-k,對於標籤>0的box進行迴歸。
-------generate.py:使用一個rpn生成object proposals。
----nms做非極大抑制的部分,有gpu和cpu兩種實現方式
-------py_cpu_nms.py:核心函數
----fast_rcnn:主要存放的是python的訓練和測試腳本,以及訓練的配置文件config.py
-------config.py
-------nms_wrapper.py
-------test.py
-------train.py
----roi_data_layer:主要是一些ROI處理操作
-------layer.py
-------minibatch.py
-------roidb.py
----utils:
-------blob.py
-------timer.py
----transform
–models:存放模型文件
–output:訓練完成後的輸出目錄
–tools:存放的是訓練和測試的Python文件
----_init_paths.py:用來初始化路徑的,也就是之後的路徑會join(path,*)
----compress_net.py:使用了SVD來壓縮參數的
----demo.py:測試自己的模型和數據
----eval_recall.py:評估函數
----reval.py:re-evaluate
----rpn_genetate.py:調用了rpn中的genetate函數。這裏,主要是一個封裝調用的過程,在這裏調用配置的參數、設置rpn的test參數,以及輸入輸出等操作。
----test_net.py:測試fast rcnn網絡。主要就是一些參數配置。
----train_faster_rcnn_alt_opt.py
------訓練faster rcnn網絡使用交替的訓練,其包括的步驟爲:
--------RPN 1,使用imagenet model進行初liangzhangtupian始化參數,生成proposal,這裏存儲在mp_kwargs
--------fast rcnn 1,使用 imagenet model 進行初始化參數,使用剛剛生成的proposal進行fast rcnn的訓練
--------RPN 2使用 fast rcnn 中的參數進行初始化(這裏要注意哦),並生成proposal
--------fast rcnn 2,使用RPN 2 中的 model進行初始化參數,
----train_net.py:使用fast rcnn,訓練自己數據集的網絡模型。
----train_svms.py:使用最原始的RCNN網絡訓練post-hoc SVMs。

一、製作自己的數據集(跑該項目時未實現,下載的公共數據集voc)
1.獲取圖片
2.打好標籤
3.分爲訓練和測試類
4.完備數據集
二、訓練模型
1.安裝相關依賴項
$ sudo pip install cython ---------------Successfully installed cython-0.28.5
$ sudo pip install easydict--------------Successfully installed easydict-1.8
$ sudo apt-get install python-opencv
2.編譯相關文件和配置文件的修改
$ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
$ cd Wen/py-faster-rcnn/caffe-fast-rcnn
$ cp Makefile.config.example Makefile.config
$ gedit Makefile.config

修改makefile.config文件
若使用cudnn,則將# USE_CUDNN := 1 修改成: USE_CUDNN := 1
若使用的opencv版本是3的,則將# OPENCV_VERSION := 3 修改爲: OPENCV_VERSION := 3
需要使用python來編寫layer,將# WITH_PYTHON_LAYER := 1 修改爲 WITH_PYTHON_LAYER := 1
重要的一項 將# Whatever else you find you need goes here.下面的
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改爲:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

$ gedit Makefile

將:NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC (COMMONFLAGS):NVCCFLAGS+=DFORCEINLINESccbin=(COMMON_FLAGS) 替換:NVCCFLAGS += -D_FORCE_INLINES -ccbin=(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

3.編譯
~/Wen/py-faster-rcnn/lib$ make
~/Wen/py-faster-rcnn/caffe-fast-rcnn$ make -j8 && make pycaffe
----------error--------
./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’:
./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING’ not handled in switch [-Wswitch]
switch (status) { …

-------reslove--------
這是因爲當前版本的caffe的cudnn實現與系統所安裝的cudnn的版本不一致引起的。
a.將./caffe-fast-rcnn/include/caffe/util/cudnn.hpp 換成最新版的caffe裏的cudnn的實現,即相應的cudnn.hpp.
b. 將./caffe-fast-rcnn/include/caffe/layers裏的,所有以cudnn開頭的文件,例如cudnn_conv_layer.hpp,都替換成最新版的caffe裏的相應的同名文件。
c.將./caffe-fast-rcnn/src/caffe/layer裏的,所有以cudnn開頭的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu,都替換成最新版的caffe裏的相應的同名文件。

---------error--------
src/caffe/layers/cudnn_conv_layer.cu(85): error: identifier “cudnnConvolutionBackwardFilter_v3” is undefined

---------reslove----------------------------
打開cudnn_conv_layer.cu,刪除V3

---------error------------------------------
python/caffe/_caffe.cpp:11:31: fatal error: numpy/arrayobject.h: No such file or directory
compilation terminated.
Makefile:489: recipe for target ‘python/caffe/_caffe.so’ failed
make: *** [python/caffe/_caffe.so] Error 1

--------reslove---------------------------
將Makefile.config中相應位置加一個local:
即,將原來的:
PYTHON_INCLUDE := /usr/include/python2.7
/usr/lib/python2.7/dist-packages/numpy/core/include
修改爲:
PYTHON_INCLUDE := /usr/include/python2.7
/usr/local/lib/python2.7/dist-packages/numpy/core/include

4.下載Pascal Voc 2007
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
在data目錄下,新建一個VOCdevkit2007文件夾,將這三個文件解壓至此
5.下載ImageNet預訓練模型
在py-faster-rcnn根目錄下執行腳本:
$ ./data/scripts/fetch_imagenet_models.sh
由於無法連接到國外網址,一直下載不下來換了一個網址下載http://pan.baidu.com/s/1hsxx8OW
6.運行
aibc@aibc:~$ ./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc
#./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [–set …]
GPU_ID is the GPU you want to train on
NET in {ZF, VGG_CNN_M_1024, VGG16} is the network arch to use
–set … allows you to specify fast_rcnn.config options, e.g.
–set EXP_DIR seed_rng1701 RNG_SEED 1701

---------error------------
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/config.py”, line 259, in cfg_from_file
import yaml
ImportError: No module named yaml

----------reslove----------
$ sudo apt-get install python-yaml

------------------error-----
Check failure stack trace: ***
./experiments/scripts/faster_rcnn_end2end.sh: line 57: 19081 Aborted (core dumped)
./tools/train_net.py --gpu GPUIDsolvermodels/{GPU_ID} --solver models/{PT_DIR}/NET/fasterrcnnend2end/solver.prototxtweightsdata/imagenetmodels/{NET}/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/{NET}.v2.caffemodel --imdb ${TRAIN_IMDB} --iters ${ITERS} --cfg
experiments/cfgs/faster_rcnn_end2end.yml ${EXTRA_ARGS}

----------------reslove---------------
修改ImageNet_model的路徑,確保在./data下。
------------error---------------------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 157, in train_net
pretrained_model=pretrained_model)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 51, in init
pb2.text_format.Merge(f.read(), self.solver_param)
AttributeError: ‘module’ object has no attribute ‘text_format’
------------reslove-------------------
解決辦法1:sudo pip install protobuf==2.5.0
解決方法2:在文件./lib/fast_rcnn/train.py增加一行import google.protobuf.text_format 即可解決問題

-------------error----------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 161, in train_net
model_paths = sw.train_model(max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 102, in train_model
self.solver.step(1)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 66, in forward
rois_per_image, self._num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 191, in _sample_rois
_get_bbox_regression_labels(bbox_target_data, num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 127, in _get_bbox_regression_labels
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
TypeError: slice indices must be integers or None or have an index method

----------------reslove-------------
百度了一下說是numpy版本高,用了sudo pip install -U numpy==1.11.0,又出現了問題然後回到了上述問題
修改 /home/lzx/py-faster-rcnn/lib/rpn/proposal_target_layer.py,轉到123行:
for ind in inds:
cls = clss[ind]
start = 4 * cls
end = start + 4
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights
這裏的ind,start,end都是 numpy.int 類型,這種類型的數據不能作爲索引,所以必須對其進行強制類型轉換,如下:
for ind in inds:
ind = int(ind)
cls = clss[ind]
start = int(4 * cls)
end = int(start + 4)
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights

---------------error-----------------------------------------------------------------------------------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 161, in train_net
model_paths = sw.train_model(max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 102, in train_model
self.solver.step(1)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 66, in forward
rois_per_image, self._num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 167, in _sample_rois
fg_inds = npr.choice(fg_inds, size=fg_rois_per_this_image, replace=False)
File “mtrand.pyx”, line 1192, in mtrand.RandomState.choice
TypeError: ‘numpy.float64’ object cannot be interpreted as an index

---------------reslove------------------------------------------------------
a. /home/xxx/py-faster-rcnn/lib/roi_data_layer/minibatch.py
將第26行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改爲:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

b. /home/xxx/py-faster-rcnn/lib/datasets/ds_utils.py
將第12行:hashes = np.round(boxes * scale).dot(v)
改爲:hashes = np.round(boxes * scale).dot(v).astype(np.int)

c. /home/xxx/py-faster-rcnn/lib/fast_rcnn/test.py
將第129行: hashes = np.round(blobs[‘rois’] * cfg.DEDUP_BOXES).dot(v)
改爲: hashes = np.round(blobs[‘rois’] * cfg.DEDUP_BOXES).dot(v).astype(np.int)

d. /home/xxx/py-faster-rcnn/lib/rpn/proposal_target_layer.py
將第60行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改爲:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

三、測試模型
1.將py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel,拷貝到py-faster-rcnn/data/faster_rcnn_models下
2.將你需要進行test的images放在py-faster-rcnn/data/demo下
3.修改py-faster-rcnn/tools/demo.py文件
CLASSES = (‘background’, ‘captcha’) #參考你自己的類別寫

NETS = {‘vgg16’: (‘VGG16’,
‘VGG16_faster_rcnn_final.caffemodel’),
‘zf’: (‘ZF’,
‘ZF_faster_rcnn_final.caffemodel’) #改成你訓練得到的model的name

im_names = [‘1559.jpg’,‘1564.jpg’] # 改成自己的test image的name
-------------error----------------------------------------------------
Traceback (most recent call last):
File “./tools/demo.py”, line 119, in
prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],
KeyError: ‘vgg16’

-----------reslove--------
$ ./tools/demo.py --net zf

參考鏈接:
http://lib.csdn.net/article/deeplearning/61652
https://blog.csdn.net/sinat_30071459/article/details/51332084
https://blog.csdn.net/sinat_30071459/article/details/50723212

python版本faster-rcnn訓練過程看:
http://blog.csdn.net/sinat_30071459/article/details/51332084
https://www.cnblogs.com/zjutzz/p/5983160.html

發佈了22 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章