自己的Qt GUI 項目+vs2013+opencv+caffe環境配置


  由於深度學習的種種優勢,使我們對於深度學習的使用越來越頻繁。很多時候,我們都需要在自己的項目中配置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類型特征的相關預處理及后處理操作詳細代碼,比如設置與網絡模型要求相同的圖像大小,通道類型,加載並減去均值等預處理,以及后續的對高維度的特征進行歸一化,最后保存到容器中后處理。歡迎大家一起交流探討!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM