本身的Qt GUI 項目+vs2013+opencv+caffe環境配置

  因爲深度學習的種種優點,使咱們對於深度學習的使用愈來愈頻繁。不少時候,咱們都須要在本身的項目中配置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類型特徵的相關預處理及後處理操做詳細代碼,好比設置與網絡模型要求相同的圖像大小,通道類型,加載並減去均值等預處理,以及後續的對高維度的特徵進行歸一化,最後保存到容器中後處理。歡迎你們一塊兒交流探討!

相關文章
相關標籤/搜索