背景

        正在做的爬虫项目,其中需要使用ocr的功能去识别验证码。所以就使用了paddlocr,结果没想到后期这么大个坑。好在想到一个方法可能规避这个打包的问题。

        写这一篇文章主要是记录下在打包有paddlocr的时候的问题,及规避方法。方便给看到这篇博客及有同样问题的网友提供一个思路。

目录

一、出错情况

        1.1、多线程的问题

        1.2、路径下文件找不到的问题

二、解决方法

        2.1、多线程问题解决

        2.2、路径下文件找不到问题解决

一、出错情况

        首先我在网上搜到的一些解决办法对我的问题都没有解决。我的错误是提示pyd文件找不到,重要的是我提示的路径是一个动态路径,就是c盘tmp目录下的。每次运行报错的文件夹不一样,根本不知道从何搞起。具体的错误信息没有了,当时没有记录。

        我这边出现的问题有以下几种:

        1.1、多线程的问题

                打好包之后一直运行不打印内容,使用任务管理器看后台会发现xx.exe开了多个进程(这个问题网上有解决的办法)

        1.2、路径下文件找不到的问题

                Error: Can not import avx core while this file exists: xxx/paddle/fluid/core_avx.pyd

二、解决方法

        2.1、多线程问题解决

                关于启动多进程的问题,解决方法是修改一个py文件。解决方法是上site-packages里找到paddle这个包,然后进入到dataset文件夹。然后打开里面一个叫image.py文件,打开并按照如下的写法进行修改即可

# FIXME(minqiyang): this is an ugly fix for the numpy bug reported here

# https://github.com/numpy/numpy/issues/12497

# if six.PY3:

# import subprocess

# import sys

# import_cv2_proc = subprocess.Popen(

# [sys.executable, "-c", "import cv2"],

# stdout=subprocess.PIPE,

# stderr=subprocess.PIPE)

# out, err = import_cv2_proc.communicate()

# retcode = import_cv2_proc.poll()

# if retcode != 0:

# cv2 = None

# else:

# import cv2

# else:

# try:

# import cv2

# except ImportError:

# cv2 = None

'''

注释上面的,添加下面的

'''

try:

import cv2

except ImportError:

cv2 = None

        2.2、路径下文件找不到问题解决

                我的问题属于第二个问题,只不过路径不是固定的,而是动态路径。就很烦。我试过网上的解决办法,然而对我来说并没有什么用。然后我想到一个办法去规避他。

                思路:既然本地跑没有问题,为什么不可以把单独识别ocr的代码做一个服务。然后再实际生产调用服务传入图片,使用服务的返回结果呢。这样既能解决打包的问题,也能减少最终打包的大小,简直是一举两得!说干就干,当天就把程序写好了,并测试过这个方法是可行的。具体的代码及思路参考如下

                ①:先开发一个服务接口,只集成ocr的功能。具体如下代码所示:

import flask

from PIL import Image

from paddleocr import PaddleOCR

from flask import request

'''

OCR识别验证码服务

'''

@server.route('/ocrServer', methods=['get', 'post'])

def run():

file = request.files['file']

file.save('api_save.png')

binary = np.array(Image.open(r'api_save.png').convert('L'), 'f')

# ocr 识别验证码

ocr = PaddleOCR(use_angle_cls=True, lang='ch')

img_info = ocr.ocr(binary, cls=False)

# 最终结果

img_result = ""

for line in img_info:

# 得到图片中文字 循环加总,(多行文字的情况)

img_result += line[-1][0]

img_result += ' '

# 去除特殊字符

code_value = re.findall(r'[^\*"/:?\\|<>″′‖ 〈\n]', img_result, re.S)

code_value = "".join(code_value)

print('识别验证码信息:', code_value)

# 及时删除

os.remove('api_save.png')

return code_value

if __name__ == '__main__':

# ocr识别 https://localhost:8888/ocrServer? & photoFile

server.run(debug=True, port='8888', host='0.0.0.0')

                ②:在生产,即实际需要ocr识别的部分调用上面写好的服务接口即可。代码如下

import requests

def ocr_code():

# 以二进制格式打开保存的验证码图片

r_file = open('code.png', 'rb')

# 封装参数 为字典

code_info = {'file': r_file}

# 调用服务识别验证码 codeOcrServer 传入验证码信息

r = requests.get('http://21.144.105.129:8888/ocrServer?',files=code_info)

code_value = r.text

r.close()

return code_value

         最后困扰了两天的问题完美解决(其实也就是规避,不算真正的解决。但是确实好使!)

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: