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);
}
看自己报错的信息,少什么层就加上什么。每个网络用到的层不一样,所以以上代码并不是对所有工程通用。