如何在visual studio中像使用opencv一样使用caffe 思路
我们都知道在Visual Studio中使用OpenCV是非常方便的,只要配置好相关的路径,建立一个属性表就可以了。接触过Caffe的可能会知道,在Caffe的例程中并没有怎么说如何建立一个属性表,就能够使用Caffe提供的一些函数去构造程序。话说一个月前刚刚在Github上帮一个老外解决了这个问题,所以这里也写一下我的方法。
要用Caffe,就是 include 、lib 、dll,和OpenCV一样,搞好这三个即可,推荐大家配置Release版本的,所以在编译Caffe的时候,换成Release模式也编译一次。
实现
观察caffe-master的第三方程序包,毫无疑问,这个与caffe-master本文件夹都需要加上去的。
所以在属性表里,先后需要include以下这些:(路径请自行修改)
D:caffe-masterinclude
D:NugetPackagesoost.1.59.0.0lib
ativeinclude
D:NugetPackagesglog.0.3.3.0uild
ativeinclude
D:NugetPackagesgflags.2.1.2.1uild
ativeinclude
D:NugetPackagesprotobuf-v120.2.6.1uild
ativeinclude
C:Program FilesNVIDIA GPU Computing ToolkitCUDAv7.5include
D:NugetPackagesOpenBLAS.0.2.14.1lib
ativeinclude
D:caffe-masterincludecaffelayers
D:NugetPackagesOpenCV.2.4.10uild
ativeinclude
D:NugetPackagesOpenCV.2.4.10uild
ativeincludeopencv
D:NugetPackagesOpenCV.2.4.10uild
ativeincludeopencv21234567891011
我们可以看到,这个第三方程序包里面已经有OpenCV了,所以我们没必要把OpenCV的属性表添加。
然后,我们需要添加lib:(路径请自行修改)
D:NugetPackagesoost_date_time-vc120.1.59.0.0lib
ativeaddress-model-64lib
D:NugetPackagesoost_filesystem-vc120.1.59.0.0lib
ativeaddress-model-64lib
D:NugetPackagesoost_system-vc120.1.59.0.0lib
ativeaddress-model-64lib
D:caffe-masterBuildx64Release
D:NugetPackagesoost_thread-vc120.1.59.0.0lib
ativeaddress-model-64lib
D:NugetPackagesoost_chrono-vc120.1.59.0.0lib
ativeaddress-model-64lib
D:NugetPackagesprotobuf-v120.2.6.1uild
ativelibx64v120Release
D:NugetPackagesOpenCV.2.4.10uild
ativelibx64v120Release
D:NugetPackagesglog.0.3.3.0uild
ativelibx64v120Debugdynamic
D:NugetPackagesgflags.2.1.2.1uild
ativex64v120dynamicLib
D:NugetPackageshdf5-v120-complete.1.8.15.2lib
ativelibx64
D:NugetPackagesOpenBLAS.0.2.14.1lib
ativelibx64
C:Program FilesNVIDIA GPU Computing ToolkitCUDAv7.5libx6412345678910111213
最后一项是CUDA的配置路径,找一下应该就可以找到。
那么我们的附加依赖项需要添加:
libcaffe.lib
libprotobuf.lib
opencv_highgui2410.lib
opencv_core2410.lib
opencv_imgproc2410.lib
libglog.lib
gflags.lib
libopenblas.dll.a
hdf5.lib
hdf5_hl.lib
cublas.lib
cublas_device.lib
cuda.lib
cudadevrt.lib
cudnn.lib
cudart.lib
cufft.lib
cudart_static.lib
cudnn_static.lib
cufftw.lib
cusparse.lib
cusolver.lib
curand.lib
nppc.lib
OpenCL.lib12345678910111213141516171819202122232425
对了,最后别忘了配置环境变量哟,配置完之后重启一遍:
D:NugetPackagesgflags.2.1.2.1uild
ativex64v120dynamicLib
D:NugetPackageshdf5-v120-complete.1.8.15.2lib
ativeinx64
D:NugetPackagesglog.0.3.3.0uild
ativeinx64v120Releasedynamic
D:NugetPackagesOpenBLAS.0.2.14.1lib
ativeinx64
D:NugetPackagesgflags.2.1.2.1uild
ativex64v120dynamicLib
D:NugetPackagesOpenCV.2.4.10uild
ativeinx64v120Release123456
这里还是建议大家建立一个属性表,方便后面的程序添加,就像这样:
那么在做完这些之后,我们就可以在新建工程里使用Caffe的接口了
windos下caffe安装一定要opencv吗 整个项目的结构图:
编写DetectFaceDemo.java,代码如下:
[java] view
plaincopyprint?
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("
Running DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我们将第一个字符去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("
Running DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我们将第一个字符去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
3.编写测试类:
[java] view
plaincopyprint?
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//运行结果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//运行结果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
X25-0425中式休闲椅
caffe windows10 vs2013怎么配置 1.配置环境
我在自己的笔记本配置的caffe,配置的环境为:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假设在配置caffe之前,你已经准备好这些。
本文中将给出一些编译好的依赖库,如果你也是用的Windows 7 64位+VS2013,可以直接使用。
2.准备依赖库
在Windows下配置caffe,一个很主要的问题就是依赖库的编译。不像在Ubuntu下那么方便,在Windows下,依赖库都需要使用vs2013进行编译才能使用。下面我将介绍caffe需要的依赖库(如果你也是win7 64位+VS2013,可以直接使用我提供的依赖库)。
2.1 boost
boost可以下载源码进行编译,也可以直接下载安装文件。我使用的是后者,方便、快捷。
我使用的是:boost_1.56_0-msvc-12.0-64.exe
注意下载适合你的配置环境的boost版本即可。
下载完毕,双击运行安装文件即可。
2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
这一部分的很多都是谷歌的开源库,不容易下载(你懂的)。所以我使用的是Neil Z. SHAO‘s Blog
提供的编译好的。
下载完,解压得到3rdparty文件夹。在下一段将会用到。
3.建立caffe工程
准备好了caffe需要的依赖库和环境之后,下面就可以建立caffe的vs项目,进行编译了。
3.1 下载caffe源码
可以从caffe的github主页下载源码。
下载地址:Caffe’s GitHub
解压文件,假设caffe源码所在目录为CAFFE_ROOT。
3.2 准备项目需要的依赖库和系统环境变量
经过上一阶段的准备,caffe项目所需的依赖库都已经准备好。
1.首先设置系统环境变量(以我的为例):
CUDA_PATH_V6_5 安装好cuda6.5之后,会自动添加环境变量CUDA_PATH_V6_5
OPENCV_2_49 D:/Tools/opencv2.49/build/
BOOST_1_56 D:/Tools/boost_1_56_0
2.将3rdparty文件夹放到CAFFE_ROOT
3.3 用vs建立caffe项目
1.用VS2013在CAFFE_ROOT下建立 win32 console application,选择空项目。
将项目的平台由32位改为64位
2.修改项目属性
项目——属性——C/C++——常规——附加包含目录
添加:
../include;
../src;
../3rdparty/include;
../3rdparty;
../3rdparty/include;
../3rdparty/include/openblas;
../3rdparty/include/hdf5;
../3rdparty/include/lmdb;
../3rdparty/include/leveldb;
../3rdparty/include/gflag;
../3rdparty/include/glog;
../3rdparty/include/google/protobuf;
项目——属相——VC++目录——包含目录
添加:
$(CUDA_PATH_V6_5)include;
$(OPENCV_2_49)include;
$(OPENCV_2_49)includeopencv;
$(OPENCV_2_49)includeopencv2;
$(BOOST_1_56)
项目——属性——链接器——常规——附加库目录
添加:
$(CUDA_PATH_V6_5)lib$(PlatformName);
$(OPENCV_2_49)x64vc12lib;
$(BOOST_1_56)lib64-msvc-12.0;
..3rdpartylib;
项目——属性——链接器——输入——附加依赖项
debug添加:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
release添加:
opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
3.4 编译caffe
配置好caffe项目的属性之后,下面就可以一步一步的编译caffe了。
3.4.1 编译./src中的文件
首先,将../src文件夹中的*.cpp文件添加到工程中。
依次编译每一个*.cpp文件。
1.编译blob.cpp
直接编译时会报错,缺少文件”caffeprotocaffe.pb.h”
这个时候需要将proto.exe放到../3rdparty/bin文件夹
将GernaratePB.bat放在../scripts文件夹
运行bat脚本文件即可生成caffe.pb.h
然后就可以成功编译。
2.编译common.cpp
直接编译这个文件,会出现关于getid和fopen_s的错误。可通过如下步骤修改:
在代码前面添加:#include
修改项目属性:项目——属性——C/C++——预处理器——预处理器定义 添加:_CRT_SECURE_NO_WARNINGS 在代码中getid的位置进行如下修改: #ifdef _MSC_VER pid = getid(); #else pid = _getid(); #endf 修改完毕之后,可以成功编译。 3.编译net.cpp 直接编译这个文件,会出现关于mkstep、close、mkdtemp的错误。需要进行如下修改: 在io.hpp头文件中添加:#include “mkstep.h” 在io.hpp头文件中,在close()的位置进行如下修改: #ifdef _MSC_VER close(fd); #else _close(fd); #endif 在mkdtemp的位置进行如下修改: #ifndef _MSC_VER char* mkdtemp_result = mkdtemp(temp_dirname_cstr); #else errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr)); #endif 修改完毕,可以成功编译。 4.编译solver.cpp 直接编译会出现关于snprintf的错误,需要进行如下修改: #ifdef _MSC_VER #define snprinf sprintf_s #endif 修改完毕,可以成功编译。 5.其他剩余的cpp文件也依次编译 3.4.2 编译./src/layers中的文件 将./src/layers中的所有的cpp和cu文件都添加到项目中。 右键点击cu文件,修改属性。 在bnll_layer.cu文件,进行如下修改: float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0 依次编译所有的文件。 3.4.3 编译./src/util中的文件 将./src/util中所有的文件添加到项目 1.在io.cpp中 修改ReadProtoFromBinaryFile函数 O_RDONLY ——> O_RDONLY | O_BINARY 在代码中进行如下修改: #ifdef _MSC_VER #define open _open #endif 将close()改为_close() 2.在math_functions.cpp中 做如下修改: #define __builtin_popcount __popcnt #define __builtin_popcountl __popcnt 3.在db.cpp中 作如下修改: #ifdef _MSC_VER #include #endif 修改CHECK_EQ #ifdef _MSC_VER CHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”< #else CHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”< #endif 4.依次编译其他文件 3.4.4 编译./src/proto中的文件 参照上一步,将proto中的文件都添加到项目。 修改属性: 项目——属性——C/C++——预处理器——预处理器定义 添加:_SCL_SECURE_NO_WARNINGS 编译所有文件。 3.4.5 编译./tools中的文件 本文件夹下有多个cpp文件,通过它们的名字就可以知道相应的功能。添加不同的cpp文件到项目中,然后生成项目,就可以得到不同功能的exe文件。 将caffe.cpp添加到工程,生成项目,得到caffe.exe文件,可用于训练模型 将computer_image_mean.cpp添加到工程,生成项目,得到的exe文件可用于将训练样本转换为caffe使用的leveldb/lmdb数据集。 依次类推。 自此,caffe在Windows下的编译已经完毕,接下来就可以使用它来训练自己的模型了。