继上一篇文章,现博主调用深度学习框架,用到自己的项目中
搜索了好多网上的资料,也没用特别具体的教程可以拿来用,博主经过努力终于配置成功了,分享给大家,让大家少走一些弯路
一上来不知道如何去写,毕竟博主也是现学现卖,不多说,直接上干货
一、首先博主默认大家已经将Qt(博主的版本是 Qt 5.6.1) 与 vs2013 配置好了,教程嘛大家自行在网上搜索,一大筐。
接下来大体分为配置头文件与加载静态链接库两部分
二、配置头文件
博主配置编译的 caffe 是微软的,现在微软的维护的 caffe 已经不更新维护了,大家可以下载其他版本。
这里博主也默认大家已经将 caffe 配置好,并且编译成功(博主编译的是 64 Debug 版本的)。
1、这是接下来要用到的文件夹(博主文件夹所在的位置是 E:\Caffe 大家可以根据自己文件的位置配置)
第一个是微软解压出来的 caffe ,第二个是 cuda ,第三个是caffe 用到的一些第三方工具
2、下面我们要将我文件夹中的头文件配置到 vs2013 中
一般博主喜欢新建一个属性文件,然后配置好后,每次将属性文件加载到自己的工程中(右键->添加新项目属性表)
下面我们将caffe 中用到的头文件加到属性表中
- 先配置包含目录
下面编辑加载头文件
这都是博主的目录文件大家看清楚,根据自己的目录自行配置
二、配置库目录以及加载静态库文件
三、接下来编写例子测试自己的配置是否成功
这都是博主的目录文件大家看清楚,根据自己的目录自行配置
- 加载静态文件
文件名:(大家可以复制粘贴)
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 用来,主要功能是加载一张手写数字图像,识别其数字
界面如下:
界面比较垃圾,博主也是测试一下,后期会加以完善
大家也可以用下面的简单例子,不用 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_
#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_
#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