Caffe移植到windows

一、前言

Caffe是一个很棒的深度学习框架,值得花时间学习和分享,最近在做移植的工作,有必要做一个总结,俗话说的好,好记性不如C博。

我的开发环境是:windows7 64位、gpu 1080ti、opencv2.4.11、boost1.61.0

二、依赖库

1、安装OpenCV

可以参考博客OpenCV在VS中的配置

2、安装boost

可以参考博客编译并使用boost库(win7+boost1.60+vs2013)

3、安装cuda

可以参考博客对应部分win7+1080ti+cuda8.0+cudnn5.0+caffe安装

4、下载其他库

比较常用的是Neil Z. SHAO提供的已编译好的库,风翼冰舟提供的百度云下载地址,链接:http://pan.baidu.com/s/1eSku9aE 密码:qrj7。

解压之后有两个文件夹,新建一个文件夹这里命名为caffe_in_windows,将3rdparty文件夹拖进caffe_in_windows中。

三、Caffe在VS中的配置、编译

接下来分两部分说,第一部分配置编译libcaffe,我用到的相关文件下载地址:链接:http://pan.baidu.com/s/1pLnho0N 密码:e580

1、下载官方最新的caffe源文件,地址https://github.com/BVLC/caffe。

2、将caffe-master内部所有文件放进caffe_in_windows文件夹。

3、新建caffe_in_windows/windows文件夹,在windows文件夹下新建一个VS控制台空白工程,命名为Caffe,然后添加一个lib工程,命名为libcaffe。

4、打开VIEW->Other Windows->Property Manager属性管理窗口。

5、右键libcaffe工程打开属性窗口,将平台改为x64

6、在属性窗口中找到General->Output Directory,在Debug和Release均将其修改为

$(SolutionDir)..\$(Platform)\$(Configuration)\
7、找到C/C++->General->Additional Include Directories,在Debug和Release均添加以下路径

$(Boost_path)
$(CUDA_PATH)\include
$(SolutionDir)..\..\src
$(SolutionDir)..\..\include
$(OpenCV_build_path)\include
$(OpenCV_build_path)\include\opencv
$(OpenCV_build_path)\include\opencv2
$(SolutionDir)..\..\3rdparty\include
$(SolutionDir)..\..\3rdparty\include\lmdb
$(SolutionDir)..\..\3rdparty\include\hdf5
$(SolutionDir)..\..\3rdparty\include\openblas
其中$(SolutionDir)代表解决方案.sln所在的路径,其余的$(XXX)都代表电脑的相关路径,可以在系统变量中新建对应变量,将路径添加进去,然后在path变量末尾添加系统变量,程序运行时就能找到对应的dll。

8、找到Librarian->General->Additional Library Directories,在Debug和Release均添加以下路径

$(CUDA_LIB_PATH)
$(Boost_lib_path)
$(SolutionDir)..\..\3rdparty\lib
$(OpenCV_build_path)\x64\vc12\lib
9、找到Librarian->General->Additional Dependencies,在Debug模式下添加以下依赖
opencv_core2411d.lib;
opencv_calib3d2411d.lib;
opencv_contrib2411d.lib;
opencv_flann2411d.lib;
opencv_highgui2411d.lib;
opencv_imgproc2411d.lib;
opencv_legacy2411d.lib;
opencv_ml2411d.lib;
opencv_gpu2411d.lib;
opencv_objdetect2411d.lib;
opencv_photo2411d.lib;
opencv_features2d2411d.lib;
opencv_nonfree2411d.lib;
opencv_stitching2411d.lib;
opencv_video2411d.lib;
opencv_videostab2411d.lib;
cudart.lib;
cuda.lib;
nppi.lib;
cufft.lib;
cublas.lib;
curand.lib;
在Release下添加以下依赖

opencv_core2411.lib;
opencv_calib3d2411.lib;
opencv_contrib2411.lib;
opencv_flann2411.lib;
opencv_highgui2411.lib;
opencv_imgproc2411.lib;
opencv_legacy2411.lib;
opencv_ml2411.lib;
opencv_gpu2411.lib;
opencv_objdetect2411.lib;
opencv_photo2411.lib;
opencv_features2d2411.lib;
opencv_nonfree2411.lib;
opencv_stitching2411.lib;
opencv_video2411.lib;
opencv_videostab2411.lib;
cudart.lib;
cuda.lib;
nppi.lib;
cufft.lib;
cublas.lib;
curand.lib;

10、新建windows\scripts文件夹,将ProtoCompile.cmd放进windows\scripts中,在属性窗口中找到Build Events -> Pre-Build Event -> Command Line,在debug和Release模型下均添加

"$(SolutionDir)..\scripts\ProtoCompile.cmd" "$(SolutionDir)" "$(SolutionDir)..\..\3rdparty\bin\"

编译libcaffe工程,可以看到输出窗口已经生成了caffe.pb.h、caffe.pb.cc

11、将src/caffe下的所有文件添加进libcaffe


12、打开common.cpp,在开头添加

#if defined(_MSC_VER)
#include <process.h>
#define getpid() _getpid()
#endif
找到::google::InstallFailureSignalHandler();所在的行,改为

#if !defined(_MSC_VER)
  ::google::InstallFailureSignalHandler();
#endif
在属性窗口找到C/C++->Precompiled Header->Precompiled Header,改为Not Using Precompiled Headers

找到C/C++->Advanced->Disable Specific Warnings,添加4996/4703
找到C/C++->Preprocessor->Preprocessor Definitions,添加

_CRT_SECURE_NO_WARNINGS
USE_OPENCV
USE_CUDNN
USE_LEVELDB
USE_LMDB

13、打开layers/bnll_layer.cu,在开头找到const float kBNLL_THRESHOLD = 50.;所在的行,改为

//const float kBNLL_THRESHOLD = 50.;
#define kBNLL_THRESHOLD 50.0
14、打开util/io.cpp,在开头添加

#if defined(_MSC_VER)
#include <io.h>
#endif
15、打开util/signal_handler.cpp,在第16行左右的地方,修改为

#ifdef _MSC_VER
	case SIGBREAK:  // there is no SIGHUP in windows, take SIGBREAK instead.
		got_sighup = true;
		break;
#else
	case SIGHUP:
		got_sighup = true;
		break;
#endif
在第36行左右的地方,修改为
#ifdef _MSC_VER
	if (signal(SIGBREAK, handle_signal) == SIG_ERR) {
		LOG(FATAL) << "Cannot install SIGBREAK handler.";
	}
	if (signal(SIGINT, handle_signal) == SIG_ERR) {
		LOG(FATAL) << "Cannot install SIGINT handler.";
	}
#else
	struct sigaction sa;
	// Setup the handler
	sa.sa_handler = &handle_signal;
	// Restart the system call, if at all possible
	sa.sa_flags = SA_RESTART;
	// Block every signal during the handler
	sigfillset(&sa.sa_mask);
	// Intercept SIGHUP and SIGINT
	if (sigaction(SIGHUP, &sa, NULL) == -1) {
		LOG(FATAL) << "Cannot install SIGHUP handler.";
	}
	if (sigaction(SIGINT, &sa, NULL) == -1) {
		LOG(FATAL) << "Cannot install SIGINT handler.";
	}
#endif
在第64行左右的地方,修改为
#ifdef _MSC_VER
		if (signal(SIGBREAK, SIG_DFL) == SIG_ERR) {
			LOG(FATAL) << "Cannot uninstall SIGBREAK handler.";
		}
		if (signal(SIGINT, SIG_DFL) == SIG_ERR) {
			LOG(FATAL) << "Cannot uninstall SIGINT handler.";
		}
#else
		struct sigaction sa;
		// Setup the sighub handler
		sa.sa_handler = SIG_DFL;
		// Restart the system call, if at all possible
		sa.sa_flags = SA_RESTART;
		// Block every signal during the handler
		sigfillset(&sa.sa_mask);
		// Intercept SIGHUP and SIGINT
		if (sigaction(SIGHUP, &sa, NULL) == -1) {
			LOG(FATAL) << "Cannot uninstall SIGHUP handler.";
		}
		if (sigaction(SIGINT, &sa, NULL) == -1) {
			LOG(FATAL) << "Cannot uninstall SIGINT handler.";
		}
#endif
16、打开util/db_lmdb.cpp,在开头添加

#if defined(_MSC_VER)
#include <direct.h>
#define mkdir(X, Y) _mkdir(X)
#endif
17、打开proto/caffe.pb.cc,将
#include "caffe.pb.h"
改为

#include "caffe/proto/caffe.pb.h"
至此,libcaffe工程应该没有什么错误了,可以先一个一个.cpp、.cu文件编译看有没有错误,.cu文件需要右键属性,在General->Item Type中将其修改为CUDA C/C++,并且所有的.cu文件都需要修改,可以按住Ctrl选中所有的cu文件,然后一次性修改Type。没有错误的话,可以编译libcaffe工程了,应该没有太大问题。

现在开始配置编译Caffe工程

1、右键Caffe工程打开属性窗口,将平台改为x64

2、在属性窗口中找到General->Output Directory,在Debug和Release均将其修改为

$(SolutionDir)..\$(Platform)\$(Configuration)\

3、找到General->Character Set,将其改为使用多字节字符

4、找到C/C++->SDL checks,更改为no

5、找到VC++ Directories->Include Directories,在Debug和Release均添加以下路径

$(Boost_path)
$(CUDA_PATH)\include
$(SolutionDir)..\..\include
$(OpenCV_build_path)\include
$(OpenCV_build_path)\include\opencv
$(OpenCV_build_path)\include\opencv2
$(SolutionDir)..\..\3rdparty\include
$(SolutionDir)..\..\3rdparty\include\lmdb
$(SolutionDir)..\..\3rdparty\include\hdf5
$(SolutionDir)..\..\3rdparty\include\openblas

6、找到VC++ Directories->Library Directories,在Debug和Release均添加以下路径
$(OutDir)
$(CUDA_LIB_PATH)
$(Boost_lib_path)
$(SolutionDir)..\..\3rdparty\lib
$(OpenCV_build_path)\x64\vc12\lib
7、找到Linker->Input->Additional Dependencies,在Debug模型下添加以下依赖

libcaffe.lib
opencv_core2411d.lib
opencv_calib3d2411d.lib
opencv_contrib2411d.lib
opencv_flann2411d.lib
opencv_highgui2411d.lib
opencv_imgproc2411d.lib
opencv_legacy2411d.lib
opencv_ml2411d.lib
opencv_gpu2411d.lib
opencv_objdetect2411d.lib
opencv_photo2411d.lib
opencv_features2d2411d.lib
opencv_nonfree2411d.lib
opencv_stitching2411d.lib
opencv_video2411d.lib
opencv_videostab2411d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
leveldbd.lib
libglog.lib
libhdf5_D.lib
libhdf5_hl_D.lib
libopenblas.dll.a
libprotobufd.lib
lmdbd.lib
boost_system-vc120-mt-gd-1_61.lib
boost_chrono-vc120-mt-gd-1_61.lib
boost_date_time-vc120-mt-gd-1_61.lib
boost_filesystem-vc120-mt-gd-1_61.lib
boost_thread-vc120-mt-gd-1_61.lib
Shlwapi.lib
在Release模式下添加

libcaffe.lib
opencv_core2411.lib
opencv_calib3d2411.lib
opencv_contrib2411.lib
opencv_flann2411.lib
opencv_highgui2411.lib
opencv_imgproc2411.lib
opencv_legacy2411.lib
opencv_ml2411.lib
opencv_gpu2411.lib
opencv_objdetect2411.lib
opencv_photo2411.lib
opencv_features2d2411.lib
opencv_nonfree2411.lib
opencv_stitching2411.lib
opencv_video2411.lib
opencv_videostab2411.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
leveldb.lib
libglog.lib
libhdf5.lib
libhdf5_hl.lib
libopenblas.dll.a
libprotobuf.lib
lmdb.lib
boost_system-vc120-mt-1_61.lib
boost_chrono-vc120-mt-1_61.lib
boost_date_time-vc120-mt-1_61.lib
boost_filesystem-vc120-mt-1_61.lib
boost_thread-vc120-mt-1_61.lib
Shlwapi.lib

编译Caffe工程,应该没有太大问题,如果没有配置对的话,可能会出现应用程序无法正常启动的错误。

这是release模式下的运行结果

这是debug模式下运行结果


四、参考文献

我主要用到了两篇博客,在这里表示感谢

【caffe-windows】Linux至Windows平台的caffe移植

Build Caffe in Windows with Visual Studio 2013 + CUDA 6.5 + OpenCV 2.4.9


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值