由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁。很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务。今天我主要讲的关于"在自己的项目中配置caffe环境所遇到问题的相关说明和解答",因为项目的需要,需要在项目中配置caffe来完成VGG网络的分类任务。大概花费了一周的时间,总算成功了。期间,也是辗转反侧,遇到了诸多问题,查阅了诸多资料,但是有些问题并没有讲的非常清楚。这里,我就这些遇到的问题,根据自己的情况以及解决的办法跟大家分享一下。

  首先,需要准备好安装环境:

(1)已编译好的caffe  https://github.com/Microsoft/caffe,必须是已经编译好的caffe工程,因为我们需要用到caffe第三方库,以及编译生成的libcaffe.lib

(2)vs2013  因为caffe需要vs2013的编译器,所以最好是vs2013

(3)GPU环境的还要安装CUDA,Cudnn。可以去官网根据自己的电脑配置下载安装

(4)如果需要做UI的话,也可以在vs中配置相关界面工具,比如QT

  然后,环境已经准备好了,接下来就是新建vs工程了,这里可以根据自己的情况新建自己的项目,比如win32控制台程序等。由于,我选择用QT来做c++应用的界面,所有我新建的是QT GUI Application。

  工程新建完成后,接下来就是各种include,lib,dll的配置问题了。我这里要说的是vs2013,x64,Debug,GPU模式。如果你是Release模式,那么就将下面所有的Debug改为Release即可。具体地,打开属性->VC++目录

  需要说明的是,这里面你需要根据你的caffe环境和CUDA的安装路径,进行更改,否则会报错找不到文件等等

  接下来是链接器->输入

//debug
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
caffe.lib
libcaffe.lib
cudart.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
leveldb.lib
hdf5.lib
hdf5_hl.lib
Shlwapi.lib

  最后,由于要用到caffe模型,那么必然会出现注册层的问题,这里我们新建一个head.h的头文件,然后在代码中引用该头文件即可。有人说,不这样不行么,建议大家最好这样,因为不这样一般会报出"未知的层"等相关错误。比如:

  head.h的内容为(注意,这里面的层必须至少要包含你用到的网络的相关层,否则会出错):

#include<caffe/common.hpp>
#include "caffe/caffe.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>
namespace caffe
{
extern INSTANTIATE_CLASS(BatchNormLayer);
extern INSTANTIATE_CLASS(BiasLayer);
extern INSTANTIATE_CLASS(InputLayer);
REGISTER_LAYER_CLASS(Input);
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); }

  这样,完成后就可以对工程进行第一次编译,在编译时,可能会出现如下主要问题:

1 出现某一层重复注册的问题:

这时,你就要根据错误提示,找到是哪个层重复注册了,就将相应的REGISTER_LAYER_CLASS(Convolution);双斜杠掉即可,最后类似于这样:

#include<caffe/common.hpp>
#include "caffe/caffe.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>
namespace caffe
{
extern INSTANTIATE_CLASS(BatchNormLayer);
extern INSTANTIATE_CLASS(BiasLayer);
extern INSTANTIATE_CLASS(InputLayer);
//REGISTER_LAYER_CLASS(Input);
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); }

2 如果出现相关dll文件找不到的系统错误情况:


两种办法:(1)在D:\Resource\caffe\caffe-windows\Build\x64\Debug(如果你是Release就在Release文件中)文件下,找到对应的dll文件,将其拷贝到项目生成的Debug文件夹下面即可,比如:

(2)在项目文件下新建一个dll文件夹,将D:\Resource\caffe\caffe-windows\Build\x64\Debug文件下所有的dll文件拷贝进dll文件夹中,并在属性->配置属性->调试->环境中添加:path=E:\qt\ImageRetrival\dll;再编译即可。

   总结:上面的两个是在新建项目中配置caffe出现最多的问题,当然也会有其他的问题,这时就需要你根据具体的问题,查阅相关文档或者自己调试,找出问题,对症下药了。可能这需要花费很多时间,但是不要轻言放弃,相信最后都会解决的。我前后花费了一周多的时间,也是每天不想再调了,但是咬咬牙还是坚持着去解决问题。最后,祝大家都能顺利配置成功,如果有什么问题可以在下面给我留言,我一定依照我的经验给大家一一解答,希望能帮到大家,少走一些弯路。

  另外:有过有人对于如何在自己的工程里面如何通过caffe加载你要用的网络模型的话,我给大家提供一个链接,该链接对于如何通过caffe调用网络模型提取特征,以代码的形式给予了详细解答:http://blog.csdn.net/mr_curry/article/details/52456548,后续我会补上关于通过caffe调用网络模型提取Mat类型特征的相关预处理及后处理操作详细代码,比如设置与网络模型要求相同的图像大小,通道类型,加载并减去均值等预处理,以及后续的对高维度的特征进行归一化,最后保存到容器中后处理。欢迎大家一起交流探讨!

自己的Qt GUI 项目+vs2013+opencv+caffe环境配置的更多相关文章

  1. Windows下的Anaconda+OpenCV的环境配置

    Windows下的Anaconda+OpenCV的环境配置

  2. win7下qt+opencv的环境配置

    博客http://blog.csdn.net/qiurisuixiang/article/details/8665278已经完整地介绍了整个环境配置.需要一步不差按原执行.需要说明的是,几个path的 ...

  3. 学习Opencv 2.4.9 (一)---Opencv + vs2012环境配置

    作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 首先获得最新的Opencv 2.4.9源代码:opencv源代码下载 一.Opencv环境变量配置 ...

  4. Opencv + vs2012环境配置

    首先获得最新的Opencv 2.4.10源码:opencv源码下载 一.Opencv环境变量配置 1.将源码安装到制定目录: 2.为Opencv 添加环境变量:计算机-->属性 点击高级系统设置 ...

  5. python Web项目上线之服务器环境配置

    1.下载安装Xftp 安装成功后,登录服务器用户密码,登录成功后 使用Xftp 将下载好的python解释器linux压缩包放置在服务器根目录下(这里用的是python3.7) 2. 解压压缩包,安装 ...

  6. win7(X64)+VS2013+OpenCV3.1环境配置

    &1 源文件 VS2013: 链接:http://pan.baidu.com/s/1o8EKQq2 密码:open OpenCV3.1:  链接:http://pan.baidu.com/s/ ...

  7. Windows下OpenCV的环境配置

    首先去官网下载所需版本的OpenCV(我这里下载的是OpenCV2.4.9),然后安装(也就是解压缩)到某个地方(个人推荐解压到硬盘的根目录).解压完成后,可以得到如下的目录结构(版本不同,可能会有一 ...

  8. python调用caffe环境配置

    背景是这样的,项目需要,必须将训练的模型通过C++进行调用,所以必须使用caffe或者mxnet,而caffe是用C++实现,所以有时候简单的加载一张图片然后再进行预测十分不方便 用caffe写pro ...

  9. Visual Studio OpenCV 开发环境配置

    因为VS配置OpenCV好多新手都很难一次配置成功,而且OpenCV库每新建一个项目都要配置很是麻烦,所以今天就给大家介绍一个“一劳永逸”的方法. 注:理论上只要VS和OpenCV是版本兼容的,该方法 ...

随机推荐

  1. Android商城开发系列(九)—— 首页频道布局的实现

    在上一篇博客当中,我们讲了关于首页轮询广告的实现,接下来讲解一下首页频道布局的实现,如下图所示: 这个布局用的是gridview去完成的,新建一个channel_item,代码如下所示: <?x ...

  2. UI与数据分离 与 UI的演进

    解藕的好处:UI内部模块能够灵活的变化. MVC或者三层架构着重强调了数据.业务逻辑和UI的分离. (MVC中的C只是UI和业务逻辑模块间的一个中转组件,理论上应该是个轻模块.) 以前的关注的解藕技术 ...

  3. [学习笔记] Markdown语法备忘

    Markdown语法总结 标题 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 注意#后面要加空格 字体 ** ...

  4. mybatis association嵌套association的两级嵌套问题

    今天遇到了一个双表连接查询以及自关联的问题,由于第一次遇到,所以在这记下,日后好查阅 针对一个表的关联属性本身也有自关联的情况下,可以用association嵌套association的方法来处理. ...

  5. mysq--索引模块

    问题:为什么要 使用索引? --->快速查询数据,但是仅仅这么回答,就是不专业的!!! 应该要分为数据量少的时候,不适用索引,走全表扫描的话,查询速率也是很快的 数据量大的话,使用索引,查询速率 ...

  6. hash join

    hash join是oracle里面一个非常强悍的功能,当做hash join时,oracle会选择一个表作为驱动表,先根据过滤条件排除不必要的数据,然后将结果集做成hash表,放入进程的hash a ...

  7. Java基础操作面试题:Map集合排序 需要TreeMap 构造方法参数有比较器 输入字符串,统计A、B、C、D、出现次数,由高到低输出字母和出现次数,使用Map集合完成此题

    Map和Collections是同级别的,不能像List排序那样直接用Collections.sort(new Comparator<?>(){ 复写compara方法}); HashMa ...

  8. cocos2dx 加密spine文件遇到的问题(暂时没有解决方法)

    今天我研究了一下加密spine动画的加密的方法,图片肯定要加密的,所以我只选择加密图片,另外的一个altas文件和json文件就不做加密打算. 我的思路是通过TexturePacker打包成加密的文件 ...

  9. 在Keras中导入测试数据的方法

    https://blog.csdn.net/ethantequila/article/details/80322425?utm_source=blogxgwz2

  10. 【前端_js】JavaScript知识点总结

    1.JavaScript的定义及特性 1.1.定义 javascript是运行在客户端的一种直译式脚本语言(程序在运行过程中逐行进行解释),它的解释器被称为JavaScript引擎,为浏览器的一部分. ...