vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中

继上一篇文章,现博主调用深度学习框架,用到自己的项目中


搜索了好多网上的资料,也没用特别具体的教程可以拿来用,博主经过努力终于配置成功了,分享给大家,让大家少走一些弯路


一上来不知道如何去写,毕竟博主也是现学现卖,不多说,直接上干货



一、首先博主默认大家已经将Qt(博主的版本是 Qt 5.6.1) 与 vs2013 配置好了,教程嘛大家自行在网上搜索,一大筐。


接下来大体分为配置头文件与加载静态链接库两部分

二、配置头文件

博主配置编译的 caffe 是微软的,现在微软的维护的 caffe 已经不更新维护了,大家可以下载其他版本。

这里博主也默认大家已经将 caffe 配置好,并且编译成功(博主编译的是 64 Debug 版本的)。

1、这是接下来要用到的文件夹(博主文件夹所在的位置是 E:\Caffe 大家可以根据自己文件的位置配置)


              vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中_第1张图片


            第一个是微软解压出来的 caffe ,第二个是 cuda ,第三个是caffe 用到的一些第三方工具


2、下面我们要将我文件夹中的头文件配置到 vs2013 中

一般博主喜欢新建一个属性文件,然后配置好后,每次将属性文件加载到自己的工程中(右键->添加新项目属性表)


下面我们将caffe 中用到的头文件加到属性表中

  • 先配置包含目录

vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中_第2张图片

下面编辑加载头文件

vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中_第3张图片

       这都是博主的目录文件大家看清楚,根据自己的目录自行配置

二、配置库目录以及加载静态库文件

vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中_第4张图片


这都是博主的目录文件大家看清楚,根据自己的目录自行配置


  • 加载静态文件


文件名:(大家可以复制粘贴)

libcaffe.lib
libprotobuf.lib
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_ml2410d.lib
opencv_objdetect2410d.lib
opencv_ts2410d.lib
opencv_video2410d.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
OpenCL.lib


注意这里我的 opencv 是2.4.10 版本的 ,复制粘贴的童鞋,注意自己的版本号,加以修改


到目前为止,已经将 caffe 的头文件已经静态库加载进来了


三、接下来编写例子测试自己的配置是否成功

博主自己用Qt编写了一个 UI 用来,主要功能是加载一张手写数字图像,识别其数字

界面如下:

vs2013 + Qt 5.6 + caffe — Qt 调用 caffe 生成的静态链接库用到自己的工程(项目)中_第5张图片

界面比较垃圾,博主也是测试一下,后期会加以完善


大家也可以用下面的简单例子,不用 Qt 加以测试

代码如下:

main.cpp

// Copyright 2014 BVLC and contributors.
//
// This is a simple script that allows one to quickly test a network whose
// structure is specified by text format protocol buffers, and whose parameter
// are loaded from a pre-trained network.
// Usage:
//    test_net net_proto pretrained_net_proto iterations [CPU/GPU]


#include "CaffeHeaderFiles.h"
#include "Caffe_PreDefine.h"
#include 
#include   
#include 

namespace caffe
{
	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(MemoryDataLayer);
}

using namespace caffe;  // NOLINT(build/namespaces)
using namespace std;
using namespace cv;

int main() 
{
	caffe::Net*net = caffe_predefine();
	caffe::MemoryDataLayer* memory_layer = (caffe::MemoryDataLayer *)net->layers()[0].get();
	Mat Image = imread("4.jpg", 0);
	cout << Image.channels();
	std::vector test = { Image };
	std::vector testLabel = { 0 };
	std::vector test_vector;
	memory_layer->AddMatVector(test, testLabel);
	test.clear();
	testLabel.clear();
	std::vector*> input_vec;
	net->Forward(input_vec);
	boost::shared_ptr> prob = net->blob_by_name("prob");
	float* begin = nullptr;
	float* end = nullptr;
	begin = prob->mutable_cpu_data();
	end = begin + prob->channels();
	CHECK(begin != nullptr);
	CHECK(end != nullptr);
	std::vector CatVector{ begin, end };
	vector::iterator iter_ = CatVector.begin();
	for (; iter_ != CatVector.end(); ++iter_)
		cout << *iter_ << endl;

	vector::iterator max_iter = max_element(CatVector.begin(), CatVector.end());
	cout << "The max score is: " << *max_iter << endl << "The max_label is: " << distance(CatVector.begin(), max_iter) << endl;
	return 0;
}


CaffeHeaderFiles.h

#ifndef CAFFE_HEADER_FILES_
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "caffe/layers/input_layer.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/caffe.hpp"
#include "caffe/layers/pooling_layer.hpp"  
#include "caffe/layers/lrn_layer.hpp"  
#include "caffe/layers/softmax_layer.hpp" 
#include "caffe/layers/memory_data_layer.hpp"
#define CAFFE_HEADER_FILES_
#endif //CAFFE_HEADER_FILES_

Caffe_PreDefine.h

#ifndef CAFFE_PREDEFINE_
#define CAFFE_PREDEFINE_
#include 

template 
caffe::Net* Net_Init_Load(std::string param_file, std::string pretrained_param_file
	, caffe::Phase phase);
caffe::Net* caffe_predefine();

#endif // !CAFFE_PREDEFINE_

Caffe_PreDefine.cpp

#include "Caffe_PreDefine.h"

template 
caffe::Net* Net_Init_Load(std::string param_file, std::string pretrained_param_file
	, caffe::Phase phase)
{
	caffe::Caffe::set_mode(caffe::Caffe::GPU);
	caffe::Net* net(new caffe::Net(param_file, caffe::TEST));
	net->CopyTrainedLayersFrom(pretrained_param_file);
	return net;
}

caffe::Net* caffe_predefine()
{
	return Net_Init_Load("lenet.prototxt"
		, "lenet_iter_10000.caffemodel"
		, caffe::TEST);
}

测试结果:  

参考博文:http://blog.csdn.net/mr_curry/article/details/52443126


你可能感兴趣的:(caffe学习之路)