《使用VS2013呼叫caffe》專案配置教程
阿新 • • 發佈:2019-01-08
c++呼叫caffe在caffe的example目錄裡面有。這篇部落格並不分析呼叫的程式碼,而是VS2013對caffe呼叫的配置。
執行caffe所用到的第三方庫可以在這裡下載,該庫已經包含opencv3.0。將第三方庫解壓至caffe主目錄。
這裡以配置release模式x64程式為例。以下編譯CPU模式。
首先需要設定系統的環境變數。在環境變數的path中新增第三方庫的bin目錄。例如:E:\caffe\caffe-windows-master\3rdparty\bin
接下來的VS工程的配置
首先我們建立一個專案,新建專案->控制檯程式->空專案。
1. 新增VC++包含目錄
包含目錄有三個:
.\3rdparty\include
.\include
.\src
2. 新增庫目錄
庫目錄有兩個:
.\bin
.\3rdparty\lib
3. 新增附加依賴項
caffelib.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib libprotobuf.lib hdf5_tools.lib hdf5_hl_fortran.lib hdf5_fortran.lib hdf5_hl_f90cstub.lib hdf5_f90cstub.lib hdf5_cpp.lib hdf5_hl_cpp.lib hdf5_hl.lib hdf5.lib zlib.lib szip.lib opencv_world300.lib shlwapi.lib leveldb.lib libglog.lib lmdb.lib libopenblas.dll.a libgflags.lib
4. 新增前處理器定義
_VARIADIC_MAX=10
WIN32
NDEBUG
_CONSOLE
CPU_ONLY
USE_OPENCV
USE_LEVELDB
USE_LMDB
_SCL_SECURE_NO_WARNINGS
5. 執行庫改成多執行緒DLL
專案屬性- -> C/C++ --> 執行庫 --> 多執行緒DLL(/MD)
6. 編譯執行
將caffe裡example中cpp_classification的程式碼複製過來,編譯執行。
7. 在程式碼中新增標頭檔案
如此執行一般來說會報錯。除非你直接在官方的解決方案上建立的工程。
報錯資訊為:
F0519 14:54:12.494139 14504 layer_factory.hpp:77] Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: SoftMax (known types: Convolution )
解決的方法很簡單。新建一個頭檔案,比如:head.h。在標頭檔案中新增如下程式碼:
#include "caffe/common.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/concat_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
namespace caffe
{
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(ConcatLayer);
}
看自己報錯的資訊,少什麼層就加上什麼。每個網路用到的層不一樣,所以以上程式碼並不是對所有工程通用。