windows+python3.5+anaconda编译(安装)text-detection-ctpn项目心得

此项目用于中文OCR,项目地址https://github.com/eragonruan/text-detection-ctpn。该项目基于linux平台,采用python2.7,因此在windows下想要玩转有无数大坑。

setup

requirements: tensorflow1.3, cython0.24, opencv-python, easydict,(recommend to install Anaconda)
if you do not have a gpu device,follow here to setup
if you have a gpu device, build the library by

cd lib/utils
chmod +x make.sh
./make.sh

在linux下,问题不大,但是在windows下就有点麻烦,看一下make.sh的内容吧

cython bbox.pyx
cython cython_nms.pyx
cython gpu_nms.pyx
python setup.py build_ext --inplace
mv utils/* ./
rm -rf build
rm -rf utils
前三行是利用cython编译bbox.pyx、cython_nms.pyx以及gpu_nms.pyx,手动在我们的anaconda环境下完成一般没有什么问题,第三行
setup.py build_ext --inplace

就会有很多的坑了。首先一个是setup.py是基于linux环境的,linux环境下gcc编译器各种与windows的msvcc下是不同的,直接运行的话首先会报错

AttributeError: 'MSVCCompiler' object has no attribute 'compiler_so'

由于水平问题,经过多次尝试未果,决定放弃该setup.py,寻求windows下setup方案,阅读setup.py后,发现setup.py的目的是为了采用gcc编译器编译这几个fast-rcnn的文件

ext_modules = [
    Extension(
        "utils.bbox",
        ["bbox.pyx"],
        extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]},
        include_dirs = [numpy_include]
    ),
    Extension(
        "utils.cython_nms",
        ["cython_nms.pyx"],
        extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]},
        include_dirs = [numpy_include]
    ),
    Extension('utils.gpu_nms',
        ['nms_kernel.cu', 'gpu_nms.pyx'],
        library_dirs=[CUDA['lib64']],
        libraries=['cudart'],
        language='c++',
        runtime_library_dirs=[CUDA['lib64']],
        extra_compile_args={'gcc': ["-Wno-unused-function"],
                            'nvcc': ['-arch=sm_35',
                                     '--ptxas-options=-V',
                                     '-c',
                                     '--compiler-options',
                                     "'-fPIC'"]},
        include_dirs = [numpy_include, CUDA['include']]
    ),
]

因此,找到了一个window下的setup.py,开始改造,两种环境下setup的结构基本是一样的,都是编译“ext_modules ”,因此,将上述代码进行修改,以使用msvcc编译器

ext_modules = [
    Extension(
        "utils.bbox",
        ["bbox.pyx"],
        extra_compile_args=nvcc_compile_args,
        include_dirs = [numpy_include]
    ),
    Extension(
        "utils.cython_nms",
        ["cython_nms.pyx"],
        extra_compile_args=nvcc_compile_args,
        include_dirs = [numpy_include]
    ),
    Extension('utils.gpu_nms',
        ['nms_kernel.cu', 'gpu_nms.pyx'],
        library_dirs=['C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\lib\\x64'],
        libraries=cuda_libs,
        language='c++',
#        runtime_library_dirs=['C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\lib\\x64'],
        extra_compile_args=nvcc_compile_args,
        include_dirs = [numpy_include, 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\include']
    ),
]

执行后会遇到下一个问题

LINK : fatal error LNK1181: cannot open input file 'ID=2.obj'

看一下setup中的代码,发现问题出在spawn函数中生成编译命令字符串'cmd'参数的时候,

def spawn(self, cmd, search_path=1, verbose=0, dry_run=0):

。。。。。。

    spawn(cmd, search_path, verbose, dry_run)

插入一个检测点打印cmd字符串

def spawn(self, cmd, search_path=1, verbose=0, dry_run=0):

。。。。。。
    for i in range(len(cmd)):
        print(i,cmd[i])
    spawn(cmd, search_path, verbose, dry_run)

发现cmd中会插入一个'ID=2.obj'字段,因此,直接简单粗暴的把这个字段删掉

#******fix ID=2 error
elif 'ID=2' in c:cmd[idx]=c[:15]

之后该问题解决。

然后在编译'gpu_nms.obj'会遇到下一个问题

nvcc : fatal error : No input files specified; use option --help for more information

打印cmd

0 nvcc
1 --compiler-bindir
2 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
3 -c
4 -IC:\Anaconda3\envs\tensorflow_gpu\lib\site-packages\numpy\core\include
5 -IC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include
6 -IC:\Anaconda3\envs\tensorflow_gpu\include
7 -IC:\Anaconda3\envs\tensorflow_gpu\include
8 -IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE
9 -IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt
10 -IC:\Program Files (x86)\Windows Kits\8.1\include\shared
11 -IC:\Program Files (x86)\Windows Kits\8.1\include\um
12 -IC:\Program Files (x86)\Windows Kits\8.1\include\winrt
13 -o
14 build\temp.win-amd64-3.5\Release\gpu_nms.obj    #输出
15 -O
16 --ptxas-options=-v
17 -arch=sm_35
18 -c
19 --compiler-options=/nologo,/Ox,/W3,/GL,/DNDEBUG,/MD,/EHsc,/Tpgpu_nms.cpp
发现确实只有输出,输入跑到了cmd的最后面
/Tpgpu_nms.cpp

因此在代码中加入

#******replace /Tp by ..
elif c.startswith('/Tp'):cmd[idx]=c[3:]

问题解决,至此,编译应该就完成了,然后就会踏入其他的大坑。

总结未完待续。

setup文件从此下载:https://download.csdn.net/download/zbwindboy/10375490

你可能感兴趣的:(windows+python3.5+anaconda编译(安装)text-detection-ctpn项目心得)