因爲深度學習的種種優點,使咱們對於深度學習的使用愈來愈頻繁。不少時候,咱們都須要在本身的項目中配置caffe環境,來調用caffe網絡模型完成本身的任務。今天我主要講的關於"在本身的項目中配置caffe環境所遇到問題的相關說明和解答",由於項目的須要,須要在項目中配置caffe來完成VGG網絡的分類任務。大概花費了一週的時間,總算成功了。期間,也是展轉反側,遇到了諸多問題,查閱了諸多資料,可是有些問題並無講的很是清楚。這裏,我就這些遇到的問題,根據本身的狀況以及解決的辦法跟你們分享一下。c++
首先,須要準備好安裝環境:git
(1)已編譯好的caffe https://github.com/Microsoft/caffe,必須是已經編譯好的caffe工程,由於咱們須要用到caffe第三方庫,以及編譯生成的libcaffe.libgithub
(2)vs2013 由於caffe須要vs2013的編譯器,因此最好是vs2013windows
(3)GPU環境的還要安裝CUDA,Cudnn。能夠去官網根據本身的電腦配置下載安裝api
(4)若是須要作UI的話,也能夠在vs中配置相關界面工具,好比QT網絡
而後,環境已經準備好了,接下來就是新建vs工程了,這裏能夠根據本身的狀況新建本身的項目,好比win32控制檯程序等。因爲,我選擇用QT來作c++應用的界面,全部我新建的是QT GUI Application。ide
工程新建完成後,接下來就是各類include,lib,dll的配置問題了。我這裏要說的是vs2013,x64,Debug,GPU模式。若是你是Release模式,那麼就將下面全部的Debug改成Release便可。具體地,打開屬性->VC++目錄工具
須要說明的是,這裏面你須要根據你的caffe環境和CUDA的安裝路徑,進行更改,不然會報錯找不到文件等等學習
接下來是連接器->輸入ui
//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類型特徵的相關預處理及後處理操做詳細代碼,好比設置與網絡模型要求相同的圖像大小,通道類型,加載並減去均值等預處理,以及後續的對高維度的特徵進行歸一化,最後保存到容器中後處理。歡迎你們一塊兒交流探討!