windows中caffe_ssd编译python35的接口

参考博客:

https://blog.csdn.net/thecentry/article/details/90318360

https://www.cnblogs.com/xuanyuyt/p/9772819.html

准备工具:

vs2015

anaconda中建一个python3.5的虚拟环境

cmake(3.4以上的版本)

 

本文编译的是cpu模式的caffe-ssd

***下载caffe-ssd-windows的源码

https://github.com/runhang/caffe-ssd-windows

***下载caffe所需要的第三方库

https://github.com/willyd/caffe-builder/releases/download/v1.1.0/libraries_v140_x64_py35_1.1.0.tar.bz2

下载的库文件:windows中caffe_ssd编译python35的接口

 

 

 解压后是文件夹windows中caffe_ssd编译python35的接口

 

 

 ***修改caffe-ssd-windows工程中的编译选项

修改文件./caffe-ssd-windows/scripts/build_win.cmd

第24行开始:

    if !PYTHON_VERSION! EQU 2 (
        set CONDA_ROOT=D:\Develop\WinPython2.7\python-2.7.10.amd64
    )
    :: Set python 3.5 with conda as the default python
    if !PYTHON_VERSION! EQU 3 (
        set CONDA_ROOT=D:\Anaconda3\envs\pytorch_35
    )
    set PATH=!CONDA_ROOT!;!CONDA_ROOT!\Scripts;!CONDA_ROOT!\Library\bin;!PATH!

指定python3的环境路径,上面python2的路径不用管它。

第160行开始:

cmake -G"!CMAKE_GENERATOR!" ^
      -DBLAS=Open ^
      -DCMAKE_BUILD_TYPE:STRING=%CMAKE_CONFIG% ^
      -DBUILD_SHARED_LIBS:BOOL=%CMAKE_BUILD_SHARED_LIBS% ^
      -DBUILD_python:BOOL=%BUILD_PYTHON% ^
      -DBUILD_python_layer:BOOL=%BUILD_PYTHON_LAYER% ^
      -DBUILD_matlab:BOOL=%BUILD_MATLAB% ^
      -DCPU_ONLY:BOOL=%CPU_ONLY% ^
      -DCOPY_PREREQUISITES:BOOL=1 ^
      -DINSTALL_PREREQUISITES:BOOL=1 ^
      -DUSE_NCCL:BOOL=!USE_NCCL! ^
      -DCUDA_ARCH_NAME:STRING=%CUDA_ARCH_NAME% ^
      -C "D:\caffe-builder\build_v140_x64\libraries\caffe-builder-config.cmake" ^
      "%~dp0\.."

指定了第三库的路径,这个libraries的路径可以自己指定。

 第70行开始:

    :: Change the settings here to match your setup
    :: Change MSVC_VERSION to 12 to use VS 2013
    if NOT DEFINED MSVC_VERSION set MSVC_VERSION=14
    :: Change to 1 to use Ninja generator (builds much faster)
    if NOT DEFINED WITH_NINJA set WITH_NINJA=0
    :: Change to 1 to build caffe without CUDA support
    if NOT DEFINED CPU_ONLY set CPU_ONLY=1
    :: Change to generate CUDA code for one of the following GPU architectures
    :: [Fermi  Kepler  Maxwell  Pascal  All]
    if NOT DEFINED CUDA_ARCH_NAME set CUDA_ARCH_NAME=Auto
    :: Change to Debug to build Debug. This is only relevant for the Ninja generator the Visual Studio generator will generate both Debug and Release configs
    if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
    :: Set to 1 to use NCCL
    if NOT DEFINED USE_NCCL set USE_NCCL=0
    :: Change to 1 to build a caffe.dll
    if NOT DEFINED CMAKE_BUILD_SHARED_LIBS set CMAKE_BUILD_SHARED_LIBS=0
    :: Change to 3 if using python 3.5 (only 2.7 and 3.5 are supported)
    if NOT DEFINED PYTHON_VERSION set PYTHON_VERSION=3
    :: Change these options for your needs.
    if NOT DEFINED BUILD_PYTHON set BUILD_PYTHON=1
    if NOT DEFINED BUILD_PYTHON_LAYER set BUILD_PYTHON_LAYER=1
    if NOT DEFINED BUILD_MATLAB set BUILD_MATLAB=0
    :: If python is on your path leave this alone
    if NOT DEFINED PYTHON_EXE set PYTHON_EXE=python
    :: Run the tests
    if NOT DEFINED RUN_TESTS set RUN_TESTS=0
    :: Run lint
    if NOT DEFINED RUN_LINT set RUN_LINT=0
    :: Build the install target
    if NOT DEFINED RUN_INSTALL set RUN_INSTALL=0

这块区域,指定一些宏,因为我的电脑上没有gpu,所以编译的是cpu模式的caffe-ssd。

***生成vs工程

在命令行中,运行caffe-ssd-windons/scripts下的build_win.cmd

windows中caffe_ssd编译python35的接口

windows中caffe_ssd编译python35的接口

 

 

 如果工程的配置选项没有问题,该命令会调用cmake,在/caffe-ssd-windows/scripts/build/下生成vs2015的工程。

***编译caffe-ssd

在上一步中,build_win.cmd命令会继续编译caffe的工程,有报错

 

 

 

 windows中caffe_ssd编译python35的接口

 

 

问题出在NormalizeLayer和InnerProductLayer这个两个类上。

打开/caffe-ssd-windows/src/caffe/layer_factory.cpp,屏蔽掉报错的这两段函数:

windows中caffe_ssd编译python35的接口

用vs2015打开生成的caffe.sln解决方案,release_x64模式下,先编译caffe,不出意外的话,能够编译成功。

然后编译pycaffe,编译成功后,可生成/caffe-ssd-windows/python/caffe文件夹。

windows中caffe_ssd编译python35的接口

 

 ***import caffe

将上一步中,编译成功的caffe文件夹,拷贝到site-packages中。

以我自己的python虚拟环境,为例:D:\Anaconda3\envs\pytorch_35\Lib\site-packages

安装caffe,必须的库,protobuf,scipy,scikit-image,即可import caffe成功。

windows中caffe_ssd编译python35的接口

 

上一篇:thinkphp 标签嵌套


下一篇:【java】关于Cannot refer to the non-final local variable list defined in an enclosing scope解决方法