参考博客:
https://blog.csdn.net/muyouhang/article/details/54773265
https://blog.csdn.net/hhh0209/article/details/79830988
新建caffe的属性表,caffe_x64_release.props
将NugetPackages,caffe,CUDA中的头文件加进去
属性-C/C++-附加包含目录:
D:\caffe20190311\NugetPackages\OpenCV.2.4.10\build\native\include D:\caffe20190311\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include D:\caffe20190311\NugetPackages\protobuf-v120.2.6.1\build\native\include D:\caffe20190311\NugetPackages\glog.0.3.3.0\build\native\include D:\caffe20190311\NugetPackages\gflags.2.1.2.1\build\native\include D:\caffe20190311\NugetPackages\boost.1.59.0.0\lib\native\include D:\caffe20190311\caffe-master\include D:\caffe20190311\caffe-master\include\caffe C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
将NugetPackages,caffe生成的,CUDA中静态库加入进去
属性-链接器-常规-附加库目录:
D:\caffe20190311\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Release D:\caffe20190311\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64 D:\caffe20190311\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64 D:\caffe20190311\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib D:\caffe20190311\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamic D:\caffe20190311\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Release D:\caffe20190311\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib D:\caffe20190311\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib D:\caffe20190311\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib D:\caffe20190311\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib D:\caffe20190311\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib D:\caffe20190311\caffe-master\Build\x64\Release C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64
将一些动态库加入进去
属性-链接器-输入-附加依赖项:
libcaffe.lib
libprotobuf.lib
libglog.lib
gflags.lib
libopenblas.dll.a
hdf5.lib
hdf5_hl.lib
cublas.lib
cublas_device.lib
cuda.lib
cudadevrt.lib
cudnn.lib
cudart.lib
cufft.lib
cudart_static.lib
cufftw.lib
cusparse.lib
cusolver.lib
curand.lib
nppc.lib
opencv_highgui2410.lib
opencv_core2410.lib
opencv_imgproc2410.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
即可配置好caffe_x64_release.props的属性表
调用caffe,输入prototxt和caffemodel文件,输出每个层的名字:
caffe_layer.h
#include<caffe/common.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> #include<caffe/layers/prelu_layer.hpp> namespace caffe { extern INSTANTIATE_CLASS(BatchNormLayer); extern INSTANTIATE_CLASS(BiasLayer); extern INSTANTIATE_CLASS(InputLayer); 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); extern INSTANTIATE_CLASS(PReLULayer); }
main.cpp
#include<caffe.hpp> #include <string> #include <vector> #include "caffe_layer.h" using namespace caffe; using namespace std; int main() { string net_file = "./infrared_mbfnet/antispoof-infrared.prototxt"; //prototxt文件 string weight_file = "./infrared_mbfnet/antispoof-infrared.caffemodel"; //caffemodel文件 Caffe::set_mode(Caffe::CPU); //Caffe::SetDevice(0); Phase phase = TEST; boost::shared_ptr<Net<float>> net(new caffe::Net<float>(net_file, phase)); net->CopyTrainedLayersFrom(weight_file); vector<string> blob_names = net->blob_names(); for (int i = 0; i < blob_names.size(); i++){ cout << blob_names.at(i) << endl; } system("pause"); return 0; }
注意:若模型中用到了,prelu层,需要在caffe_layer.h中加入prelu_layer.hpp的头文件,并在代码中声明一下,extern INSTANTIATE_CLASS(PReLULayer),否则,会报错,找不到该层。
运行结果:
用c++调用caffe做前向:
在caffe目录中,./caffe-master/examples/cpp_classification/classification.cpp 用该文件做前向。