自己的Qt GUI 项目+vs2013+opencv+caffe环境配置

  由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁。很多时候,我们都需要在自己的项目中配置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:Resourcecaffecaffe-windowsBuildx64Debug(如果你是Release就在Release文件中)文件下,找到对应的dll文件,将其拷贝到项目生成的Debug文件夹下面即可,比如:

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

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

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

原文地址:https://www.cnblogs.com/zy230530/p/7050282.html