创建新的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作者给我的指导。
创建新的C++工程来调用Caffe对图片进行识别的更多相关文章
- IDEA中使用Maven:通过模板项目来创建新工程(转)
首先自己有一个很完善的项目,并想通过这个项目做一个Demo事例项目: 例子1 如下图,在idea的terminal中敲入命令: mvn archetype:create-from-project 1 ...
- Visual Studio 2013创建并运行Cocos2d-x工程
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.准备: 我们得先把Visual Studio 2013安装好:可以去MSDN官网下载,在安装好 2.安装好vs之后,在cmd(终端)创 ...
- 使用git在github上创建新工程
这段时间进经常会忘记如何在github上同步工程,于是又得查资料,查参考书,浪费了很长时间,因此有了感触,写几篇有关此类问题的篇章! 这是老手新手都十分容易犯的错误,就是在创建一个新github项目或 ...
- python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
- git 创建新项目,下载工程,合并和更新工程简单应用记录
以前使用SVN很顺手,现在公司使用git来管理代码,因此学习git的基本使用. 一.首先介绍下SVN和git的简单比较: SVN是使用得最多的版本控制管理工具. 1.是一个集中式的版本管理工具.所有的 ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- 怎么处理sqlserver2017部署在winowsDocker上时区无法修改成功的方式,并且可以多创建新的容器调用简单的方式直接使用!
在创建该容器的时候我们执行的语句中添加了一个 从图中所看到的内容,上海时区,按照正常流程一般都是可疑正常执行的,但最后事情并不是我们所想的那么简单. 我们进入对应的容器里面 ,执行语句之后查找对应的文 ...
- 在 C++Builder 工程里调用 DLL 函数
调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...
- 手把手教你通过Eclipse工程配置调用JNI完全攻略
本文地址:http://www.cnblogs.com/wavky/p/JNI.html 当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了. 百度出来的JNI ...
随机推荐
- IOS AppUI规格指南
- LoadRunner如何在脚本运行时修改log设置选项
LoadRunner如何在脚本运行时修改log设置选项?答案是使用lr_set_debug_message函数: lr_set_debug_message Sets the message level ...
- windows盘符操作
subst subst x: /d subst y: e:\
- 序列化和反序列化Java 8的时间/日期类
序列化 假如有 Clock 类: public class Clock { private LocalDate localDate; private LocalTime localTime; priv ...
- 虚拟机下安装CentOS无法上网的解决方式
我使用VMware虚拟机安装Ubuntu和CentOS,都使用NAT模式连接网络,可是Ubutun能够正常上网,而CentOS不能连接到网络. 原来Centos7默认是不启用有线网卡的.须要手动开启. ...
- Selenium2 Python 自己主动化測试实战学习笔记(五)
7.1 自己主动化測试用例 无论是功能測试.性能測试和自己主动化測试时都须要编写測试用例,測试用例的好坏能准确的体现了測试人员的经验.能力以及对项目的深度理解. 7.1.1 手工測试用例与自己主动化測 ...
- 改动图片exif信息
我们先了解一下EXIF: EXIF能够附加于JPEG.TIFF.RIFF等文件之中.为其添加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本号信息. 全部的JPEG文件以字符串"0xF ...
- TADOConnection如何测试连接数据库超时的解决办法
TADOConnection如何测试连接数据库超时的解决办法 TADOConnection 提供了很好的数据库连接功能,但是我们在实际使用时,如果指定的远程数据库不存在或其他原因连接不上,程序往往会 ...
- 用C#实现XML和实体类之间序列化和反序列化相互转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Drawable资源的初步使用
刚開始接触到Android的时候,看到类似以下的一个Button: 当时感觉这种button有点像Material Design风格.真的以为是裁剪好的图片,好奇心驱使我上网查找实现的方法,原来不是裁 ...