1. 程式人生 > >Faster RCNN安裝以及Demo執行

Faster RCNN安裝以及Demo執行

1. 下載

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

2. 依賴庫安裝

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

3. 修改配置檔案

複製../caffe-fast-rcnn 的Makefile.config.example,然後重新命名為Makefile.config,修改Makefile.config 檔案

第一處
USE_CUDNN := 0

改為

USE_CUDNN := 1
第二處
CUDA_DIR := /usr/local/cuda

改為

CUDA_DIR := /usr/local/cuda-8.0
第三處

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include 
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 

改為

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux
-gnu/hdf5/serial/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
第四處

在終端中輸入python進入到python環境以後輸入下邊命令

import numpy as np  
np.get_include()  

這時會顯示numpy路徑,複製新增到

 PYTHON_INCLUDE := /usr/include/python2.7 \
        /usr/local/lib/python2.7/dist-packages/numpy/core/include

的後邊,否則就會報錯fatal error: numpy/arrayobject.h: No such file or directory

第五處

 # WITH_PYTHON_LAYER := 1

去掉註釋,改為

WITH_PYTHON_LAYER := 1

不然會在執行Demo的時候提示] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: PythonAborted (core dumped)

4. 檔案替換

因為py-faster-rcnn其cudnn實現為舊版本的實現,在現在的環境中編譯會出錯,需要將一部分檔案替換為最新的檔案

第一處

將./include/caffe/util/cudnn.hpp 換成最新版的caffe裡的cudnn的實現,即相應的cudnn.hpp.

第二處

將./include/caffe/layers裡的,所有以cudnn開頭的檔案,例如cudnn_conv_layer.hpp。 都替換成最新版的caffe裡的相應的同名檔案。

第三處

將./src/caffe/layer裡的,所有以cudnn開頭的檔案,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。

都替換成最新版的caffe裡的相應的同名檔案
不執行上邊的操作時,會報錯make: *** [.build_release/src/caffe/common.o] Error 1

5. 安裝

2.1 Cython模組編譯

cd lib
make -j

2.2 caffe和pycaffe的編譯

cd caffe-fast-rcnn
make -j && make pycaffe

6. 執行Demo

6.1 下載預訓練模型

cd py-faster-rcnn
./data/scripts/fetch_faster_rcnn_models.sh

因為Faster Rcnn釋出時間太早了,最近權重檔案已經失效了,可以使用這個百度雲連結進行下載,下載結束以後解壓,將解壓以後的檔案放到下邊的路徑../Data/faster_rcnn_models/
####6.2 執行Demo
就將終端的目錄設定為faster rcnn根目錄,執行下邊的程式就可以進行測試。

./tools/demo.py

不出意外的話會彈出一些圖片識別的結果圖,到此就安裝成功了。

7. 可能出現錯誤

錯誤1:TypeError: slice indices must be integers or None or have an index method

修改$FRCN_ROOT/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

修改為:

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

錯誤2:TypeError: 'numpy.float64' object cannot be interpreted as an index

這個報錯也是numpy的版本問題,需要修改原始碼。

1) $FRCN_ROOT/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)

2) $FRCN_ROOT/lib/datasets/ds_utils.py

將第12行:

hashes = np.round(boxes * scale).dot(v)

改為:

hashes = np.round(boxes * scale).dot(v).astype(np.int)

3) $FRCN_ROOT/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)

4) $FRCN_ROOT/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)

參考