此项目用于中文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