Caffe 是一个高效的深度学习框架,鉴于不想折腾装个双系统,最近鼓捣了下用caffe源码在windows进行编译。非常感谢Yangqing Jia博士的caffe开源代码、Neil Z.Shao's博客的指导,以及happynear的工程文件提供的帮助。本博客caffe里C/C++部分编译主要参考了Neil Z.Shao's博客,python wapper 和 matlab wapper编译主要参考了happynear的工程文件。鉴于编译过程并未记录下详细流程,步骤不详之处可参考上述两个资料。本博客适合对visual studio 2013和opencv配置有一定了解的同学。

1、准备工作

编译环境:windows 7 64位系统 + Visual studio 2013

依赖包:

  • opencv,opencv版本采用的是opencv 3.0,opencv的安装请参考官方toutorials。opencv 3.0相比之前的版本,配置简单了很多。
  • cuda,cuda版本采用的是cuda 7.0,这个可以从nvidia官网下载。
  • Boost,使用的是boost_1_56_0-msvc-12.0-64.exe.
  • OpenBLAS、GFlags、GLog、ProtoBuf、LevelDB、HDF5、LMDB,博主偷懒直接采用了Neil Z.Shao提供的编译好的文件3rdparty.zip。详细编译步骤可以参考其博客,以及另外一个github repository
  • caffe源码,https://github.com/BVLC/caffe
  • python 2.7 以及模块numpy scipy scikit-image matplotlib ipython h5py networkx nose pandas python-dateutil protobuf python-gflags pyyaml Pillow,这些依赖文件在caffe源码下的python文件夹里的requirements.txt里说明,其中leveldb貌似是没有windows版本的,不过缺少这个模块不安装不影响使用。
  • matlab R2014a

2、C/C++编译

  • 新建工程与相应环境配置
  1. 安装opencv、cuda、Boost,这些都有exe文件,安装很直接。
  2. 下载caffe源码,并解压
  3. 下载第三方依赖包3rdparty.zip,并解压至caffe源码下与cmake、data之类文件夹的同级目录,如下图所示

4.  打开visual studio 2013 新建win32 控制台工程,并将位置工程的解决方案设在caffe源码下的根目录(具体说就是cmake等文件夹与.sln文件是同级目录)。

5.   将解决方案平台从win32改至x64(在win32下应该也能编译通过)。修改方法如下图所示:

(图片截至Neil Z.Shao's博客)

6.  编译环境配置:主要是进行解决方案属性配置,debug x86 和 release x86 需要分别进行配置,如果你仅使用其中一个,对一个进行配置即可。

debug x86 属性配置:

1) Configuration Properties -> General, Output Directory 设置为‘../bin’(这个文件夹需要新建,主要用于放置编译输出的exe文件,这便于后面使用)

2) Configuration Properties -> C/C++ -> General, Additional Include Directories 添加caffe源码里的include文件夹,src文件夹,第三方依赖包头文件,cuda头文件,opencv头文件,boost头文件,比如我的配置如下,

*\caffedev\src;
              *\caffedev\include;
              *\caffedev\3rdparty\include\openblas;
              *\caffedev\3rdparty\include\lmdb;
              *\caffedev\3rdparty\include\hdf5;
              *\caffedev\3rdparty\include;
              *\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include;
              *\opencv\build\include\opencv2;
              *\opencv\build\include\;
              *\opencv\build\include\opencv;
              *\boost_1_56_0

*省略了软件的安装位置,这个根据你的软件安装位置找到这些文件夹即可。

3) Configuration Properties -> linker -> General,添加相应的lib文件路径,我的配置如下

*\caffedev\3rdparty\lib;
              *\boost_1_56_0\lib64-msvc-12.0;
              *\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64;
              *\opencv\build\x64\vc12\lib;

*省略了软件的安装位置,这个根据你的软件安装位置找到这些文件夹即可。

4) Configuration Properties -> linker -> Input ,添加相应lib文件

opencv_ts300d.lib;opencv_world300d.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;cudart.lib;cuda.lib;nppi.lib;cufft.lib;cublas.lib;curand.lib

release x86 属性配置:

前三步与debug x86 配置一样,第4)步的lib文件需要修改为如下:

opencv_ts300.lib;opencv_world300.lib;gflags.lib;libglog.lib;libopenblas.dll.a;libprotobuf.lib;libprotoc.lib;leveldb.lib;lmdb.lib;libhdf5.lib;libhdf5_hl.lib;Shlwapi.lib;cudart.lib;cuda.lib;nppi.lib;cufft.lib;cublas.lib;curand.lib

7.  系统环境变量设置,opencv bin目录添加到系统环境变量的path里。比如我添加的就是

*\opencv\build\x64\vc12\bin

  • 开始编译

           对于像caffe这种大工程文件,最好的办法就是一个一个文件进行编译[1]。首先将caffe/src/caffe内的cpp文件导入到解决方案里的Source Files文件夹下,下面对这个几个文件进行逐个编译。

1、 common.cpp文件

  • #include <process.h>添加到common.cpp,修复getpid出错
  • Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions,添加_CRT_SECURE_NO_WARNINGS修复fopen_s问题
  • 将出错的getpid行替换为:
    #ifndef _MSC_VER
    pid = getpid();
    #else
    pid = _getpid();
    #endif

2、 blob.cpp文件

  • caffe.proto创建caffe.pb.h文件,下载GeneratePB.bat文件并放置caffe/scripts文件夹下,双击运行即可,再编译blob.cpp文件,应该能编译通过

3、 net.cpp文件

  • 添加#include “mkstemp.h”(mkstemp.h和mkstemp.cpp已放在3rdpatty里)到io.hpp,可以解决mkstemp缺失问题。
  • io.hpp文件里使用到了close函数的行用如下代码段替换:
    #ifndef _MSC_VER
    close(fd);
    #else
    _close(fd);
    #endif
  • 用到mkstemp函数的用如下代码段替换:
    #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文件

  • 添加如下行到solver.cpp里修复snprintf问题。

    // port for Win32
    #ifdef _MSC_VER
    #define snprintf sprintf_s
    #endif

5、caffe/src/layers文件夹的文件

  • caffe/src/layers文件夹里主要有两种文件.cpp和.cu文件,.cu文件是用到了cuda的代码,要编译这些文件需要进行些设置。首先在Source Files新建一个layers文件夹,并且导入一个.cu文件。
  • PROJECT -> Build Customization

(图片截至Neil Z.Shao's博客)

  • 右击.cu文件选择属性,Item Type 设为 CUDA C/C++。
  • 将caffe/src/layers文件夹里文件全部导入解决方案里的layers,此时所有.cu文件都具有相同配置属性。
  • 在bnll_layer.cu里修改const float kBNLL_THRESHOLD = 50.为#define kBNLL_THRESHOLD 50.0

6、caffe/src/util

  • 新建util文件夹,导入caffe源码里util文件夹下的代码,定位到ReadProtoFromBinaryFile函数,修改O_RDONLY 为O_RDONLY | O_BINARY
  • 添加如下行到io.cpp文件
    // port for Win32
    #ifdef _MSC_VER
    #define open _open
    #endif
  • 手动修改close() 为_close()。
  • 添加如下行到math_functions.cpp文件以修复__builtin_popcount 和 __builtin_popcountl出错
    #define __builtin_popcount __popcnt
    #define __builtin_popcountl __popcnt

7、caffe/src/proto

  • 新建proto文件夹,导入caffe/src/proto里通过GeneratePB.bat生成的.cc文件(caffe.pb.cc” 和 “caffe_pretty_print.pb.cc)
  • Configuration Properties -> C/C++ -> Command Line (Both Debug and Release mode)添加 -D_SCL_SECURE_NO_WARNINGS 以修复std::_Copy_impl 不安全问题

8、caffe.cpp

  • 从caffe/tools里导入caffe.cpp文件
  • 右击解决方案,选build,整个工程应该能顺利编译通过。
  • 无GPU的编译方法
  1. 步骤基本与上述一致,caffe/src/layers不导入.cu文件
  2. 在common.hpp添加宏定义
    #define CPU_ONLY
  • 测试
  • 测试方法请参考Neil Z.Shao's博客,这里不再介绍。

3、python wapper编译

python wapper编译的资料较少,非常happynear感谢提供的工程文件。主要步骤如下:

  • 新建一个工程,配置方法如上。将caffe.cpp移出工程,添加caffe/python/caffe文件下的_caffe.cpp。
  • Configuration Properties -> C/C++ -> General, Additional Include Directories 添加:

*\Python27\Lib\site-packages\numpy\core\include;

*\Python27\include;

  • Configuration Properties -> linker -> General,添加相应的lib文件路径:

*\Python27\libs;

  • Configuration Properties -> linker -> Input ,添加相应lib文件

python27.lib

  • Configuration Properties -> linker -> General,Output Directory 设置为..\python\caffe,Targe Name 设为_caffe, Target Extension设为.pyd,Configuration Type设为 Dynamic Library(.dll)。
  • 此时应该能顺利编译通过。
  • 安装相应的python依赖包,这个使用 pip install 命令即可安装。leveldb没有windows版本,这个不安装不影响使用。
  • 若你采用的debug模式编译,需要将3rdparty压缩包bin里的dll文件和boost_python-vc120-mt-1_56.dll拷贝至python/caffe。
  • 在之前的GeneratePB.bat文件添加如下行,双击运行。并将/src/caffe/proto文件夹拷贝至python/caffe下,并在proto文件夹里创建一个名为__init__.py的空文件。
    "../3rdparty/bin/protoc" -I="../src/caffe/proto" --python_out="../src/caffe/proto" "../src/caffe/proto/caffe.proto"
  • 将src/caffe/proto文件拷至python/caffe
  • 将*/python/caffe添加至系统变量。
  • 下载安装Graphviz2.38,并将*\Graphviz2.38\bin添加到系统变量。
  • 这样python文件夹下的大部分功能应该都能使用。

4、matlab wapper编译

matlab wapper编译和python差不多较少。主要步骤如下:

  • 新建一个工程,配置方法如C/C++部分。将caffe.cpp移出工程,添加caffe/matlab/+caffe/private文件下的caffe_.cpp。
  • Configuration Properties -> C/C++ -> General, Additional Include Directories 添加:

*\MATLAB\R2014a\extern\include;

  • Configuration Properties -> linker -> General,添加相应的lib文件路径:

*\MATLAB\R2014a\extern\lib\win64\microsoft;;

  • Configuration Properties -> linker -> Input ,添加相应lib文件

libmex.lib;libmat.lib;libmx.lib

  • Configuration Properties -> linker -> General,Output Directory 设置为..\matlab\+caffe\private,Targe Name 设为caffe_, Target Extension设为.mexw64,Configuration Type设为 Dynamic Library(.dll)。
  • 此时应该能顺利编译通过。
  • 这样matlab\文件夹下的大部分功能应该都能使用。matlab\demo\classification_demo.m 可用于测试是否安装成功,需要用到的训练好的模型可以从这里下载http://dl.caffe.berkeleyvision.org/

5、后记

  • C/C++部分参考Neil Z.Shao's博客,编译还是比较顺利的。python资料比较少,走了些弯路,happynear的工程文件提供了不少帮助,对此表示感谢。

reference:

[1] https://initialneil.wordpress.com/2015/01/11/build-caffe-in-windows-with-visual-studio-2013-cuda-6-5-opencv-2-4-9/

[2] http://blog.csdn.net/happynear/article/details/45372231

Caffe windows下安装攻略的更多相关文章

  1. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  2. windows下安装ubantu

        首先声明我是一个linux大菜鸟,之所以学这个,一个是好玩,另外做DL的一些软件如Caffe要在这个平台上运行,所以没事就鼓捣鼓捣.linux是一种内核,市场上支持这种内核的操作系统有uban ...

  3. Oracle 11g安装攻略

    Oracle 11g安装攻略 本攻略是以Win7-32位系统中安装Oracle 11g为示例,安装前大家需要确认以下几点: 你的内存足够大且没有问题,因为Oracle非常吃内存. 你的系统已经激活. ...

  4. Windows下安装storm-0.9.1

    Windows下安装storm-0.9.1的详细步骤如下: 1.确定已经正确安装JDK1.6或JDK1.7(具体安装步骤略) 2.安装Python2.7版本(测试storm-starter proje ...

  5. [转]Windows下安装storm-0.9.1

    来源:https://www.cnblogs.com/liuruitao/p/4669657.html Windows下安装storm-0.9.1的详细步骤如下: 1.确定已经正确安装JDK1.6或J ...

  6. Linux 系统 pptpd+radius+mysql 安装攻略

    分类: 原文地址:Linux 系统 pptpd+radius+mysql 安装攻略 作者:wfeng .你所需要的软件 内核最好能升级到2.6 如果你是centos的用户,可以通过yum update ...

  7. 转 windows下安装pycharm并连接Linux的python环境 以及 windows 下notepad ++编辑 linux 的文件

    ######sample 1:windows下安装pycharm并连接Linux的python环境 https://www.cnblogs.com/junxun/p/8287998.html wind ...

  8. MySQL8.0 zip压缩包版本 Windows下安装

    MySQL zip压缩包版本 Windows下安装 Download MySQL Community Server 解压到相应的目录 我的解压目录:D:\Program Files\mysql-8.0 ...

  9. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

随机推荐

  1. 【vue开发】 父组件传值给子组件时 ,watch props 监听不到解决方案

    解决方案: watch:{ data:{ immediate:true, handler:function(){ } }} 示例:  

  2. python 链接impala执行SQL

    项目中用python来链接impala数据库最常见,一个简单的链接,获取结果. #!/usr/bin/python # -*- coding:utf-8 -*- from impala.dbapi i ...

  3. win server服务器 关闭危险端口 135,137,138,139,445的方法

    Windows默认开放135.137.138.139和445五个端口,都与文件共享和打印机共享有关的,若机器连接网络后会在用户不知道的情况下泄露本机部分信息,这样会给用户带来一部分危险,所以我们在工作 ...

  4. 【Distributed】分布式配置中心

    一.概述 1.1 什么是分布式配置中心 常用分布式配置中心框架 二.Apollo阿波罗 2.1 Apollo特点 2.2 Apollo整体架构原理 2.3 Apollo Portol 环境搭建 Lin ...

  5. Windows10系统里安装SCons

    1. 安装python2.7 执行python2.x的安装包程序python-2.7.12.amd64.msi进行安装即可 2. 安装scons 下载scons-2.5.0.zip压缩包并解压缩 CM ...

  6. xtrabackup数据库备份工具

    下来我来介绍一下更强大的备份工具:xtrabackup xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速 ...

  7. [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录

    预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2  (具体配置参考 http://www.cnblogs.com/yoyok ...

  8. python3使用ConfigParser从配置文件中获取列表

    使用python3使用ConfigParser从配置文件中获取列表 testConfig.py #!/usr/bin/env python # coding=utf- __author__ = 'St ...

  9. ndk学习之C语言基础复习----指针、函数、预处理器

    指针: 指针乃C.C++的灵魂之所在,所以有必要好好的复习复习.什么是指针?一句话来概括:“指针是一个变量,它的值是一个地址.”,其中指针变量的声明有如下三种形式: 其中第一种是被推荐的写法. 其中还 ...

  10. 201871010111-刘佳华《面向对象程序设计(java)》第十七周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十七周学习总结 实验十七  线程同步控制 实验时间 2019-12-20 第一部分:理论知识总结 16.Java 的线程调 ...