github上CHINESE-OCR-master项目到移植到window下运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/koloumi/article/details/84791729

github上CHINESE-OCR-master项目到移植到window下运行

环境:

  1. windows 10
  2. python 3.6
  3. 项目地址 :https://github.com/xiaofengShi/CHINESE-OCR
  4. cpython
  5. keras
  6. pytroch
  7. tensorflow(或其他后端)

我们主要目的就是让运行该项目下的demo.py.linux用户的话请直接按照官方的教程运行就好,这里主要讲解windows用户怎么去运行该项目,这里只考虑运行CPU的情况。

首先直接运行一下demo.py然后会出现一些错误我们从错误中进行一个个分析解决方案。
这时候肯定是报错的 错误 :ModuleNotFoundError: No module named 'utils’
因为作者写明了要在运行之前运行项目下的setup-cpu.sh文件
这个版本是给python3使用的所以这里是运行setup-python3.sh.如果有安装git的用户
是可以在windows下运行linux的这个shell的,所以干脆直接运行。

以下是这个shell实际上要操作的内容:

source activate base
#conda create -n chinese-ocr3 python=3.6 pip scipy numpy Pillow jupyter
#source activate chinese-ocr3
pip install easydict -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install keras  -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install Cython opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install -U pillow -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install  h5py lmdb mahotas -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install futures==3.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple/
cd ./ctpn/lib/utils
./make-for-cpu.sh

第一行的激活环境就不用管了,估计是作者自己的环境。中间的都是使用pip来安装一些依赖环境,这里应该都是可以正常运行的如果这里运行错误就打开 cmd 或者powershell 来自己用pip 安装或者去对应的官网去下载对应的包然后离线安装,这里默认上面的操作已经完成,如果上面操作不会的可以留言或者自行百度。

重点就是后面的./make-for-cpu.sh 首先进入ctpn/lib/utils找到对应的文件查看内容:

cython bbox.pyx
cython cython_nms.pyx
#cython gpu_nms.pyx
python setup_cpu.py build_ext --inplace
mv utils/* ./
rm -rf build
rm -rf utils

内容如上,我们需要在windows上去执行以上操作,前面2行
cython bbox.pyx
cython cython_nms.pyx
是能直接运行不会报错的,但是这里我们可以直接用.pyx作为源文件来生成我们后面所需要的python C扩展文件,所以这里2行运不运行无所谓。

我们来看关键的第三行,python setup_cpu.py build_ext --inplace 其中build_ext 这个是一个指定生成扩展文件的参数。我们看下setup_cpu.py文件,文件内容实在有点长放上来感觉不合适,不过相信我内容虽然很多但是90%的内容都是没用的但是为什么却写了那么多呢估计是作者写了gpu版本的之后拷贝了一份然后修改为cpu版本的,至于GPU版本的这个怎么在windows上运行的话网上刚好有篇博客这里给个传送门
https://blog.csdn.net/zbwindboy/article/details/79697068, 传送门

我们继续讲cpu版本的,我们直接删掉它的文件我们在看完他的内容之后知道他实际上真正要操作的内容就是对bbox.pyx 和cython_nms.pyx 2个文件编译成python的C扩展文件,他实际在linux下的意图是编辑成**.so的扩展链接库 但是我们在windows下肯定不能这么做,所以我们需要编译成.pyd**文件可以让python 去调用。

所以我们的目的就是变成了生成bbox.pyd 和 cython_nms.pyd文件,然后怎么生成pyd文件网上一堆办法,但是大部分都是简易的生成不带编译的头文件参数的,这里直接给出带参数的方式。也就是up的版本。这里给个 下载地址 吧放个一分下载吧当做这么多字数的一点补偿,没有分的同学可以留言我给发你邮箱。文件需要放到原先的这个文件的目录下覆盖掉它的,然后你运行之后还是会报错提示你参数问题,这时候运行命令需要用这个
python .\setup_cpu.py build_ext --include-dirs=你的python安装路径\Python\Lib\site-packages\numpy\core\include --inplace
这样就能运行通过了,这个时候会在这个目录下生成一个 ctpn/lib/utils/ 目录 里面就有2个pyd文件 然后我们把文件拷贝出来 修改名字为 bbox.pyd 和cython_nms.pyd
下面是生成成功的图片。
编译最后成功的图片

这下搞定了编译问题,然后继续运行demo.py好吧令人生气的还是这个错误 ModuleNotFoundError: No module named 'utils’

我们看错误的堆栈知道是在 crnn\models\crnn.py 上的加载 import utils 中出错的。所以上面的错误和上面的编译没有关系,但是编译嘛必须是要编译的,我们现在来看这个问题,在crnn.py的相对目录下是有utils.py的所以不存在文件不存在的情况。其实问题是因为导入写法的问题,在python3 中的相对导入需要用 from . import utils这种写法。所以我们马上更正它的写法,
继续运行 demo.py 文件:

错误: ModuleNotFoundError: No module named 'lib.fast_rcnn’
打开对应文件。我们能看到lib的文件夹是在上一层目录下的,所以这里需要对python的查找目录中加入查找路径,虽然作者已经加了但是提示错误我们就用自己的办法加:


basepath = os.path.abspath(__file__)
basepath = os.path.dirname(os.path.dirname(basepath))
basepath = os.path.join(basepath, 'lib')
sys.path.append(basepath)

用上面的替换掉原先的 sys.path.append(os.getcwd())
然后修改导入方式为

from fast_rcnn.config import cfg
from networks.factory import get_network
from fast_rcnn.test import test_ctpn

即去掉了前面的lib因为我们已经把lib的路径添加进去了。

好了现在继续运行demo.py 之后进入最恶心的错误:ValueError: attempted relative import beyond top-level package
意思就是说python的相对导入路径不能超过顶级的包,python每个文件你都可以在第一行输出 print(__name__) 来查看当前文件的包路径,当我们在文件CHINESE-OCR-master\ctpn\lib\fast_rcnn\nms_wrapper.py 中输出看的时候实际会惊奇的发现输出了2次而且包路径不一样 一个包路径比较长到ctpn 还有一次很短只到上级目录这时候就是很明显就是第二次的时候 超过顶级包了,这里的原因其实就在堆栈里,我们仔细看下堆栈调用,就能发现它的上级调用竟然是CHINESE-OCR-master\ctpn\lib\fast_rcnn_init_.py
这个文件,当然这里的调用不是必要的,所以我们找到这个文件删掉里面所有内容。

继续跑demo.py 你还会发现好多这种超越顶级包的错误 还有上面的相对导入错误的 问题还有 夸目录导入另外的包的问题这里我们不 一一列举了统一上面的解决方案。等这些问题解决就是 可以进入到加载模型的错误,一共有2处地方会出现导入模型错误,因为作者的路径是自己的绝对路径,我们这里直接修改为自己的绝对路径即可,模型都在github上有地址,到此解决模型的问题之后大体上整个系统已经跑起来了,但是我们运行下去之后还会发现问题,运行中的问题
错误 : **ValueError: Buffer dtype mismatch, expected ‘XX’ but got ‘XX’ **
这样的错误 xx 是具体的数据类型,这里直接给出解决方案,打开cython_nms.pyx源文件,分别修改

  1. 27行为 cdef np.ndarray[np.int64_t, ndim=1] order = scores.argsort()[::-1]
  2. 30行为 cdef np.ndarray[np.int_t, ndim=1] suppressed = \
  3. 80行为 cdef np.ndarray[np.long, ndim=1] order = scores.argsort()[::-1]
  4. 83行为 cdef np.ndarray[np.long, ndim=1] suppressed = \

修改完后回到上面编译的操作重新编译一次然后再运行 demo.py 就能成功走通了,时间原因有点赶,有问题的朋友或者有疑惑或者觉得我写错了的朋友请大家留言问我和修订我,再次特地感谢!

ps : 2019/7/18
由于很多朋友都没有分,所以在这里贴上 那个文件的代码

import os
from distutils.core import setup
from distutils.extension import Extension
from os.path import join as pjoin

import numpy as np
from Cython.Distutils import build_ext
from Cython.Build import cythonize


try:
    numpy_include = np.get_include()
except AttributeError:
    numpy_include = np.get_numpy_include()


setup(
    ext_modules=cythonize(["bbox.pyx","cython_nms.pyx"],include_dirs=[numpy_include]),
)

有能支持的 希望支持给个分,才1分

未经允许不得擅自转载!

展开阅读全文

没有更多推荐了,返回首页