参考自:基于Windows10 x64+visual Studio2013+Python2.7.12环境下的Caffe配置学习
windows7+visual studio 2013+CUDA7.5 编译caffe+配置matcaffe+配置pycaffe
背景:
最近翻开了《深度学习-21天实战Caffe》作为自己Caffe的入门,看到后面章节通过python draw_net.py 可以绘出各种深度学习模型的层次图,为了巩固自己前面的学习知识,并加深印象,所以也来尝试绘制。 但天不随人愿,发现自己pycaffe以及matlab等第三方接口库都未编译,所以此次来尝试编译。
本人机器ThinkPad E430c,已属于5年前配置了,装个VMWare的Redhat Linux实在感觉像老牛拉车,故不得已只能现在win10上尝试编译Caffe。
编译顺序:libcafffe->caffe->pycaffe->matcaffe,为何要采用这种顺序?因为各工程间存在依赖关系,当然pycaffe和matcaffe是并列关系,它俩都依赖前面的编译生成结果。
由于本人机器python版本混乱,现对安装情况作简单梳理:C盘根目录下面安装了两个python版本 ;D盘先安装了Anaconda3,Anaconda2(因始终import caffe报模块找不到动态链接库,但pycaffe.pyd早已经存在,DLL加载失败 故安装Anaconda2)。
C盘根目录下面两个python版本都是较纯净的python,里面没有装numpy等一系列第三方包。
D盘根目录下面两个Anaconda。因为之前一直用python3,导致一直用着Anaconda3,但直到最后始终找不到pycaffe.pyd,实在没法所以又装了Anaconda2,并且补装了所有第三方压缩包。
Step 0:下载相关软件,修改配置文件:
下载 CUDA Toolkit 7.5
(https://developer.nvidia.com/cuda-toolkit)。如果你电脑没有NVIDIA的独立显卡,那么只能选择用CPU进行编译,就不需要安装CUDA,去配置文件 .\windows\CommonSettings.props
设置。
下载 cuDNN v4
或者 cuDNN v5
(https://developer.nvidia.com/cudnn)。 解压下载的文件到 %CUDA_PATH% (这个路径是CUDA安装时默认设置的一个环境变量路径,通过【系统】-》【高级设置】-》【环境变量】就可以找到)。当然如果你没下载CUDA,也可以直接设置
cuda_7.5.18_win10.exe安装用的系统默认路径:C:\Program Files\NVIDIA GPU Computing Toolkit
cudnn-7.5-windows10-x64-v5.0-ga.zip 解压到了C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5 的目录下
修改配置CommonSettings.props文件
xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ImportGroup Label="PropertySheets" /> <PropertyGroup Label="UserMacros"> <BuildDir>$(SolutionDir)..\BuildBuildDir> <CpuOnlyBuild>CpuOnlyBuild> <UseCuDNN>UseCuDNN> <CudaVersion>7.5CudaVersion> <PythonSupport>PythonSupport> <MatlabSupport>MatlabSupport> <CudaDependencies>CudaDependencies> <CudaArchitecture>CudaArchitecture> <CuDnnPath>CuDnnPath> <ScriptsDir>$(SolutionDir)\scriptsScriptsDir> PropertyGroup> <PropertyGroup Condition="'$(CpuOnlyBuild)'=='false'"> <CudaDependencies>cublas.lib;cuda.lib;curand.lib;cudart.libCudaDependencies> PropertyGroup> <PropertyGroup Condition="'$(UseCuDNN)'=='true'"> <CudaDependencies>cudnn.lib;$(CudaDependencies)CudaDependencies> PropertyGroup> <PropertyGroup Condition="'$(UseCuDNN)'=='true' And $(CuDnnPath)!=''"> <LibraryPath>$(CuDnnPath)\cuda\lib\x64;$(LibraryPath)LibraryPath> <IncludePath>$(CuDnnPath)\cuda\include;$(IncludePath)IncludePath> PropertyGroup> <PropertyGroup> <OutDir>$(BuildDir)\$(Platform)\$(Configuration)\OutDir> <IntDir>$(BuildDir)\Int\$(ProjectName)\$(Platform)\$(Configuration)\IntDir> PropertyGroup> <PropertyGroup> <LibraryPath>$(OutDir);$(CUDA_PATH)\lib\$(Platform);$(LibraryPath)LibraryPath> <IncludePath>$(SolutionDir)..\include;$(SolutionDir)..\include\caffe\proto;$(CUDA_PATH)\include;$(IncludePath)IncludePath> PropertyGroup> <PropertyGroup Condition="'$(PythonSupport)'=='true'"> <PythonDir>PythonDir> <LibraryPath>$(PythonDir)\libs;$(LibraryPath)LibraryPath> <IncludePath>$(PythonDir)\include;$(IncludePath)IncludePath> PropertyGroup> <PropertyGroup Condition="'$(MatlabSupport)'=='true'"> <MatlabDir>MatlabDir> <LibraryPath>$(MatlabDir)\extern\lib\win64\microsoft;$(LibraryPath)LibraryPath> <IncludePath>$(MatlabDir)\extern\include;$(IncludePath)IncludePath> PropertyGroup> <ItemDefinitionGroup Condition="'$(CpuOnlyBuild)'=='true'"> <ClCompile> <PreprocessorDefinitions>CPU_ONLY;%(PreprocessorDefinitions)PreprocessorDefinitions> ClCompile> ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(UseCuDNN)'=='true'"> <ClCompile> <PreprocessorDefinitions>USE_CUDNN;%(PreprocessorDefinitions)PreprocessorDefinitions> ClCompile> <CudaCompile> <Defines>USE_CUDNNDefines> CudaCompile> ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(PythonSupport)'=='true'"> <ClCompile> <PreprocessorDefinitions>WITH_PYTHON_LAYER;BOOST_PYTHON_STATIC_LIB;%(PreprocessorDefinitions)PreprocessorDefinitions> ClCompile> ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(MatlabSupport)'=='true'"> <ClCompile> <PreprocessorDefinitions>MATLAB_MEX_FILE;%(PreprocessorDefinitions)PreprocessorDefinitions> ClCompile> ItemDefinitionGroup> <ItemDefinitionGroup> <ClCompile> <MinimalRebuild>falseMinimalRebuild> <MultiProcessorCompilation>trueMultiProcessorCompilation> <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;USE_OPENCV;USE_LEVELDB;USE_LMDB;%(PreprocessorDefinitions)PreprocessorDefinitions> <TreatWarningAsError>trueTreatWarningAsError> ClCompile> ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> <Optimization>FullOptimization> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDLLRuntimeLibrary> <FunctionLevelLinking>trueFunctionLevelLinking> ClCompile> <Link> <EnableCOMDATFolding>trueEnableCOMDATFolding> <GenerateDebugInformation>trueGenerateDebugInformation> <LinkTimeCodeGeneration>UseLinkTimeCodeGenerationLinkTimeCodeGeneration> <OptimizeReferences>trueOptimizeReferences> Link> ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> <Optimization>DisabledOptimization> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebugDLLRuntimeLibrary> ClCompile> <Link> <GenerateDebugInformation>trueGenerateDebugInformation> Link> ItemDefinitionGroup> Project>
Step1:编译libcafffe->caffe->pycaffe->matcaffe
libcaffe的编译及安装使用请参考前一篇:Win10上编译Caffe之Libcaffe,运行mnist案例 总体还算顺利。貌似加不加这个C:\Python27\include问题都不大,都可以编译通过。
caffe包的编译:
之前这里只加了C:\Python27\libs, 没有把Anaconda3下面pkgs里面python2.7下面的libs加进来,导致一直莫名的link错,为此困扰了好久。最终还是通过报的链接错LNK2001,分析出还是缺少静态依赖库,但这时又不打算重装python2.7,所以就找了Anaconda3下面pkgs里面python2.7下面的libs把它加到了链接器的附加库目录里面。这里也多亏了基于Windows10 x64+visual Studio2013+Python2.7.12环境下的Caffe配置学习文章末尾的一点提示。没明白我的C:\Python27\libs下面为何会库不全了。
出错信息如下:
1>caffe.obj : error LNK2001: 无法解析的外部符号 __imp_PyErr_Print
1>layer_factory.obj : error LNK2001: 无法解析的外部符号 __imp_PyErr_Print
1>libboost_python-vc120-mt-1_59.lib(function_doc_signature.obj) : error LNK2001: 无法解析的外部符号 __imp__Py_NoneStruct
1>libboost_python-vc120-mt-1_59.lib(dict.obj) : error LNK2001: 无法解析的外部符号 __imp__Py_NoneStruct
1>libboost_python-vc120-mt-1_59.lib(module.obj) : error LNK2001: 无法解析的外部符号 __imp__Py_NoneStruct
1>libboost_python-vc120-mt-1_59.lib(function.obj) : error LNK2001: 无法解析的外部符号
问题解决后终于编译通过了。
pycaffe的编译:吃过前面的亏,这里就学乖了,把可能的路径都加上了。
matcaffe的编译:
到这里,各类caffe所支持的接口都已经编译成功了。
Step2:使用caffe,并draw_net
1)解决import caffe
初始使用draw.net发现import caffe报错,信息如下:
在未装Anaconda2之前:
import caffe 报找不到_caffe模块,原来还要把build生成的D:\VS2012\Projects\caffe-windows\Build\x64\Release\pycaffe\caffe模块copy到D:\VS2012\Projects\caffe-windows\python\目录下。这之后,又报
File "D:\VS2012\Projects\caffe-windows\python\caffe\pycaffe.py", line 13, in
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver,
ImportError: DLL load failed:
这个问题又折腾很久,始终想尝试不安装Anaconda2绕过,但最终没有其他途径来解决,只能安装Anaconda2,同时还copy了一份caffe放到了D:\Anaconda2\Lib\site-packages\ 下面。
本以为大功告成,import caffe还出现ImportError: No module named google.protobuf. 知道是没安装protobuf,但是用pip install protobuf总是提示已经安装了protobuf,原来前些日子,安装tensorflow windows版的时候把protobuf已经预装到Anaconda3目录下的lib\sitepackages下面了,但是现在用python2.7却引用不到这个包(每次pip install总告知已安装protobuf),想在Anaconda2下的python2.7下面安装并使用该包,应在D:\Anaconda2\Scripts 下面执行pip install protobuf。这样就会调用该目录下的pip脚本来安装protobuf到python2.7下面了。在D:\Anaconda2\Lib\site-packages下面查看了,终于有google\protobuf了。
至此终于可以import caffe成功了。
2)draw_net
终于可以打算用draw_net.py画图了,发现还缺pydot,于是又装了pydot。但是调用draw_net.py画图时发现报:“Exception: "dot.exe" not found in path.”
参考http://blog.csdn.net/lemianli/article/details/53034432 中所述:
先去这个网址http://www.graphviz.org/Download_windows.php将graphviz-2.38.msi下下来,进行安装,可以发现它的bin目录下有这个我们需要的dot.exe,将这个bin目录添加到系统的环境变量中去即可,再pip install pygraphviz即可。
这里我把graphviz-2.38.msi的安装路径D:\Program Files (x86)\Graphviz2.38\bin添加到了系统目录,但是在pip install pygraphviz的时候有报错(不管了)。使用draw_net.py的时候还是报Exception: "dot.exe" not found in path.”看来必须重启电脑,才能使环境变量生效。重启后果然一切都搞定了。
执行:
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_reference_caffenet\train_val.prototxt caffenet.png
Drawing net to caffenet.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_alexnet\train_val.prototxt alexnet.png
Drawing net to alexnet.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_googlenet\train_val.prototxt googlenet.png
Drawing net to googlenet.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_reference_rcnn_ilsvrc13\deploy.prototxt rcnn.png
Drawing net to rcnn.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\mnist\lenet_train_test.prototxt lenet5.png
Drawing net to lenet5.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\mnist\mnist_autoencoder.prototxt mnist_ae.png
Drawing net to mnist_ae.png
D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\cifar10\cifar10_full_sigmoid_train_test_bn.prototxt cifar10_full_sigmoid_bn.png
Drawing net to cifar10_full_sigmoid_bn.png
caffenet:
mnist_ae:
总结:开源软件caffe的windows安装需要有耐心,解决一个又一个坑,在对软件不熟悉的前提下,解决问题的过程也是慢慢了解这个新软件的学习过程,在时间允许的条件下可以慢慢尝试分析各种可能原因。