由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁。很多时候,我们都需要在自己的项目中配置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. jsp四大作用域之Session

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  2. 如何使用ABAP Restful API进行代码的全文搜索

    使用这个代码全文搜索的前提条件,是在事务码SFW5里激活业务功能:SRIS_SOURCE_SEARCH 只需要把这个url贴到浏览器里: https://:44355/sap/bc/adt/repos ...

  3. Android(java)学习笔记127:生成 4种不同权限的文件

    1. 首先我们编写一个生成 4种 不同权限的文件的程序案例: (1)首先是activity_main.xml文件: <RelativeLayout xmlns:android="htt ...

  4. 徒手教你使用zookeeper编写服务发现

    zookeeper是一个强一致[不严格]的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换.客户端向任意一个节点写入数据,其它节点可以立即 ...

  5. 在ProgressBar控件中显示进度百分比

    实现效果: 知识运用: ProgressBar控件的Value属性 //控件的当前值 Maximum属性 //ProgressBar正在使用的范围的上限 PerformStep方法 //按照Step属 ...

  6. Bootstrap历练实例:默认的进度条

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. 学习JavaScript你必须掌握的8大知识点!

    大知识点! 一.JavaScript思维导图之<变量>的学习 二.    JavaScript思维导图之<函数基础>  三.JavaScript思维导图之<基本dom操作 ...

  8. @private@protected@public@package

    @private@protected@public@package 为了强制一个对象隐藏其数据,编译器限制实例变量范围以限制其在程序中的可见性 但是为了提供灵活性,苹果也让开发者显式设置范围(四选一) ...

  9. Sorted Union-freecodecamp算法题目

    Sorted Union 1.要求 写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组. 换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但 ...

  10. 数据预处理之数据规约(Data Reduction)

    数据归约策略 数据仓库中往往具有海量的数据,在其上进行数据分析与挖掘需要很长的时间 数据归约 用于从源数据中得到数据集的归约表示,它小的很多,但可以产生相同的(几乎相同的)效果 数据归约策略 维归约  ...