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\lib9、找到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.014、打开util/io.cpp,在开头添加
#if defined(_MSC_VER)#include <io.h>#endif15、打开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.";}#endif16、打开util/db_lmdb.cpp,在开头添加
#if defined(_MSC_VER)#include <direct.h>#define mkdir(X, Y) _mkdir(X)#endif17、打开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\openblas6、找到VC++ Directories->Library Directories,在Debug和Release均添加以下路径
$(OutDir)$(CUDA_LIB_PATH)$(Boost_lib_path)$(SolutionDir)..\..\3rdparty\lib$(OpenCV_build_path)\x64\vc12\lib7、找到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
- Caffe移植到windows
- 移植caffe到hi3519
- caffe移植到mxnet
- Caffe实战系列:如何将CRFAsRNN移植到caffe-windows上去
- Caffe模型移植到MXNet
- caffe移植到arm平台
- 【caffe-windows】Linux至Windows平台的caffe移植
- tremulous移植到windows
- linux到windows移植
- 自动代码移植:从Caffe到Tensorflow
- 从Windows移植到Linux
- 将pthread移植到windows
- windows到Linux代码移植
- linux代码移植到windows
- C++ Windows移植到 linux
- Windows 服务移植到Mono
- 最新版libvibe++移植到Windows
- caffe-stn移植到高版本的方法
- [Linux操作系统]Linux操作系统的内存分布
- linux下配置redis后台启动
- 多线程常用方法(一)
- Java并发编程 06 闭锁、同步屏障、信号量详解
- 剑指Offer------把数组排成最小的数
- Caffe移植到windows
- 超级详细----ESP3266(2)
- nginx在ubuntu下的快速配置
- 51nod 1276 岛屿的数量 思维题,很棒的题目
- ORB特征原理
- python 列表与元组
- iOS版QQ的黏性下拉刷新效果简易实现
- CSDN-markdowm编辑文章技巧
- 41. First Missing Positive(第一个缺失的正数)