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: Python
,Aborted (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)