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

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

一、步骤描述

  我今天写这篇的主要目的是为了加深自己的记忆和理解,大部分都是参考上面给出的博客的内容。具体分为以下三个步骤
(1)添加包含目录、库目录和链接->输入

(2)将$\caffe\examples\cpp_classsification\classification.cpp复制到新建的工程,并添加

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

二、步骤详解 

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

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

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

包含目录:

 库目录:

链接->输入:

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()函数中做如下修改:

下面就可以进行编译啦。

三、编译中会出现的错误

(1)错误形式:

解决办法:

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

(2)错误形式:

解决办法:将$\NugetPackages\OpenCV.2.4.10\build\native\bin\x64\v120\Debug文件夹下的opencv_core2410d.dll文件拷贝到新建的工程$\TestClassificationByCaffe\x64\Debug文件夹内即可。

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

(3)错误形式:

解决方法:在工程中添加一个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"即可。

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

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

我的就是全部注释:

(4)错误形式:

解决办法:将$\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib目录下的8个文件全部复制到工程目录下即可。

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

时间: 2024-10-14 01:46:51

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

Visual Studio 2013创建并运行Cocos2d-x工程

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 1.准备: 我们得先把Visual Studio 2013安装好:可以去MSDN官网下载,在安装好 2.安装好vs之后,在cmd(终端)创建Cocos2d-x项目 1).打开终端(Win+Rn 输入cmd ),输入命令cocos 按下回车,显示出可用命令 2)我们在继续输入cocos new:选择new命令来闯将一个新的工程 按下回车,显示出创建新工程的一些设置: 新工程名    包名     开发语言选项(C++, lua, jav

使用Visual Studio 2013创建并运行Cocos2d-x工程

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 1.准备: 我们得先把Visual Studio 2013安装好:可以去MSDN官网下载,在安装好 2.安装好vs之后,在cmd(终端)创建Cocos2d-x项目1).打开终端(Win+Rn 输入cmd ),输入命令cocos 按下回车,显示出可用命令 2)我们在继续输入cocos new:选择new命令来闯将一个新的工程 按下回车,显示出创建新工程的一些设置:新工程名    包名     开发语言选项(C++, lua, javas

cocos2d-x-3.2 如何创建新工程

1.在cocos2d-x-3.2\运行python命令 python setup.py //它的作用是将下面这些路径加入到你的用户环境变量中,当然你也可以不添加 COCOS_CONSOLE_ROOT = 'COCOS_CONSOLE_ROOT' NDK_ROOT = 'NDK_ROOT' ANDROID_SDK_ROOT = 'ANDROID_SDK_ROOT' ANT_ROOT = 'ANT_ROOT' //如果你已经将COCOS_CONSOLE_ROOT = "COCOS_CONSOLE_R

使用idea搭建Maven+SSM(Spring+SpringMVC+Mybatis)框架(一、使用Maven创建新工程)

一.新建Maven项目 1.如图创建简单java web application. 2.如图填写组织唯一标识和项目唯一标识 3.如图照做 4.点击finish即可完成项目创建,如图为创建好后的项目结构. 5.设置项目Modules 至于后面的path和dependencies可以按照默认的配置,当你用maven导入包后dependencies会自动配置,当然要是想自己添加本地包可以在dependencies中点击绿色的加号自己添加包,我们使用maven时很少用到这样的操作,只有在不使用maven

2016.8.07 this、new、模式工厂、创建新的构造函数

写在前面:今天我将发表函数基础.对象基础.this.new.封装.封装例子  这几篇个人理解文章.最好能一口气看完,并自己写下,相信会对想要理解函数和对象的朋友们会有一些帮助. 目录:模式工厂. this.new.创建新的构造函数 模式工厂:将对象放入函数中,批量创建对象 代码: function Student(name,age,sex){ var o=new Object();//先定义一个对象, o.name=name; o.age=age; o.sex=sex; o.sayHi=func

多线程——创建新线程

一,简单单线程 线程是代码的执行序列或者执行路径.线程与进程的概念有一些类似,它类似于一个轻量级的进程:一个操作系统可以运行多个进程,一个进程内可以运行多个线程.每个应用程序至少运行在一个线程上.当只有一个线程时,称作单线程应用程序,该线程由系统自动创建. 下面看一个简单单线程例子: 如上图,本短程序从入口函数main进入,然后一次执行到结束. 执行main方法的线程通常被成为主线程,主线程的入口也是应用程序的起始点.对于单线程的应用程序来说,代码的执行是顺序的. 但是在多线程中,当新线程被手动

git ---创建新git库

一.修改本地repositories里的gitosis.conf,添加mt6577.git标识(并提交): X:\gitosis-admin\gitosis.conf [group developers] writable = provision mt6577 mt6582 git pull git add gitosis.conf git commit –m"" git push origin master 二.提交工程代码 git init git add -f *     //一

Swift基础:创建第一个Swift工程:Swift的基本语法

苹果公司在今年的WWDC大会上,除了发布了iOS8和Max OS X 10.10之外,还发布了一个新的编程语言Swift.不得不说,Swift有较大的转变,也使编程变得更加容易了,下面介绍了Swift的常量和变量的定义,基本控制语句的使用: 需要注意的是:Swift只能在Xcode 6 Beta版中运行,Xcode 6 目前最新的是Beta 7,大家可以通过以下链接下载: http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_7_a

创建新的窗体类

到目前为止,我们看到的程序还只是脚本风格,用现有的窗体和控件,快速把窗体放在一起.这种编程风格可用于快速开发单一窗体的应用程序,但是,对于快速创建有多个窗体组成的应用程序,或者创建窗体库以用于其他 .NET 语言时,就会受到限制:在这些情况下,必须采取一种更面向组件(component-oriented)的方法. 通常,创建一个大型的 Windows  窗体应用程序时,有一些窗体需要重复使用:此外,通常希望这些窗体能够相互通信,通过调整彼此的属性或调用彼此的方法.通常是定义新的窗体类,从 Sys