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

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

感觉需要这篇博客的朋友特别多,而且自己之前写的也很粗糙导致很多朋友都不能实际运行起来,很可惜,这次决心将不完整的地方补充完整。

环境:

  1. windows 10
  2. python 3.6.x (最好x > 2)
  3. 项目地址 :https://github.com/xiaofengShi/CHINESE-OCR
  4. cpython
  5. keras
  6. pytroch
  7. tensorflow(或其他后端)
  8. 一直忘记把模型补上,现在补上模型地址如果网盘失效请私信我。
    链接:https://pan.baidu.com/s/1WoIxpUrTxU1ELCV8fUiXag
    提取码:xz4l (刷新链接时间 : 2020-6-30)

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

  1. 首先我们从一个空的python 虚拟环境开始,如果是安装了anaconda的朋友,那是非常简单直接图形化界面上创建一个py36的虚拟环境或者直接用conda命令创建一个虚拟环境
    命令 : conda create -n 你的虚拟环境名称 python=X.X(2.7、3.6等)
  2. 进入创建好的虚拟环境,anaconda的朋友可以直接在图形化界面上进行切换环境然后打开 open Terminal 打开控制台
  3. 开始安装依赖环境 以下进行罗列:
    1. pip install tensorflow==1.14.0
    2. pip install pillow
    3. pip install opencv-python
    4. pip install easydict
    5. pip install keras
    6. pip install Cython opencv-python
    7. pip install matplotlib
    8. pip install h5py lmdb mahotas
    9. pip install futures==3.1.1
    10. pip install torch1.3.0+cpu torchvision0.4.1+cpu -f https://download.pytorch.org/whl/torch_stable.html (因为我们只考虑 CPU的运行情况下,所以安装cpu版本的)
    11. 剩下的等运行demo.py的时候缺什么 补什么就行

直接运行一下demo.py 如果出现错误是以下的错误

错误 :ModuleNotFoundError: No module named 'utils’

就是缺少用cython 进行编译的可以在windows下运行的pyd C代码。所以我们进入报错的目录,ctpn\lib\utils中 把我再文章最底下给出的 setup_cpu.py的代码复制然后覆盖到 这个目录下本来就存在的setup_cpu.py中 或者自己先备份一个也行。运行的命令就是 :

python setup_cpu.py build_ext --include-dirs=盘符:\你的anaconda路径(你的虚拟环境路径)\lib\sit-packets\numpy\core\include --inplace

然后将命令行的目录进入到这个目录,运行setup_cpu.py 运行之后会出现一些问题:

  1. ValueError: got unknown compilation option, please remove: include_dirs 如果是遇到这个问题,那就把这个setup_cpu.py中的cython编译的哪行代码中的include的参数去掉,不同版本的 python参数有些不一样。去掉就行,然后编译
  2. error : Unable to find vcvarsall.bat 如果是这个错误那么请安装 vs2015然后在安装选项中选中 vc++ 这个。然后等待安装完成,因为linux中是用GCC编译的但是windows中我们需要vc来编译。
  3. 其他错误的话,请留言。

这时候编译完成的话会在目录下出现一个ctpn的文件夹,从里面拿出2个pyd文件并且修改名称分别是 bbox.pyd 和cython_nms.pyd 放到 utils 目录下。
上面步骤弄好之后可以重新回到 demo.py所在的目录下 进行运行demo.py 这个时候可能会报错:

找不到模块utils 在目录 crnn\models\crnn.py中出现错误 解决方案:
打开该文件 从第二行开始加入以下代码:
import os
current_dir = os.path.abspath(os.path.dirname(file))
sys.path.append(current_dir)
sys.path.append("…")

继续运行demo.py 会出现一个错误 xx get xx 这个错误在 报错中间出现的,这个问题是因为系统的问题导致的 类型不正确这个在我旧博客内容中有解答和解决方案,仔细看下修改一下 pyx的内容 然后重新运行 setup_cpu.py 重新编译pyd然后 拷贝到utils 中然后再 重新运行demo.py

应该还有错误 :

  1. ‘NoneType’ object has no attribute ‘model_checkpoint_path’
  2. 还有类似的 “NoneType” object 这种的

这类错误一共有3个 应该都是对应了 一个模型文件,意思就是找不到模型文件。这个有个模型文件是 anglexxx.h5 比较大还有2个表较小 一共650MB左右大小。需要的朋友可以留言邮箱。或者自己去找。吧模型的路径都设置好之后就没有其他问题了。祝愿大家都能顺利跑通。

下面是旧博客写的内容 :

第一行的激活环境就不用管了,估计是作者自己的环境。中间的都是使用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分

未经允许不得擅自转载!

评论 159
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值