(二)项目编译前的步骤:
(1)设置配置文件
在 .\caffe-mastter\windows路径下
新建一个文本文档,重命名为CommonSettings.props ,并复制.\windows\CommonSettings.props.example
文件中的内容到 .\windows\CommonSettings.props。默认情况下windows编译需要CUDA和cuDNN,当然你也可以在配置文档(
.\windows\CommonSettings.props)中去修改为不用,直接将为true的配置设置为false即可。但是python默认情况下是不能使用的,我这里需要用python进行caffe学习,所以就设置为true了。其他三方的库,VS编译时会通过NuGet进行自动获取,非常方便!
为了便于在训练模型时减少输出信息,建议去\caffe-master\caffe-master\src\caffe\layers\data_layer.cpp文件,将如下打印信息的代码用"//"注释掉:
(2)下载相关软件
CUDA
下载 CUDA Toolkit 7.5
(https://developer.nvidia.com/cuda-toolkit)。如果你电脑没有NVIDIA的独立显卡,那么只能选择用CPU进行编译,就不需要安装CUDA,去配置文件 .\windows\CommonSettings.props
设置<CpuOnlyBuild>false</CpuOnlyBuild> ,同时设置 <UseCuDNN>false</UseCuDNN>。
cuDNN
下载 cuDNN v4
或者 cuDNN v5
(https://developer.nvidia.com/cudnn)。 解压下载的文件到 %CUDA_PATH% (这个路径是CUDA安装时默认设置的一个环境变量路径,通过【系统】-》【高级设置】-》【环境变量】就可以找到)。当然如果你没下载CUDA,也可以直接设置<UseCuDNN>false</UseCuDNN>
Python
为了能使用python调用Caffe,需要在 .\windows\CommonSettings.props中设置<PythonSupport>true</PythonSupport>。如果本机没安装python,可以下载
Miniconda 2.7 64-bit Windows installer,从官方网址:http://conda.pydata.org/miniconda.html选择下载,默认配置路径安装即可。同时需要以管理员权限安装numpy、scipy、matplotlib、scikit-image、protobuf包,安装命令如下:
conda install --yes numpy scipy matplotlib scikit-image pip
pip install protobuf
注意:
(1)在你编译通过后,需要将编译好的 <caffe_root>\Build\x64\Release\pycaffe\caffe文件复制到python的
<python_root>\lib\site-packages文件夹下面,这样python中才能引用到caffe,不然会报错。
(2)如果要用GPU计算,需要设置<CudaArchitecture>,我以前显卡是650所以只能设置低运行速度的:compute_30 和sm_30(这个根据你自己的显卡计算能力确定, 注意CUDA7.5已经不支持计算能力小于30的显卡了),后来我换成GTX1080,采用compute_52 和sm_52,具体需求见下表:
GPU | Computer Capability |
GTX660, 680, 760, 770 | compute_30,sm_30 |
GTX780, Titan Z, Titan Black, K20, K40 | compute_35,sm_35 |
GTX960, 970, 980, Titan X | compute_52,sm_52 |
根据需要,我的配置如下图:
(三)项目编译
用VS2013,在caffe-master\windows目录下打开caffe.sln,进去后如下图(共16个项目):
其中capthaTest是我测试caffe进行验证码识别的python项目。编译时可以直接右键【解决方案caffe】进行生成,当然这会报很多错误,都是些资源文件引用问题,通过一个个项目单独编译都可以很快解决。因为我这里只用到其中几个项目,所以我编译的顺序是:
libcafffe->caffe->pycaffe->convert_imageset,每个项目编译前都需要设置相应的引用路径,这里有两种路径,include路径和libs路径,详细怎么添加见下面。
(1)libcaffe在编译前先设置资源引用路径,点击项目右键-》属性-》配置属性-》c/c++,【附加包含目录中】中加入python的include路径,我这是D:\Python27\include,如下图:
(2)caffe在编译前先设置资源引用路径,点击项目右键-》属性-》配置属性-》c/c++,【附加包含目录中】加入python的include路径,我这是D:\Python27\include,同时,在链接器中的【附加库目录】中加入python的libs路径,我这里是D:\Python27\libs,如果显卡安装不是默认路径也相应把C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include和libs加入到里面,如下图:
(3)pycaffe在编译前先设置资源引用路径,点击项目右键-》属性-》配置属性-》c/c++,【附加包含目录中】加入python的include路径和numpy的include路径,我这里分别是D:\Python27\include和D:\Python27\Lib\site-packages\numpy\core\include,同时,在链接器中的【附加库目录】中加入python的libs路径和numpy的libs路径,我这里分别是D:\Python27\libs和D:\Python27\Lib\site-packages\numpy\core\lib,如下图:
如果这个编译时出现:
error LNK2001: 无法解析的外部符号 __imp_PyString_FromString
error LNK2001: 无法解析的外部符号 __imp_PyCallable_Check
error LNK2001: 无法解析的外部符号 __imp_PyObject_CallObject
error LNK2001: 无法解析的外部符号 __imp_Py_Initialize
error LNK2001: 无法解析的外部符号 __imp_Py_IsInitialized
error LNK2001: 无法解析的外部符号 __imp_PyImport_Import
error LNK2001: 无法解析的外部符号 __imp_PyModule_GetDict
error LNK2001: 无法解析的外部符号 __imp_PyDict_GetItemString
error LNK2001: 无法解析的外部符号 __imp_PyRun_SimpleStringFlags
error LNK2001: 无法解析的外部符号 __imp_Py_Finalize
等无法解析外部符号等问题,说明C++编译器在调用python.exe时出错了,我遇到这个坑,解决了很久,具体原因我也不清楚,猜测是因为编码问题导致的,因为我下载的python有问题,而我同事的没问题,最终我把他所有的python文件拷贝覆盖我这里的,最终才算ok!
如果有出现error C2220: warning treated as error - no object file generated这样的错误,右击项目,属性,在C/C++那里把treat warning as error设为no,再重新编译一次,就完成编译了。
(4)其他项目我想应该也是这种添加模式,应该问题不大
(四)编译完成后检查
如果编译成功了,会在caffe-master同路径下生成NugetPackages文件夹,同时在caffe-master文件夹下生成Build文件夹
(1)NugetPackages里面内容
一个都不能少,如果少了的话,可能是nuget通信问题,多编译几次就下载完了。
(2)Build文件夹下的内容,一定有caffe.exe文件,不然说明没编译成功
(3)编译成功后,将caffe-master\caffe-master\Build\x64\Debug\pycaffe路径下的caffe文件夹拷贝到python的site-packages下面(也可设置PYTHONPATH指向caffe文件夹),然后用python测试能不能正常import caffe,如果没报错说明一切OK。我这里引用时遇到一个问题AttributeError: 'module' object has no attribute 'bool_',追踪错误堆栈发现如下:
原来是import io出了问题,caffe文件夹里面也有一个io.py,而系统要求的是numpy里面的io.py,所以没有bool_这个模块,解决办法:
1、不要在caffe目录下打开python.exe,或者你一定要在此目录打开,那么请把caffe文件夹移出site-packages路径,并配置环境变量,变量名=PYTHONPATH,值=caffe包的路径
2、如果在VS2013项目里面,请删除References下面的_caffe.pyd引用,如下图:
(下面一篇文章将详细介绍利用caffe识别中文验证码的内容:卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别)