Caffe之win10版安装小结--细数自己遇到的各种坑

参考自:基于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)。

   image C盘根目录下面两个python版本都是较纯净的python,里面没有装numpy等一系列第三方包。

WHQY(CQ`S8T2HM[V2O5V}MF D盘根目录下面两个Anaconda。因为之前一直用python3,导致一直用着Anaconda3,但直到最后始终找不到pycaffe.pyd,实在没法所以又装了Anaconda2,并且补装了所有第三方压缩包。

Step 0:下载相关软件,修改配置文件:

CUDA

下载 CUDA Toolkit 7.5 (https://developer.nvidia.com/cuda-toolkit)。如果你电脑没有NVIDIA的独立显卡,那么只能选择用CPU进行编译,就不需要安装CUDA,去配置文件 .\windows\CommonSettings.props 设置false ,同时设置 false

cuDNN

下载 cuDNN v4 或者 cuDNN v5 (https://developer.nvidia.com/cudnn)。 解压下载的文件到 %CUDA_PATH% (这个路径是CUDA安装时默认设置的一个环境变量路径,通过【系统】-》【高级设置】-》【环境变量】就可以找到)。当然如果你没下载CUDA,也可以直接设置false

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之win10版安装小结--细数自己遇到的各种坑_第1张图片

caffe包的编译:

43EOLIH)D7822}@B$1P%G`4

Caffe之win10版安装小结--细数自己遇到的各种坑_第2张图片

之前这里只加了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的编译:吃过前面的亏,这里就学乖了,把可能的路径都加上了。

Caffe之win10版安装小结--细数自己遇到的各种坑_第3张图片

Caffe之win10版安装小结--细数自己遇到的各种坑_第4张图片

matcaffe的编译:

D2MAID1F)K}9UV@}[]1A7Y1

Caffe之win10版安装小结--细数自己遇到的各种坑_第5张图片

到这里,各类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:

caffenet

mnist_ae:

mnist_ae

 

总结:开源软件caffe的windows安装需要有耐心,解决一个又一个坑,在对软件不熟悉的前提下,解决问题的过程也是慢慢了解这个新软件的学习过程,在时间允许的条件下可以慢慢尝试分析各种可能原因。

你可能感兴趣的:(Caffe之win10版安装小结--细数自己遇到的各种坑)