在Windows 10 Anniversary下配置Caffe
去年十月份的时候尝试过配置caffe,真的是恶心到家,当时用的还是微软魔改的基于NuGet的caffe。现在这个项目退役了,接手的是原项目下的windows分支,虽然并不是很成熟,但是依然非常推荐在Win下疯狂受苦的各位试试。
先说明一下,目前(2017-01-24)由于各种原因,使用Visual Studio 2017 RC进行编译会引致各种各样的问题(从CMake到CUDA,没什么东西是能用的),因此不要轻易尝试,有兴趣的话可以看看这里。
使用预编译的二进制包
非常直接了当的做法,不需要编译配置直接可用,算是救命了。在分支首页能找到。
从Git开始
确保系统中安装了Git或者Github客户端。进入Powershell(我比较喜欢用这个,CMD也可以),cd到在平时放置项目的地方执行:
git clone https://github.com/BVLC/caffe.git
cd caffe
git checkout windows
使用文本编辑器打开scripts/build_win.cmd,根据注释的指引进行修改:开启cuDNN、启用Matlab生成之类的。修改完成之后,在Powershell中执行
./scripts/build_win.cmd
在接下来的一段时间内,脚本文件会在背景下载所依赖的库。不知道为什么经常下载失败,速度还特别慢,总之建议爬上梯子说话。
下载完成之后会开始解压文档,自动生成的build目录中如果出现了libraries文件夹那就说明至少下载成功了。这个时候注意,一定要把build_win.cmd中的以下部分(大约在118行)删除或者注释掉,否则在下一次执行build_win.cmd的时候,脚本会重新下载依赖库。谁能保证之后不出差错呢?
:: Create build directory and configure cmake
if EXIST build (
echo ERROR: build directory already exists in %cd%\build please remove it and start over.
exit /b 1
)
mkdir build
pushd build
:: Download dependencies from VS x64
echo INFO: Downloading dependencies
"%PYTHON_EXE%" "%~dp0\download_prebuilt_dependencies.py" --msvc_version v%MSVC_VERSION%0
if ERRORLEVEL 1 (
echo ERROR: Downloading dependencies failed
exit /b 1
)
如果脚本自动开始编译了那么说明依赖库中文件没有问题,将libraries/lib
、libraries/bin
以及libraries\x64\vc14\bin
文件夹加入Path环境变量。如果没有加入,在Matlab中调用caffe会出现形如Invalid MEX-file 'P:\caffe\matlab\+caffe\private\caffe_.mexw64': 找不到指定的模块。
的错误。
有个非常奇怪的情况,在我安装caffe的时候,build_win.cmd自动进行的install并没有起作用,所以在成功生成项目文件之后最好Ctrl-C停止命令行编译,进入VS手工生成ALL_BUILD项目,随后生成INSTALL项目。
如果开启了Python生成,注意确认所依赖的Python包是否已经安装。我使用的是发行版Anaconda 3.5,如果脚本没有自动帮你安装,输出提示有关'Python'、'Dependency'、'Ignore'的字样,使用如下指令安装所需要的软件包,否则会跳过Python接口的生成。
conda install --yes numpy scipy matplotlib scikit-image pip six
conda install --yes --channel willyd protobuf==3.1.0
如果开启了MATLAB生成,可能会遇到MSB3073错误,这是脚本没有找到生成的mex文件导致的,进入matlab/+caffe/private
中,进入刚才编译使用的配置(Debug或Release),将caffe_.mexw64复制一份到外面的private文件夹里。再次生成INSTALL项目应该就能够通过了。
生成成功后在环境变量中加入PYTHONPATH,填入值build/install/python
,在Matlab中添加搜索路径build/install/matlab和build/matlab。建议前者优先级高于后者,前者可以不用加,因为刚才已经把caffe_.mexw64移进private了。要是出现了什么诡异的问题可以再考虑加回来。
最后特别要注意的是,Protobuf一定要自己编译一份,因为Python需要执行Protobuf项目的python/setup.py
才能完成配置,否则会出现找不到google包的错误。