zoukankan      html  css  js  c++  java
  • 自己的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类型特征的相关预处理及后处理操作详细代码,比如设置与网络模型要求相同的图像大小,通道类型,加载并减去均值等预处理,以及后续的对高维度的特征进行归一化,最后保存到容器中后处理。欢迎大家一起交流探讨!

  • 相关阅读:
    CodeForces gym Nasta Rabbara lct
    bzoj 4025 二分图 lct
    CodeForces 785E Anton and Permutation
    bzoj 3669 魔法森林
    模板汇总——快读 fread
    bzoj2049 Cave 洞穴勘测 lct
    bzoj 2002 弹飞绵羊 lct裸题
    HDU 6394 Tree 分块 || lct
    HDU 6364 Ringland
    nyoj221_Tree_subsequent_traversal
  • 原文地址:https://www.cnblogs.com/zy230530/p/7050282.html
Copyright © 2011-2022 走看看