1. 程式人生 > >Faster R-CNN的安裝及測試(Python版本和Matlab版本)

Faster R-CNN的安裝及測試(Python版本和Matlab版本)

rbg的Python版本

一、拉取原始碼

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

拉取完成後,在/home/cmwang/目錄下增加了py-faster-rcnn資料夾【cmwang是我的ubuntu使用者名稱】

二、安裝依賴

sudo apt-get install python-opencv

sudo pip install cython easydict

三、修改Makefile檔案

終端輸入

cd /home/cmwang/py-faster-rcnn/caffe-fast-rcnn/ 
cp
Makefile.config.example Makefile.config #備份Makefile gedit Makefile.config

使用python層
將# WITH_PYTHON_LAYER := 1修改為 WITH_PYTHON_LAYER := 1

呼叫matlab
將#MATLAB_DIR := / usr/local/MATLAB/R2015b 中的#去掉。

使用cudnn加速
將# USE_CUDNN := 1修改為USE_CUDNN := 1

保留# CPU_ONLY := 1不變,使用GPU執行faster r-cnn

四、編譯Cython模組

終端輸入

cd ~/py-faster-rcnn/lib/

make

五、編譯caffe和pycaffe & matcaffe

終端輸入

cd ~/py-faster-rcnn/caffe-fast-rcnn/ 
make -j8 && make pycaffe && make matcaffe

六、下載模型

終端輸入

cd ~/py-faster-rcnn/

./data/scripts/fetch_faster_rcnn_models.sh 

七、faster r-cnn測試

cd ~/py-faster-rcnn
/ ./tools/demo.py

Shaoqing Ren的MATLAB版本

一、拉取原始碼

拉取完成後,在/home/cmwang/目錄下增加了faster_rcnn_master資料夾【cmwang是我的ubuntu使用者名稱】

二、下載補充資料夾

unzip caffe-062f2431162165c658a42d717baf8b74918aa18e.zip
cp ./caffe-062f2431162165c658a42d717baf8b74918aa18e/ ./faster_rcnn-master/external/caffe/

三、修改Makefile檔案

終端輸入

cd /home/cmwang/faster_rcnn-master/external/caffe 
cp Makefile.config.example Makefile.config #備份Makefile 
gedit Makefile.config

使用python層
將# WITH_PYTHON_LAYER := 1修改為 WITH_PYTHON_LAYER := 1

呼叫matlab
將#MATLAB_DIR := / usr/local/MATLAB/R2015b 中的#去掉。

使用cudnn加速
將# USE_CUDNN := 1修改為USE_CUDNN := 1

保留# CPU_ONLY := 1不變,使用GPU執行faster r-cnn

四、編譯caffe和pycaffe & matcaffe

終端輸入

cd ~faster_rcnn-master/external/caffe
make all -j8 && make test -j8 && make runtest -j8 && make pycaffe && make matcaffe

五、下載模型

終端輸入

cd ~/faster_rcnn-master/

run fetch_data/fetch_model_VGG16.m

六、執行

cd ~/faster_rcnn-master/ 
run faster_rcnn_build.m
run startup.m

七、faster r-cnn測試

cd ~/faster_rcnn-master/ 
run ./experiments/script_faster_rcnn_demo.m

備註: Matlab裡面有內建的

常出現的問題1

這裡寫圖片描述

這是由於當前版本的caffe中cudnn實現與系統所安裝的cudnn的版本不一致引起,rbgirshick的py-faster-rcnn其cudnn實現為舊版本的實現,所有出現了以上問題。

cudnn-7.0-linux-x64-v4.0-prod.tgz不會出現此問題
cudnn-7.5-linux-x64-v5.1.tgz會出現同樣問題
cudnn-8.0-linux-x64-v5.1.tgz會出現同樣問題

解決辦法

①將/home/cmwang/py-faster-rcnn/caffe-fast-rcnn/include/caffe/util/cudnn.hpp 換成最新版caffe裡的相應目錄下的cudnn.hpp;

②將/home/cmwang/py-faster-rcnn/caffe-fast-rcnn/include/caffe/layers/下所有cudnn開頭的檔案都替換為最新版caffe裡相應目錄下的同名檔案;

③將/home/cmwang/py-faster-rcnn/caffe-fast-rcnn/src/caffe/layer下所有cudnn開頭的檔案都替換為最新版caffe裡相應目錄下的同名檔案

常出現的問題2

這裡寫圖片描述

出現找不到hdf5.h錯誤;

解決辦法:終端輸入

cd /home/cmwang/py-faster-rcnn/caffe-fast-rcnn/ 
gedit Makefile.config 
在INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include 後面打上一個空格,然後新增/usr/include/hdf5/serial

如果沒有這一句可能會報一個找不到hdf5.h的錯誤。

常出現的問題3

CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/common.cpp
CXX src/caffe/net.cpp
CXX src/caffe/internal_thread.cpp
CXX src/caffe/layers/cudnn_softmax_layer.cpp
CXX src/caffe/layers/hinge_loss_layer.cpp
CXX src/caffe/layers/relu_layer.cpp
CXX src/caffe/layers/contrastive_loss_layer.cpp
CXX src/caffe/layers/elu_layer.cpp
CXX src/caffe/layers/hdf5_output_layer.cpp
CXX src/caffe/layers/cudnn_pooling_layer.cpp
CXX src/caffe/layers/deconv_layer.cpp
CXX src/caffe/layers/memory_data_layer.cpp
CXX src/caffe/layers/eltwise_layer.cpp
CXX src/caffe/layers/softmax_loss_layer.cpp
CXX src/caffe/layers/silence_layer.cpp
CXX src/caffe/layers/power_layer.cpp
CXX src/caffe/layers/exp_layer.cpp
CXX src/caffe/layers/threshold_layer.cpp
CXX src/caffe/layers/tanh_layer.cpp
CXX src/caffe/layers/cudnn_lrn_layer.cpp
CXX src/caffe/layers/data_layer.cpp
CXX src/caffe/layers/base_conv_layer.cpp
CXX src/caffe/layers/lstm_unit_layer.cpp
CXX src/caffe/layers/accuracy_layer.cpp
CXX src/caffe/layers/softmax_layer.cpp
CXX src/caffe/layers/im2col_layer.cpp
CXX src/caffe/layers/lstm_layer.cpp
CXX src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp
CXX src/caffe/layers/cudnn_relu_layer.cpp
CXX src/caffe/layers/image_data_layer.cpp
CXX src/caffe/layers/reshape_layer.cpp
CXX src/caffe/layers/window_data_layer.cpp
CXX src/caffe/layers/split_layer.cpp
CXX src/caffe/layers/hdf5_data_layer.cpp
CXX src/caffe/layers/flatten_layer.cpp
CXX src/caffe/layers/cudnn_lcn_layer.cpp
CXX src/caffe/layers/input_layer.cpp
CXX src/caffe/layers/rnn_layer.cpp
CXX src/caffe/layers/recurrent_layer.cpp
CXX src/caffe/layers/inner_product_layer.cpp
CXX src/caffe/layers/reduction_layer.cpp
CXX src/caffe/layers/multinomial_logistic_loss_layer.cpp
CXX src/caffe/layers/infogain_loss_layer.cpp
CXX src/caffe/layers/bias_layer.cpp
CXX src/caffe/layers/filter_layer.cpp
CXX src/caffe/layers/batch_reindex_layer.cpp
CXX src/caffe/layers/slice_layer.cpp
CXX src/caffe/layers/argmax_layer.cpp
CXX src/caffe/layers/prelu_layer.cpp
CXX src/caffe/layers/dropout_layer.cpp
CXX src/caffe/layers/absval_layer.cpp
CXX src/caffe/layers/bnll_layer.cpp
CXX src/caffe/layers/sigmoid_layer.cpp
CXX src/caffe/layers/concat_layer.cpp
CXX src/caffe/layers/dummy_data_layer.cpp
CXX src/caffe/layers/base_data_layer.cpp
CXX src/caffe/layers/log_layer.cpp
CXX src/caffe/layers/crop_layer.cpp
CXX src/caffe/layers/cudnn_tanh_layer.cpp
CXX src/caffe/layers/pooling_layer.cpp
CXX src/caffe/layers/parameter_layer.cpp
CXX src/caffe/layers/euclidean_loss_layer.cpp
CXX src/caffe/layers/mvn_layer.cpp
CXX src/caffe/layers/lrn_layer.cpp
CXX src/caffe/layers/loss_layer.cpp
CXX src/caffe/layers/conv_layer.cpp
CXX src/caffe/layers/cudnn_sigmoid_layer.cpp
CXX src/caffe/layers/scale_layer.cpp
CXX src/caffe/layers/tile_layer.cpp
CXX src/caffe/layers/embed_layer.cpp
CXX src/caffe/layers/neuron_layer.cpp
CXX src/caffe/layers/cudnn_conv_layer.cpp
CXX src/caffe/layers/batch_norm_layer.cpp
CXX src/caffe/layers/spp_layer.cpp
CXX src/caffe/layer_factory.cpp
CXX src/caffe/blob.cpp
CXX src/caffe/layer.cpp
CXX src/caffe/data_transformer.cpp
CXX src/caffe/syncedmem.cpp
CXX src/caffe/util/blocking_queue.cpp
CXX src/caffe/util/db_lmdb.cpp
CXX src/caffe/util/benchmark.cpp
CXX src/caffe/util/io.cpp
CXX src/caffe/util/insert_splits.cpp
CXX src/caffe/util/hdf5.cpp
CXX src/caffe/util/cudnn.cpp
CXX src/caffe/util/signal_handler.cpp
CXX src/caffe/util/db.cpp
CXX src/caffe/util/math_functions.cpp
CXX src/caffe/util/upgrade_proto.cpp
CXX src/caffe/util/im2col.cpp
CXX src/caffe/util/db_leveldb.cpp
CXX src/caffe/solvers/adam_solver.cpp
CXX src/caffe/solvers/adadelta_solver.cpp
CXX src/caffe/solvers/adagrad_solver.cpp
CXX src/caffe/solvers/sgd_solver.cpp
CXX src/caffe/solvers/rmsprop_solver.cpp
CXX src/caffe/solvers/nesterov_solver.cpp
CXX src/caffe/data_reader.cpp
CXX src/caffe/parallel.cpp
CXX src/caffe/solver.cpp
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/ld: cannot find -lhdf5_hl
/usr/bin/ld: cannot find -lhdf5
collect2: error: ld returned 1 exit status
Makefile:566: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

解決方法

修改Makefile 檔案(注意不是)Makefile.config 
將裡面的
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5

改為LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

常出現的問題4

CXX/LD -o .build_release/tools/convert_imageset.bin
.build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)' .build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator >&, std::vector<int, std::allocator > const&)'
.build_release/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)'
collect2: error: ld returned 1 exit status
make: *** [.build_release/tools/convert_imageset.bin] Error 1


CXX/LD -o .build_release/test/test_all.testbin src/caffe/test/test_caffe_main.cpp

LD .build_release/src/caffe/test/test_threshold_layer.o
.build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)' .build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator >&, std::vector<int, std::allocator > const&)'
.build_release/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)'
collect2: error: ld returned 1 exit status
make: *** [.build_release/test/test_threshold_layer.testbin] Error 1

Maybe it is the related with OpenCv.

解決方法

add "opencv_imgcodecs" in Makefile.(LIBRARIES += glog gflags protobuf leveldb snappy 
lmdb boost_system hdf5_hl hdf5 m 
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)

常出現的問題5

執行make runtest這一命令之後,遇到了奇葩的問題”Unknown V1LayerParameter Layer type: 40”。如下圖:
這裡寫圖片描述

解決方案

在這個檔案上面(external/caffe/src/caffe/util/upgrade_proto.cpp)。我們需要補上Reshape,ROIPooling以及SmoothL1Loss這三個層,具體見下:


case V1LayerParameter_LayerType_THRESHOLD:
return "Threshold";
case V1LayerParameter_LayerType_RESHAPE:
return "Reshape";
case V1LayerParameter_LayerType_ROIPOOLING:
return "ROIPooling";`
case V1LayerParameter_LayerType_SMOOTH_L1_LOSS:
return "SmoothL1Loss";

若還有其他的問題敬請檢視

參考文獻: