windows下用c++调用caffe做前向

参考博客:

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  用该文件做前向。

猜你喜欢

转载自www.cnblogs.com/k7k8k91/p/10619572.html