VS2017+Miniconda2编译Caffe

捣腾了一晚上的caffe。。环境配置什么的,真的是很容易上头。

官方安装文档

以下为踩坑过程。


【如果你的VS是2017版本,请直接看下一部分】

首先下载windows适用的caffe版本

在下载好的文件中 Copy .\windows\CommonSettings.props.example to .\windows\CommonSettings.props

打开该配置文件,按自己的电脑情况对GPU支持,CuDNN及Python支持进行配置。由于我的破本本没有独显,所以只能用CPU了。。

1
2
<CpuOnlyBuild>true</CpuOnlyBuild>
<UseCuDNN>false</UseCuDNN>

使用VS打开sln 文件,我的是VS2017版本而官网要求的是13或15版本,暂时不知后面将会遇到什么 问题。。

对项目的错误检查做一下设置,VS的报错有多烦人。。用过的都知道。。libcaffe项目→属性→C/C++→常规→将警告视为错误 设置为否。如果不设置的话在编译boost库的时候会由于文字编码的警告而报错。选择编译环境为Release,x64

在libcaffe上右键生成,进行编译。有点小激动,究竟能不能成功呢?。。

有惊无险 ,虽然全程都在 Unknown compiler version - please run the configure tests and report the results

接着再编译caffe,果然真正的快乐是无法持续的。。

报错:fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib

应该是VS版本的问题了。

搜索了一圈解决方案,都是要改 build_win.cmd 文件的,而这个windows版本并没有这个文件,正如一开始说,必须使用 VS2013或VS2015

而我,是绝对不想再重新安装一个VS的,别问我为什么。。所以只能,重新来过。。

本部分参考文章


找到另一个windows可用的版本,源码地址

安装Cmake 教程

比较重要的是Python的配置,miniconda相关操作

在安装了miniconda之后,以管理员方式运行cmd

1
2
conda install --yes numpy scipy matplotlib scikit-image pip
pip install protobuf

在第二条命令时,遇到一大串红字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Traceback (most recent call last):
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\cli\base_command.py", line 153, in _main
status = self.run(options, args)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\commands\install.py", line 382, in run
resolver.resolve(requirement_set)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\legacy_resolve.py", line 201, in resolve
self._resolve_one(requirement_set, req)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\legacy_resolve.py", line 365, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\legacy_resolve.py", line 313, in _get_abstract_dist_for
req, self.session, self.finder, self.require_hashes
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\operations\prepare.py", line 194, in prepare_linked_requirement
progress_bar=self.progress_bar
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 465, in unpack_url
progress_bar=progress_bar
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 316, in unpack_http_url
progress_bar)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 551, in _download_http_url
_download_url(resp, link, content_file, hashes, progress_bar)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 253, in _download_url
hashes.check_against_chunks(downloaded_chunks)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\utils\hashes.py", line 80, in check_against_chunks
for chunk in chunks:
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 223, in written_chunks
for chunk in chunks:
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\utils\ui.py", line 160, in iter
for x in it:
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_internal\download.py", line 212, in resp_read
decode_content=False):
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_vendor\urllib3\response.py", line 564, in stream
data = self.read(amt=amt, decode_content=decode_content)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_vendor\urllib3\response.py", line 529, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
File "C:\ProgramData\Miniconda2\lib\contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "C:\ProgramData\Miniconda2\lib\site-packages\pip\_vendor\urllib3\response.py", line 439, in _error_catcher
raise ReadTimeoutError(self._pool, None, "Read timed out.")
ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

pip show pip setuptools 查看pip版本是19.3.1 setuptools 是41.4.0

我怀疑是pip调用路径的问题,于是在用户环境变量中删除了本来安装的python3.5的路径

C:\Users\18771\AppData\Local\Programs\Python\Python35\Scripts\

C:\Users\18771\AppData\Local\Programs\Python\Python35\

重启一下,然后换用conda install protobuf命令,安装成功。

但是,为了少点坑,看了别人的博客写的,又多装了几个包 conda install --yes six pyyaml pydotplus graphviz

用VS打开sln, 重定解决方案为v141

接下来跟第一部分的操作一样,先不抱任何指望地编译libcaffe。。。

果然报错 :无法打开包括文件: “pyconfig.h”: No such file or directory (编译源文件 ....\src\caffe\layer_factory.cpp)

打开CommonSettings.props将 D:\Anaconda3\ 改为自己的python路径 C:\ProgramData\Miniconda2

编译成功。

再不抱任何指望地编译caffe。。。成功一个,失败一个

报错:fatal error LNK1181: 无法打开输入文件“cufft.lib”

打开 CommonSettings.props 将<CudaDependencies>cufft.lib</CudaDependencies> 改成 <CudaDependencies></CudaDependencies>

再次尝试,报错 LINK : fatal error LNK1104: 无法打开文件“libboost_python-vc141-mt-1_65_1.lib”

这应该是VS版本的问题了,vc141就是2017的,

把 thirdparty\Boost\lib64-msvc-14.0 中所有的140改成141 试一下,caffe 可以编译了。

然后右键重新生成解决方案,开始全部编译。

终于

========== 全部重新生成: 成功 16 个,失败 0 个,跳过 0 个 ==========

所有编译成功和运行需要的dll文件都会存储在Build\x64\Release 下

激动哭了。。

感谢前面的踩坑大佬


验证编译结果。尝试在python中调用

打开anaconda的命令行,进入caffe的examples目录,运行jupyter notebook

在打开的notebook中打开caffe自带的例子 00-calssification.ipynb 运行后

报错:ModuleNotFoundError: No module named ‘caffe._caffe’

根据源码中readme提示操作

  • set PythonPath environment variable to point to <caffe_root>\Build\x64\Release\pycaffe, or
  • copy folder <caffe_root>\Build\x64\Release\pycaffe\caffe under <python_root>\lib\site-packages.

我选择了第二种,copy到了C:\Users\18771\Anaconda3\Lib\site-packages

重新运行,还是不行。突然意识到是不是python版本不一样,因为编译用的是miniconda用的是2.7,而anaconda默认的是3.7

于是copy到了C:\ProgramData\Miniconda2\Lib\site-packages中(顺带在caffe27的虚拟环境中也copy了一份..),直接命令行运行python,import caffe

由于我比较喜欢在虚拟环境中跑程序,于是再尝试在caffe27的虚拟环境下运行,先安装numpy、 scikit-image 、protobuf包,再进入python命令行,输入import caffe, 同样运行成功。

环境配置,总算告一段落了。。