目录
一、出错情况
首先我在网上搜到的一些解决办法对我的问题都没有解决。我的错误是提示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