创建新的C++工程来调用Caffe对图片进行识别

前段时间一直在跑Caffe训练数据。之前用训练好的caffemodel对图片进行分类都是用的命令行指令,于是就想着自己新建一个工程来调用caffe,结合classification的代码来对图片进行分类。上网查阅了很多资料,最详细的一篇就是:http://blog.csdn.net/qq_14845119/article/details/52541622#reply。

一、步骤描述

我今天写这篇的主要目的是为了加深自己的记忆和理解,大部分都是参考上面给出的博客的内容。具体分为以下三个步骤

(1)添加包含目录、库目录和链接->输入

(2)将$caffeexamplescpp_classsificationclassification.cpp复制到新建的工程,并添加

(3)对classification.cpp进行修改,添加相应的deploy.prototxt,.caffemodel,mean.binaryproto,synset_words.txt,jpg,进行分类。

二、步骤详解

现在对以上三个步骤进行详解:

1、由于我只进行了Debug模式下的编译,具体Release模式下的包含目录、库目录和链接->输入添加请参考上面的链接。

具体的配置和环境是:VS2013,Win64,CPU环境

创建新的C++工程来调用Caffe对图片进行识别

包含目录:

创建新的C++工程来调用Caffe对图片进行识别

库目录:

创建新的C++工程来调用Caffe对图片进行识别

链接->输入:

caffe.lib
compute_image_mean.lib
convert_imageset.lib
convert_mnist_data.lib
libcaffe.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_objdetect2410d.lib
opencv_core2410d.lib
opencv_ml2410d.lib
libboost_date_time-vc120-mt-gd-1_59.lib
libboost_filesystem-vc120-mt-gd-1_59.lib
libboost_system-vc120-mt-gd-1_59.lib
libglogD.lib
hdf5.lib
hdf5_cpp.lib
hdf5_f90cstub.lib
hdf5_fortran.lib
hdf5_hl.lib
hdf5_hl_cpp.lib
hdf5_hl_f90cstub.lib
hdf5_hl_fortran.lib
hdf5_tools.lib
szip.lib
zlib.lib
LevelDbD.lib
lmdbD.lib
libprotobufD.lib
libopenblas.dll.a
gflags_nothreadsd.lib
gflagsd.lib

ps:将NugetPackages根目录下的glog,LevelDB,protobuf目录中lib下面的debug目录中相应的lib后面都加上D重命名了一下,为了和Release模式区分。

2、根据上面的操作,就已经完成了包含目录、库目录和链接->输入的添加。下面对复制过来的classification.cpp进行修改:

由于电脑没有GPU,所以在程序第一行添加:

#define USE_OPENCV 1
#define CPU_ONLY 1

在main()函数中做如下修改:

创建新的C++工程来调用Caffe对图片进行识别

下面就可以进行编译啦。

三、编译中会出现的错误

(1)错误形式:

创建新的C++工程来调用Caffe对图片进行识别

解决办法:

工程属性页:c/c++->命令行,输入-D_SCL_SECURE_NO_WARNINGS

(2)错误形式:

创建新的C++工程来调用Caffe对图片进行识别

解决办法:将$NugetPackagesOpenCV.2.4.10buildnativebinx64v120Debug文件夹下的opencv_core2410d.dll文件拷贝到新建的工程$TestClassificationByCaffex64Debug文件夹内即可。

如果遇到缺少.dll的情况,去NugetPackages下搜索相应的.dll文件,拷贝到新建的工程下即可。

(3)错误形式:

创建新的C++工程来调用Caffe对图片进行识别

解决方法:在工程中添加一个head.h文件,输入如下程序:

#include "caffe/common.hpp"  
#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/layers/pooling_layer.hpp"  
#include "caffe/layers/lrn_layer.hpp"  
#include "caffe/layers/softmax_layer.hpp"  

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);

}

然后在classification.cpp中输入#include "head.h"即可。

但是:此时有可能出下类似下面的这种错误:

创建新的C++工程来调用Caffe对图片进行识别

这表明Layer Convolution重复注册了,只需要把head.h中的REGISTER_LAYER_CLASS(Convolution)注释掉即可,其他层同样如此。

我的就是全部注释:

创建新的C++工程来调用Caffe对图片进行识别

(4)错误形式:

创建新的C++工程来调用Caffe对图片进行识别

解决办法:将$NugetPackagesgflags.2.1.2.1buildnativex64v120dynamicLib目录下的8个文件全部复制到工程目录下即可。

PS:本文仅用来对自己昨天的学习内容进行一个总结和记忆概括,并加入了自己实际情况遇到的一些错误,希望能给其他人也带来一定帮助。再次感谢http://blog.csdn.net/qq_14845119/article/details/52541622#reply作者给我的指导。
原文链接: https://www.cnblogs.com/yyxf1413/p/6380015.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/248910

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午3:18
下一篇 2023年2月14日 上午3:18

相关推荐