由於深度學習的種種優勢,使我們對於深度學習的使用越來越頻繁。很多時候,我們都需要在自己的項目中配置caffe環境,來調用caffe網絡模型完成自己的任務。今天我主要講的關於"在自己的項目中配置caffe環境所遇到問題的相關說明和解答",因為項目的需要,需要在項目中配置caffe來完成VGG網絡的分類任務。大概花費了一周的時間,總算成功了。期間,也是輾轉反側,遇到了諸多問題,查閱了諸多資料,但是有些問題並沒有講的非常清楚。這里,我就這些遇到的問題,根據自己的情況以及解決的辦法跟大家分享一下。
首先,需要准備好安裝環境:
(1)已編譯好的caffe https://github.com/Microsoft/caffe,必須是已經編譯好的caffe工程,因為我們需要用到caffe第三方庫,以及編譯生成的libcaffe.lib
(2)vs2013 因為caffe需要vs2013的編譯器,所以最好是vs2013
(3)GPU環境的還要安裝CUDA,Cudnn。可以去官網根據自己的電腦配置下載安裝
(4)如果需要做UI的話,也可以在vs中配置相關界面工具,比如QT
然后,環境已經准備好了,接下來就是新建vs工程了,這里可以根據自己的情況新建自己的項目,比如win32控制台程序等。由於,我選擇用QT來做c++應用的界面,所有我新建的是QT GUI Application。
工程新建完成后,接下來就是各種include,lib,dll的配置問題了。我這里要說的是vs2013,x64,Debug,GPU模式。如果你是Release模式,那么就將下面所有的Debug改為Release即可。具體地,打開屬性->VC++目錄
需要說明的是,這里面你需要根據你的caffe環境和CUDA的安裝路徑,進行更改,否則會報錯找不到文件等等
接下來是鏈接器->輸入
//debug opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_objdetect2410d.lib opencv_ts2410d.lib opencv_video2410d.lib caffe.lib libcaffe.lib cudart.lib cublas.lib curand.lib gflagsd.lib libglog.lib libopenblas.dll.a libprotobuf.lib leveldb.lib hdf5.lib hdf5_hl.lib Shlwapi.lib
最后,由於要用到caffe模型,那么必然會出現注冊層的問題,這里我們新建一個head.h的頭文件,然后在代碼中引用該頭文件即可。有人說,不這樣不行么,建議大家最好這樣,因為不這樣一般會報出"未知的層"等相關錯誤。比如:
head.h的內容為(注意,這里面的層必須至少要包含你用到的網絡的相關層,否則會出錯):
#include<caffe/common.hpp> #include "caffe/caffe.hpp" #include<caffe/proto/caffe.pb.h> #include<caffe/layers/batch_norm_layer.hpp> #include<caffe/layers/bias_layer.hpp> #include <caffe/layers/concat_layer.hpp> #include <caffe/layers/conv_layer.hpp> #include <caffe/layers/dropout_layer.hpp> #include<caffe/layers/input_layer.hpp> #include <caffe/layers/inner_product_layer.hpp> #include "caffe/layers/lrn_layer.hpp" #include <caffe/layers/pooling_layer.hpp> #include <caffe/layers/relu_layer.hpp> #include "caffe/layers/softmax_layer.hpp" #include<caffe/layers/scale_layer.hpp> namespace caffe { extern INSTANTIATE_CLASS(BatchNormLayer); extern INSTANTIATE_CLASS(BiasLayer); extern INSTANTIATE_CLASS(InputLayer); REGISTER_LAYER_CLASS(Input); extern INSTANTIATE_CLASS(InnerProductLayer); extern INSTANTIATE_CLASS(DropoutLayer); extern INSTANTIATE_CLASS(ConvolutionLayer); REGISTER_LAYER_CLASS(Convolution); extern INSTANTIATE_CLASS(ReLULayer); REGISTER_LAYER_CLASS(ReLU); extern INSTANTIATE_CLASS(PoolingLayer); REGISTER_LAYER_CLASS(Pooling); extern INSTANTIATE_CLASS(LRNLayer); REGISTER_LAYER_CLASS(LRN); extern INSTANTIATE_CLASS(SoftmaxLayer); REGISTER_LAYER_CLASS(Softmax); extern INSTANTIATE_CLASS(ScaleLayer); extern INSTANTIATE_CLASS(ConcatLayer); }
這樣,完成后就可以對工程進行第一次編譯,在編譯時,可能會出現如下主要問題:
1 出現某一層重復注冊的問題:
這時,你就要根據錯誤提示,找到是哪個層重復注冊了,就將相應的REGISTER_LAYER_CLASS(Convolution);雙斜杠掉即可,最后類似於這樣:
#include<caffe/common.hpp> #include "caffe/caffe.hpp" #include<caffe/proto/caffe.pb.h> #include<caffe/layers/batch_norm_layer.hpp> #include<caffe/layers/bias_layer.hpp> #include <caffe/layers/concat_layer.hpp> #include <caffe/layers/conv_layer.hpp> #include <caffe/layers/dropout_layer.hpp> #include<caffe/layers/input_layer.hpp> #include <caffe/layers/inner_product_layer.hpp> #include "caffe/layers/lrn_layer.hpp" #include <caffe/layers/pooling_layer.hpp> #include <caffe/layers/relu_layer.hpp> #include "caffe/layers/softmax_layer.hpp" #include<caffe/layers/scale_layer.hpp> namespace caffe { extern INSTANTIATE_CLASS(BatchNormLayer); extern INSTANTIATE_CLASS(BiasLayer); extern INSTANTIATE_CLASS(InputLayer); //REGISTER_LAYER_CLASS(Input); extern INSTANTIATE_CLASS(InnerProductLayer); extern INSTANTIATE_CLASS(DropoutLayer); extern INSTANTIATE_CLASS(ConvolutionLayer); //REGISTER_LAYER_CLASS(Convolution); extern INSTANTIATE_CLASS(ReLULayer); //REGISTER_LAYER_CLASS(ReLU); extern INSTANTIATE_CLASS(PoolingLayer); //REGISTER_LAYER_CLASS(Pooling); extern INSTANTIATE_CLASS(LRNLayer); //REGISTER_LAYER_CLASS(LRN); extern INSTANTIATE_CLASS(SoftmaxLayer); //REGISTER_LAYER_CLASS(Softmax); extern INSTANTIATE_CLASS(ScaleLayer); extern INSTANTIATE_CLASS(ConcatLayer); }
2 如果出現相關dll文件找不到的系統錯誤情況:
兩種辦法:(1)在D:\Resource\caffe\caffe-windows\Build\x64\Debug(如果你是Release就在Release文件中)文件下,找到對應的dll文件,將其拷貝到項目生成的Debug文件夾下面即可,比如:
(2)在項目文件下新建一個dll文件夾,將D:\Resource\caffe\caffe-windows\Build\x64\Debug文件下所有的dll文件拷貝進dll文件夾中,並在屬性->配置屬性->調試->環境中添加:path=E:\qt\ImageRetrival\dll;再編譯即可。
總結:上面的兩個是在新建項目中配置caffe出現最多的問題,當然也會有其他的問題,這時就需要你根據具體的問題,查閱相關文檔或者自己調試,找出問題,對症下葯了。可能這需要花費很多時間,但是不要輕言放棄,相信最后都會解決的。我前后花費了一周多的時間,也是每天不想再調了,但是咬咬牙還是堅持着去解決問題。最后,祝大家都能順利配置成功,如果有什么問題可以在下面給我留言,我一定依照我的經驗給大家一一解答,希望能幫到大家,少走一些彎路。
另外:有過有人對於如何在自己的工程里面如何通過caffe加載你要用的網絡模型的話,我給大家提供一個鏈接,該鏈接對於如何通過caffe調用網絡模型提取特征,以代碼的形式給予了詳細解答:http://blog.csdn.net/mr_curry/article/details/52456548,后續我會補上關於通過caffe調用網絡模型提取Mat類型特征的相關預處理及后處理操作詳細代碼,比如設置與網絡模型要求相同的圖像大小,通道類型,加載並減去均值等預處理,以及后續的對高維度的特征進行歸一化,最后保存到容器中后處理。歡迎大家一起交流探討!