Caffe移植到windows

来源:互联网 发布:centos 桥接网络 编辑:程序博客网 时间:2024/05/16 09:54

一、前言

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_WARNINGSUSE_OPENCVUSE_CUDNNUSE_LEVELDBUSE_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_VERcase SIGBREAK:  // there is no SIGHUP in windows, take SIGBREAK instead.got_sighup = true;break;#elsecase SIGHUP:got_sighup = true;break;#endif
在第36行左右的地方,修改为
#ifdef _MSC_VERif (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.";}#elsestruct sigaction sa;// Setup the handlersa.sa_handler = &handle_signal;// Restart the system call, if at all possiblesa.sa_flags = SA_RESTART;// Block every signal during the handlersigfillset(&sa.sa_mask);// Intercept SIGHUP and SIGINTif (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_VERif (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.";}#elsestruct sigaction sa;// Setup the sighub handlersa.sa_handler = SIG_DFL;// Restart the system call, if at all possiblesa.sa_flags = SA_RESTART;// Block every signal during the handlersigfillset(&sa.sa_mask);// Intercept SIGHUP and SIGINTif (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.libopencv_core2411d.libopencv_calib3d2411d.libopencv_contrib2411d.libopencv_flann2411d.libopencv_highgui2411d.libopencv_imgproc2411d.libopencv_legacy2411d.libopencv_ml2411d.libopencv_gpu2411d.libopencv_objdetect2411d.libopencv_photo2411d.libopencv_features2d2411d.libopencv_nonfree2411d.libopencv_stitching2411d.libopencv_video2411d.libopencv_videostab2411d.libcudart.libcuda.libnppi.libcufft.libcublas.libcurand.libgflagsd.libleveldbd.liblibglog.liblibhdf5_D.liblibhdf5_hl_D.liblibopenblas.dll.alibprotobufd.liblmdbd.libboost_system-vc120-mt-gd-1_61.libboost_chrono-vc120-mt-gd-1_61.libboost_date_time-vc120-mt-gd-1_61.libboost_filesystem-vc120-mt-gd-1_61.libboost_thread-vc120-mt-gd-1_61.libShlwapi.lib
在Release模式下添加

libcaffe.libopencv_core2411.libopencv_calib3d2411.libopencv_contrib2411.libopencv_flann2411.libopencv_highgui2411.libopencv_imgproc2411.libopencv_legacy2411.libopencv_ml2411.libopencv_gpu2411.libopencv_objdetect2411.libopencv_photo2411.libopencv_features2d2411.libopencv_nonfree2411.libopencv_stitching2411.libopencv_video2411.libopencv_videostab2411.libcudart.libcuda.libnppi.libcufft.libcublas.libcurand.libgflags.libleveldb.liblibglog.liblibhdf5.liblibhdf5_hl.liblibopenblas.dll.alibprotobuf.liblmdb.libboost_system-vc120-mt-1_61.libboost_chrono-vc120-mt-1_61.libboost_date_time-vc120-mt-1_61.libboost_filesystem-vc120-mt-1_61.libboost_thread-vc120-mt-1_61.libShlwapi.lib

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

这是release模式下的运行结果

这是debug模式下运行结果


四、参考文献

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

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

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


原创粉丝点击