不得不吐槽一句,windows下编译caffe要比ubuntu麻烦很多,稍不注意就是各种错误,时间久了重新编译还会忘记,因此对于windows必须做好详细的记录。
Windows下caffe编译来源主要有两种:(1)官方BLVC以及微软(Microsoft) (2)电子科大happynear的caffe-windows。
一)资源链接:
1)、官方caffe-windows
BLVC,Github:https://github.com/BVLC/caffe/tree/windows
Microsoft,Github链接:https://github.com/Microsoft/caffe
2)、国产Happynear的caffe-windows-ms
Github: https://github.com/happynear/caffe-windows/tree/ms
3)、mini-caffe: https://github.com/luoyetx/mini-caffe
4)、tiny-caffe(Mine): https://github.com/SyGoing/tiny-caffe
…还有很多其他DIY类型的Caffe,比如对于目标检测的caffe-SSD、Faster-RCNN caffe和C3D-caffe等等,其实都是针对特定应用添加了自定义层。由于caffe官方对于其维护减少,很多新的层都是很多野生程序员添加,并形成各色caffe。
另一种归类方式: Microsoft和happynear的caffe-wondws工程结构同宗,应该是happynear模仿Microsoft,然后DIY出自己的。
二)编译
1、编译环境:
win10+cuda8.0+cudnn5.1(cudnn6.0)+opencv3.1+vs2015,cuda8.0、cudnn和opencv安装随便百度很多。
2、编译
首先记录一下官版BLVC-caffe的编译过程,包括动态库及静态库编译,以及比较坑的python接口编译。
2.1 BLVC-caffe编译
默认已经安装了vs2015、cuda8.0和cuddnn5.1,并且安装好了Anaconda3和Anaconda2,这里要记录caffe的python2.7和python3.5两种版本接口的编译,python3.6的暂时还没有尝试,后续补上。PS:Anaconda安装参考我的另一篇博客(比较完整):
https://blog.csdn.net/ouyangfushu/article/details/79464276
从github上下载caffe,最好使用git,压缩包有时候容易丢失文件。
(1)git clone https://github.com/BVLC/caffe.git
(2)cd caffe
(3)git checkout windows
(4)cd scripts.这一步比较容易出岔子,因为我们需要根据自己需求配置build_win.cmd,这里经常出错。Notebook打开build_win.cmd,一般是修改这里
1)无python接口静态库及其可执行文件编译
WITH_NIJIA=0、BUILD_PYTHON=0、BUILD_PYTHON_LAYER=0、CMAKE_SHARED_BUILD=0(1编译动态库,0编译静态库),OK修改完以后,双击build_win.cmd。
期间会自动下载三方依赖库libraries_v140_x64_py27_1.1.0.tar.bz2,有时候下载不成功,不要紧,百度云盘:https://pan.baidu.com/s/1j1UDoqjzsAmv02bB72oDbQ
提取码:zayb,然后放在C:\Users\你的用户名\.caffe\dependencies\download下即可,然后再此双击buld_win.cmd.等待比较久编译完成。
2) 无python接口动态库编译
修改build_win.cmd的WITH_NIJIA=1、CMAKE_SHARED_BUILD=1,注意:需要安装ninjia,win+R进入cmd命令窗口,
conda install --yes ninja 或者pip install ninjia
双击build_win.cmd,等待编译完成,此时会生成caffe.dll动态库。接下来就是整理编译好的库作为三方库编写caffe接口函数进行调用即可。具体参考:
https://blog.csdn.net/ouyangfushu/article/details/79546566
编译好以后build文件夹下是这样:
3)有Python2接口的静态库编译
确保安装了Anaconda2(环境变量中配置了,如果有多个版本则Anaconda2应该位于首位),修改build_win.cmd, CMAKE_BUILD_SHARED_LIBS=0、WITH_NINJA=0、PYTHON_VERSION=2、BUILD_PYTHON=1、BUILD_PYTHON_LAYER=1,修改完后这样,同样执行build_win.cmd.
4)有python3.5接口的静态库编译
安装了python3.5(Anaconda3的python3.5版本),下载这个版本Anaconda3-2.4.1-Windows-x86_64.exe即可,同样安装好重要的库如protobuf,ninjia和numpy等,下面的命令一顿操作即可。
conda config --add channels conda-forge
conda config --add channels willyd
conda install --yes ninja numpy scipy protobuf==3.1.0 six scikit-image pyyaml pydotplus graphviz
conda install --yes numpy scipy matplotlib scikit-image pip
pip install protobuf
接下来修改build_win.cmd如下图:
执行build_win.cmd,期间会自动下载libraries_v140_x64_py35_1.1.0.tar.bz2,
百度云:https://pan.baidu.com/s/1Ete_kISilZrbkFgobuTsrA
提取码:dt7r
放在C:\Users\你的用户名\.caffe\dependencies\download下即可,然后双击build_win.cmd.完了吗? NO,问题来了……编译过程中会提示找不到include_symbols.hpp,
解决方法:在编译python2接口发现会在build/ caffe下生成:export.hpp和include_symbols.hpp,但是在编译python3.5时却少了include_symbols.hpp,解决办法比较取巧:等build_win.cmd失败后,把原来编译python2版本接口的include_symbols.hpp拷贝到这个目录下,vs2015打开build下的Caffe.sln,右击BUILD_ALL生成解决方案即可成功。
编译好的python接口,caffe目录下
回到caffe根目录下,拷贝python文件下的caffe文件夹到Anaconda3\Lib\site-packages文件夹下。注意坑来了,cmd下无法包含import caffe 提示使用了python2.dll,原来这个文件夹下默认是python2.dll,不急【进入编译的build目录下,(1)将install/bin/下的文件拷贝到caffe文件夹(caffe根目录下的python/caffe)下,删除python27.dll,(2)拷贝build\lib\Release下_caffe.pyd到caffe文件夹(caffe根目录下的python/caffe),然后再复制到Anaconda3\Lib\site-packages下即可】。
2.2 happynear的caffe-windows编译
截止2018.12.28,该版本caffe支持cuda9.0,依赖boost1.65.但是貌似编译有问题。因此还是在cuda8.0下编译,boost依旧是1.61版本(下载好源码以后需要稍作修改,三方依赖库依然使用老版本的)。
这个版本比较符合常规编译,作者提供好了编译的工程,不用BLVC那么麻烦(类似微软的caffe)。进入官网https://github.com/happynear/caffe-windows/tree/ms,准备工作下载三方依赖库。
百度网盘:https://pan.baidu.com/s/1_0SSmGHuFyYPO4Qj7XaDOQ
提取码:4dax
1、git clone https://github.com/happynear/caffe-windows.git
2、进入caffe-windows/windows下,将三方依赖库压缩包thirdparty.zip解压到thirdparty目录下。CommonSettings.props.example文件去掉.example。Notebook打开CommonSettings.props
3、GPU静态库编译
在这里只编译C++库,UseNCCL、PythonSupport、MatlabSupport和MXNetSupport设置为false。由于要编译cuda8.0的版本,而原版本支持cuda9.0,所以需要改一下libcaffe文件夹下的libcaffe.vcxproj。打开,第37行和470行,如果是这样则不需要修改,如果指明是cuda9.0则需要改成
Cuda8.0.
接下来就可以开始编译了,打开工程Caffe.sln,编译模式修改为
工程目录如下:
首先编译libcaffe,然后再编译整个解决方案。
4、编译动态库
右键licaffe,扩展名改为.dll,配置类型改为动态库。如图
在caffe.pb.h中添加宏定义以导出的proto类型,便于在使用中调用时能正确是被层类型及相关参数。
#ifdef CAFFELIB_EXPORTS
#define CAFFELIB_API __declspec(dllexport)
#else
#define CAFFELIB_API __declspec(dllimport)
#endif
需要导出的类前面加CAFFELIB_API,在caffe.pb.h中需要添加的类有:BlobProto、LayerParameter、NetParameter
同样在blob.hpp、common.hpp、layer.hpp、net.hpp中添加
#ifdef CAFFELIB_EXPORTS
#define CAFFELIB_API __declspec(dllexport)
#else
#define CAFFELIB_API __declspec(dllimport)
#endif
class LIBCAFFE Blob --blob.hpp
class LIBCAFFE Caffe -- common.hpp
class LIBCAFFE Layer -- layer.hpp
class LIBCAFFE Net --net.hpp
然后在libcaffe属性中加入预定义宏如下:
然后编译即可。需要注意的是编译动态库需要在属性中重新配置cuda的包含目录、库目录、链接库,否则编译不通过!会报找不到三方依赖。
将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin下面的
这几个文件复制到编译Build\x64\Release下面,现在编译就不会有问题。
2.3 mini-caffe编译
这个版本的caffe编译就比较简单了,直接按照官方readme编译即可,比较不容易出问题。
Github: https://github.com/luoyetx/mini-caffe
2.4 tiny-caffe编译
我的版本caffe,这是本人对happynear版本caffe精简化的结果,去除很多冗余依赖,仅仅依赖protobuf.
Github: https://github.com/SyGoing/tiny-caffe,阅读readme就可以了。
Ubuntu下编译BLVC-caffe的教程较多,相比windows下编译要简单得多。cuda8.0、cudnn5.1或cudnn6.0、opencv3.1、相关三方依赖安装完毕之后,只需要根据自己需求修改Makefile.config文件即可。
1、三方依赖
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-devlibhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
2、Makefile.config,为了防止重新编译又去查来查去,这里配置好了一份
百度云:https://pan.baidu.com/s/1MyaKk01hBWoNKbaDTnOzMA
提取码:4txw
然后make all -j8完成编译。
这个配置文件没有编译python接口,如果需要编译python、matlab,则先确保自己安装了python(Anaconda)或者matlab,然后配置文件中打开编译python和matlab接口。
假设想要编译mini-caffe、tiny-caffe、happynear-caffe。去官网查看readme,这里不再赘述。 happynear的caffe-windows在ubuntu下编译和BLVC的一样。mini-caffe和tiny-caffe则更简单。依赖就很少。