1. 程式人生 > >《使用VS2013呼叫caffe》專案配置教程

《使用VS2013呼叫caffe》專案配置教程

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);

}

看自己報錯的資訊,少什麼層就加上什麼。每個網路用到的層不一樣,所以以上程式碼並不是對所有工程通用。