admin管理员组文章数量:1567571
2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本来也装了Ubuntu可以很方便的配置好,无奈在家的风格是“娱乐的时候抽空学习”,所以移植到Windows还是很有必要的。但是,公司禁止将公司内部资料带出,很多地方又都忘记了,周末磨了一天终于移植完,本篇为记录将Caffe移植至Windows7 x64系统下的一些关键步骤。第一步先看看这老些依赖库怎么搞。
在真正开始编译各依赖库之前,需要准备一些必备工具:
首先当然是VS2013,下载地址:https://www.visualstudio/
其次是CMake工具,下载地址:http://www.cmake/download/
1.Boost
下载地址:http://www.boost/
编译方法:
1) 运行Visual Studio Tools中的VS2013 x64 Cross Tools Command Prompt终端工具
2) 从终端进入boost库所在目录,如D:\LIBS\boost_1_57_0
3) 运行bootstrap.bat生产64位的bjam.exe
4) 输入命令进行编译,更正一下,msvc-12.0才是vs2013哈,感谢halooooJeffrey http://weibo/2211847364
静态库:
bjam --build-type=complete
toolset=msvc-9.0toolset=msvc-12.0 threading=multi link=static address-model=64共享库:
bjam --build-type=complete
toolset=msvc-9.0toolset=msvc-12.0 threading=multi link=shared address-model=64
2.OpenCV
下载地址:http://opencv/downloads.html 本文中使用的是2.4.10版本
编译方法:
下载后的安装包中有已编译好的库,可直接引用,如D:\LIBS\opencv\build\x64\vc12
3.OpenBlas
下载地址:http://sourceforge/projects/openblas/files/
编译方法:
OpenBlas库在windows上编译起来比较复杂,这里给出的下载地址是一个已编译好的压缩包OpenBLAS-v0.2.14-Win32.zip (12.1 MB),直接提供了./bin ./include ./lib路径
4.CUDA
下载地址:https://developer.nvidia/cuda-downloads
编译方法:
与OpenCV类似,安装好后直接有已编译好的库。如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include和C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64
以上是依赖库比较常用,最好将该它们的include和lib加入到Windows的环境变量中,方便后续的库的编译
5.GFlags
下载地址:https://github/gflags/gflags
编译方法:
1) 启动CMake(cmake-gui)工具
2) 设置source code路径和build路径
3) 单击Configure按钮,并选择并选择Visual Studio 12 2013 Win64编译器编译器
4) 更新完成后,勾选中BUILD_SHARED_LIBS和BUILD_STATIC_LIBS
5) 单击Generate按钮,生成VS工程
6) 打开刚刚生成的VS工程,build其中的ALL_BUILD工程,注意选择x64模式,并分别生成Debug和Release下的库
7) 编译成功后,在工程路径下会生成bin、include、lib三个文件夹
6.GLog
下载地址:https://github/google/glog
编译方法:
该工程中包含VS工程google-glog.sln,打开直接编译即可,同样注意Solution Platform选择x64模式,并分别生成Debug和Release下的库
7.LevelDB
下载地址:https://github/bureau14/leveldb
这里没有选择官方的https://github/google/leveldb是由于官方版本移除了CMake的依赖项,自己写起来比较复杂
编译方法:
与编译GFlags方法类似,唯一需要注意的地方是将CMakeLists.txt中第82行的-DSNAPPY注释掉,否则需要依赖Snappy库,其实并不绝对需要,为了简单起见将此库去掉。另外Leveldb依赖于boost库,如果没有将boost库添加至环境变量,可能需要手动进行设置。
8.LMDB
下载地址:https://gitorious/mdb/mdb/archive/462dc097451834477b597447af69c5acc93182b7.tar.gz
编译方法:
1) 解压压缩包到某路径,例如D:\CODE\CXX\mdb-mdb
2) 在VS2013中新建工程,FILE --> New --> Project From Existing Code..
3) 选取源码所在路径,并给工程起名
4) 单击next按钮后选择Project type为Console application project
5) 将Solution Platform修改为x64模式
6) 注意将工程的输出改为静态库,右键单击工程 --> property --> Configuration Properties --> General --> Project Default --> Configureation Type --> Static library (.lib)
7) 其中一个.c文件中包含了unistd.h,为了解决这个问题需要准备三个文件 unistd.h、getopt.h、getopt.c。unistd.h可以考http://stackoverflow/questions/341817/is-there-a-replacement-for-unistd-h-for-windows-visual-c解决。另外两个可以从http://ieng6.ucsd.edu/~cs12x/vc08install/getopt9.zip下载
8) 最后编译即可
9.ProtoBuf
下载地址:https://github/google/protobuf
编译方法:
压缩包里有一个叫vsprojects的文件夹,其中有现成的VS工程,可以用来直接编译,也需要注意将Solution Platform修改为x64模式
10.HDF5
下载地址:http://www.hdfgroup/ftp/HDF5/current/src/CMake/hdf518-CMakeWindows.zip
编译方法:
解压后,在VS2013 x64 Cross Tools Command Prompt终端工具中运行build-VS2013-64.bat即可。
整理头文件和库文件
将5-10的头文件和编译后的库统一整理到一个3rdparty文件夹下,其中包含两个文件夹include和lib
include文件夹下包含gflags、glog、google、hdf5、leveldb、lmdb六个文件。gflags的头文件来自于生成的VS工程目录中的include文件夹;glog的头文件来自于VS工程目录中的src\windows文件夹;google中是protobuf的头文件,来自于压缩包中的src\google文件夹;hdf5来自于压缩包中的CMake\hdf5-1.8.14\src文件夹,保留.h文件即可;leveldb的头文件来自于压缩包的include文件夹;lmdb的头文件来自于压缩包中的libraries\liblmdb文件夹,保留.h文件即可
lib文件夹中的.lib文件直接从编译好的工程目录下拷贝即可,注意debug模式下的.lib文件的文件名修改为xxxd.lib形式
至此,caffe需要的各项依赖库已经准备完毕,后续会上一些图,看起来直观一些。
VS2013配置Caffe卷积神经网络工具(64位Windows 7)——建立工程
将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本来也装了Ubuntu可以很方便的配置好,无奈在家的风格是“娱乐的时候抽空学习”,所以移植到Windows还是很有必要的。但是,公司禁止将公司内部资料带出,很多地方又都忘记了,周末磨了一天终于移植完,本篇为记录将Caffe移植至Windows7 x64系统下的一些关键步骤。下面介绍如何从源码建立VS2013工程。
1. 从https://github/BVLC/caffe下载caffe源码,master或者dev版本都可以,本文中以dev为例
2. 新建一个空的控制台VS2013工程,起名为caffe-dev。
File --> New --> Project
选择Win32 Console Application
选择工程路径,比如D:\CODE\CXX
给项目命名caffe-dev
单击OK后选择Empty project
3. 将工程的Solution Platform改为x64
Build --> Configuration Manager --> Active solution platform --> new --> x64 --> OK
4. 设置CUDA编译
Project --> Build Customizations... --> CUDA 7.0 --> OK
5. 设置一些工程下的路径,注意Debug和Release下都要设置
在Project --> Properties --> Configuration Properties --> VC++ Directories --> Include Directories中添加openblas、opencv、boost和cuda,例如
D:\LIBS\boost_1_57_0;D:\LIBS\OpenBLAS\include
D:\LIBS\opencv\build\include
D:\LIBS\opencv\build\include\opencv
D:\LIBS\opencv\build\include\opencv2
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include
在Project --> Properties --> Configuration Properties --> VC++ Directories --> Library Directories中添加openblas、opencv、boost和cuda,例如
D:\LIBS\OpenBLAS\lib
D:\LIBS\opencv\build\x64\vc12\lib
D:\LIBS\boost_1_57_0\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64
6. 将压缩包内的include、src和tools文件夹拷贝到工程根目录下,同时把整理好的3rdparty文件夹也拷贝到工程目录下
7. 添加caffe的路径和3rdparty中第三方依赖库的路径,同样Debug和Release都要设置
在Project --> Properties --> Configuration Properties --> C/C++ --> General --> Additional Include Directories中添加
../include;../src
../3rdparty/include
../3rdparty/include/hdf5
../3rdparty/include/lmdb
在Project --> Properties --> Configuration Properties --> Linker --> General --> Additional Library Directories中添加
../3rdparty/lib
在Project --> Properties --> Configuration Properties --> Linker --> Input --> Additional Dependencies中添加
opencv_core2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
cudart.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
注意在Debug下应添加xxxd.lib形式的静态库
opencv_core2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
cudart.lib
cublas.lib
curand.lib
gflagsd.lib
libglogd.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
8. 利用protoc.exe和caffe.proto生成caffe.pb.h和caffe.pb文件
在编译protobuf的时候会生成一个可执行文件protoc.exe,在工程的D:\CODE\CXX\caffe-dev\src\caffe\proto路径下有一个文件叫caffe.proto,可以将protoc.exe拷贝到该路径下,在命令行中进入D:\CODE\CXX\caffe-dev\src\caffe\proto路径,输入命令
[cpp] view plain copy
- protoc.exe caffe.proto --cpp_output=./
可以看到在该路径下会生成caffe.pb.h和caffe.pb,在D:\CODE\CXX\caffe\include\caffe中新建一个文件夹proto,将生成的两个文件移动到D:\CODE\CXX\caffe\include\caffe\proto中
9. 准备mkstemp.h和mkstemp.cpp文件。
将mkstemp.h放在include/caffe/util/路径下,mkstemp.h中的内容为
[cpp] view plain copy
- #include <windows.h>
- #include <io.h>
- int mkstemp(char *templates);
将mkstemp.cpp放在src/caffe/util/路径下,mkstemp.cpp中的内容为
[cpp] view plain copy
- /* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
- (C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version. */
- #include "caffe/util/mkstemp.hpp"
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- static const char letters[] =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- /* Generate a temporary file name based on TMPL. TMPL must match the
- rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
- does not exist at the time of the call to mkstemp. TMPL is
- overwritten with the result. */
- int mkstemp (char *tmpl)
- {
- int len;
- char *XXXXXX;
- static unsigned long long value;
- unsigned long long random_time_bits;
- unsigned int count;
- int fd = -1;
- int save_errno = errno;
- /* A lower bound on the number of temporary files to attempt to
- generate. The maximum total number of temporary file names that
- can exist for a given template is 62**6. It should never be
- necessary to try all these combinations. Instead if a reasonable
- number of names is tried (we define reasonable as 62**3) fail to
- give the system administrator the chance to remove the problems. */
- #define ATTEMPTS_MIN (62 * 62 * 62)
- /* The number of times to attempt to generate a temporary file. To
- conform to POSIX, this must be no smaller than TMP_MAX. */
- #if ATTEMPTS_MIN < TMP_MAX
- unsigned int attempts = TMP_MAX;
- #else
- unsigned int attempts = ATTEMPTS_MIN;
- #endif
- len = strlen (tmpl);
- if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
- {
- errno = EINVAL;
- return -1;
- }
- /* This is where the Xs start. */
- XXXXXX = &tmpl[len - 6];
- /* Get some more or less random data. */
- {
- SYSTEMTIME stNow;
- FILETIME ftNow;
- // get system time
- GetSystemTime(&stNow);
- stNow.wMilliseconds = 500;
- if (!SystemTimeToFileTime(&stNow, &ftNow))
- {
- errno = -1;
- return -1;
- }
- random_time_bits = (((unsigned long long)ftNow.dwHighDateTime << 32)
- | (unsigned long long)ftNow.dwLowDateTime);
- }
- value += random_time_bits ^ (unsigned long long)GetCurrentThreadId ();
- for (count = 0; count < attempts; value += 7777, ++count)
- {
- unsigned long long v = value;
- /* Fill in the random bits. */
- XXXXXX[0] = letters[v % 62];
- v /= 62;
- XXXXXX[1] = letters[v % 62];
- v /= 62;
- XXXXXX[2] = letters[v % 62];
- v /= 62;
- XXXXXX[3] = letters[v % 62];
- v /= 62;
- XXXXXX[4] = letters[v % 62];
- v /= 62;
- XXXXXX[5] = letters[v % 62];
- fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE);
- if (fd >= 0)
- {
- errno = save_errno;
- return fd;
- }
- else if (errno != EEXIST)
- return -1;
- }
- /* We got out of the loop because we ran out of combinations to try. */
- errno = EEXIST;
- return -1;
- }
10. 将caffe的源文件添加到工程中
将D:\CODE\CXX\caffe-dev\src\caffe路径下除了test文件中的所有源文件添加到工程中,如果想要跑一些测试代码,也可以把test中的源文件加进去
将D:\CODE\CXX\caffe-dev\include\caffe\proto下的caffe.pb添加到工程中
将D:\CODE\CXX\caffe-dev\tools下的caffe.cpp添加到工程中
11. 修改一些代码
在include/caffe/common.hpp中添加
#include <direct.h>
在include/caffe/util/io.hpp中添加
#include "mkstemp.hpp"
,并将close
函数替换为_close
,将char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
替换为errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
将bnll_layer.cu中的
const float kBNLL_THRESHOLD = 50.;
修改为#define kBNLL_THRESHOLD 50.
将util/db.cpp中的
mkdir(source.c_str(), 0744)
修改为_mkdir(source.c_str())
将util/io.cpp中的
open
函数替换为_open
,close
函数替换为_close
将util/io.cpp中
ReadProtoFromBinaryFile
函数中的int fd = open(filename, O_RDONLY);
替换为int fd = open(filename, O_RDONLY | O_BINARY);
在util/math_functions.cpp中添加
[cpp] view plain copy在 common.cpp 中添加
- #define __builtin_popcount __popcnt
- #define __builtin_popcountl __popcnt
#include <process.h>
将
pid = getpid();
替换为pid = _getpid(); 这里本来有个笔误,谢谢dongb5lz的提醒
注释掉
::google::InstallFailureSignalHandler();
将solver.cpp中的
snprintf函数替换为sprintf_s
版权声明:本文标题:VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727168489a1100030.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论