在OCR检测时出现了问题(flask接口)
把OCR检测写成flask接口之后,读取出来的图片信息完全不沾边了
具体代码如下:
```python
import base64
import json
import logging.config
import os
from PIL import Image
from werkzeug.exceptions import HTTPException
from flask import Flask, request, make_response, jsonify
from api_exception import APIException, ServerError
import cv2
import numpy as np
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
app = Flask(__name__)
logging.config.fileConfig('logging.conf')
api_logger = logging.getLogger('apilog')
def making_response(json_data):
response = make_response(jsonify(json_data))
response.headers['Content-Type'] = 'application/json;charset=UTF-8'
return response
@app.errorhandler(Exception)
def framework_error(e):
if isinstance(e, APIException):
api_logger.debug(f"Client IP:{e.remote_addr}, Status:{e.code}, Msg:{e.msg}")
return e
elif isinstance(e, HTTPException):
api_logger.debug(f"Client IP:localhost, Status:{e.code}, Msg:{e.description}")
return APIException(msg=e.description, code=e.code, error_code="2998")
else:
api_logger.error(api_logger.exception(e))
return ServerError(remote_addr="localhost")
@app.route('/', methods=['GET'])
def index():
return "Hello World!"
@app.route('/ocr', methods=['POST'])
def cert_ocr():
# api_json = {"msg": None,
# "status": 200
# }
try: # 加载模型
ocr_detection = pipeline(
Tasks.ocr_detection,
model='damo/cv_resnet18_ocr-detection-line-level_damo')
ocr_recognition = pipeline(
Tasks.ocr_recognition,
model='damo/cv_convnextTiny_ocr-recognition-general_damo')
api_logger.info("200,Start load model!")
except Exception as a1:
# api_json["msg"] = "load model error!"
# api_json["status"] = 2998
api_logger.warning("load model error!")
try: # 加载数据
data = request.get_data()
api_logger.info("200,Start request!")
except Exception as a2:
# api_json["msg"] = "No data obtained!"
# api_json["status"] = 2998
api_logger.warning("No data, request status: invalid!")
try: # json
data = json.loads(data)
api_logger.info("200,start load")
except Exception as a3:
# api_json["msg"] = "Data loading error!"
# api_json["status"] = 2998
api_logger.error("Data loading error!")
try: # base64处理
image1 = base64.b64decode(data["image1"].encode())
# image_decode = base64.b64decode(image1)
api_logger.info("Data conversion start!")
except Exception as a4:
# api_json["msg"] = "Data conversion error!"
# api_json["status"] = 2998
api_logger.error("Data conversion error!")
try: # ocr识别
img1 = cv2.imdecode(np.frombuffer(image1, np.uint8), cv2.IMREAD_ANYCOLOR)
result = ocr_recognition(img1)
api_logger.info("Data processing start!")
except Exception as a5:
# api_json["msg"] = "Data processing error!"
# api_json["status"] = 2998
api_logger.warning("Data processing error!")
print(result)
# api_json["msg"] = "successful!"
api_logger.info("successful!")
# face_recognition(image1,image2)
print("~~~~~~~~~~~~", result)
return jsonify(result)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False)
运行结果如下:
```python
2023-02-22 17:37:39|INFO |saver.py[:1284]|Restoring parameters from damo/cv_resnet18_ocr-detection-line-level_damo\tf_ckpts\checkpoint-80000
2023-02-22 17:37:39|INFO |api.py[:59 ]|200,Start load model!
2023-02-22 17:37:39|INFO |api.py[:66 ]|200,Start request!
2023-02-22 17:37:39|INFO |api.py[:73 ]|200,start load
2023-02-22 17:37:39|INFO |api.py[:81 ]|Data conversion start!
2023-02-22 17:37:39|INFO |api.py[:89 ]|Data processing start!
{'text': '餐'}
2023-02-22 17:37:39|INFO |api.py[:97 ]|successful!
~~~~~~~~~~~~ {'text': '餐'}
2023-02-22 17:37:39|INFO |_internal.py[:224 ]|127.0.0.1 - - [22/Feb/2023 17:37:39] "POST /ocr HTTP/1.1" 200 -
正常用别的代码识别出来的结果是一个正常的银行开户许可证上的信息
我的期望就是想找到信息识别错误的原因
可以尝试下这个代码看看
from io import BytesIO
from PIL import Image
@app.route('/ocr', methods=['POST'])
def cert_ocr():
try:
# 加载模型
ocr_detection = pipeline(
Tasks.ocr_detection,
model='damo/cv_resnet18_ocr-detection-line-level_damo')
ocr_recognition = pipeline(
Tasks.ocr_recognition,
model='damo/cv_convnextTiny_ocr-recognition-general_damo')
api_logger.info("200,Start load model!")
except Exception as e:
api_logger.warning("load model error!")
raise APIException(msg="load model error!", code=2998, error_code="2998")
try:
# 加载数据
data = request.get_data()
api_logger.info("200,Start request!")
except Exception as e:
api_logger.warning("No data, request status: invalid!")
raise APIException(msg="No data obtained!", code=2998, error_code="2998")
try:
# json
data = json.loads(data)
api_logger.info("200,start load")
except Exception as e:
api_logger.error("Data loading error!")
raise APIException(msg="Data loading error!", code=2998, error_code="2998")
try:
# base64处理
image_data = data.get("image1")
if not image_data:
raise APIException(msg="No image data found!", code=2998, error_code="2998")
image_bytes = base64.b64decode(image_data)
image = Image.open(BytesIO(image_bytes))
api_logger.info("Data conversion start!")
except Exception as e:
api_logger.error("Data conversion error!")
raise APIException(msg="Data conversion error!", code=2998, error_code="2998")
try:
# ocr识别
img = np.array(image)
result = ocr_recognition(img)
api_logger.info("Data processing start!")
except Exception as e:
api_logger.warning("Data processing error!")
raise APIException(msg="Data processing error!", code=2998, error_code="2998")
api_logger.info("successful!")
return jsonify(result)
看下这个实例的方法可否帮助到你:https://www.jianshu.com/p/c966e95f40bd/
该回答引用ChatGPT
有问题或者疑问,可以回复我
以下是修改建议:
在捕捉异常时,建议将具体的错误信息打印出来,便于排查问题。
对于 APIException 及其子类的异常,应该返回正确的状态码和错误信息,而不是统一返回 2998。可以将 APIException 作为一个基类,派生出多个子类来表示不同的错误类型,例如数据加载错误、数据转换错误、模型加载错误等,方便区分和处理不同类型的错误。
在返回的 json 数据中,应该使用标准的键值对格式,例如 {'status': 200, 'message': 'success', 'data': result},其中 status 表示状态码,message 表示提示信息,data 表示返回的数据。
建议在最后统一返回 JSON 格式的数据,便于调用方处理返回结果.
修改代码如下:
import base64
import json
import logging.config
import os
from PIL import Image
from werkzeug.exceptions import HTTPException
from flask import Flask, request, make_response, jsonify
from api_exception import APIException, ServerError
import cv2
import numpy as np
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
app = Flask(__name__)
logging.config.fileConfig('logging.conf')
api_logger = logging.getLogger('apilog')
def make_response_json(status_code, message, data):
response_json = {
'status': status_code,
'message': message,
'data': data
}
return make_response(jsonify(response_json))
@app.errorhandler(Exception)
def framework_error(e):
if isinstance(e, APIException):
api_logger.debug(f"Client IP:{e.remote_addr}, Status:{e.code}, Msg:{e.msg}")
return make_response_json(e.code, e.msg, None)
elif isinstance(e, HTTPException):
api_logger.debug(f"Client IP:localhost, Status:{e.code}, Msg:{e.description}")
return make_response_json(e.code, e.description, None)
else:
api_logger.error(api_logger.exception(e))
return make_response_json(500, 'Internal Server Error', None)
@app.route('/', methods=['GET'])
def index():
return "Hello World!"
@app.route('/ocr', methods=['POST'])
def cert_ocr():
try: # 加载模型
ocr_detection = pipeline(
Tasks.ocr_detection,
model='damo/cv_resnet18_ocr-detection-line-level_damo')
ocr_recognition = pipeline(
Tasks.ocr_recognition,
model='damo/cv_convnextTiny_ocr-recognition-general_damo')
api_logger.info("Start loading model.")
except Exception as e:
api_logger.error(f"Failed to load model: {e}")
raise APIException(msg="Failed to load model.", code=500)
try: # 加载数据
data = request.get_data()
api_logger.info("Start processing data.")
except Exception as e:
api_logger.error(f"Failed to get data: {e}")
raise APIException(msg="Failed to get data.", code=400)
try: # json
data = json.loads(data)
api_logger.info("Start loading data.")
except Exception as e:
api_logger.error(f"Failed to load data: {e}")
raise APIException(msg="Failed to load data.", code=400)
try: # base64处理
image_data = data.get("image1")
if image_data is None:
raise APIException(msg="No image data provided.", code=400)
image_data = base64.b64decode(image_data)
image = cv2.imdecode(np.frombuffer(image_data, np.uint8), cv2.IMREAD_ANYCOLOR)
api_logger.info("Start processing image data.")
except Exception as e:
api_logger.error(f"Failed to process image data: {e}")
raise APIException(msg="Failed to process image data.", code=400)
try: # ocr识别
result = ocr_recognition(image)
api_logger.info("Start OCR recognition.")
except Exception as e:
api_logger.error(f"Failed to recognize text: {e}")
raise APIException(msg="Failed to recognize text.", code=500)
api_logger.info("OCR recognition succeeded.")
return make_response_json(200, 'success', result)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False)
参考GPT和自己的思路,根据您提供的代码,目前并不能确定具体的问题所在,需要更多的上下文信息和错误提示。但是,以下几个问题可能会影响您的 OCR 检测结果:
1 图片格式转换问题:首先需要确认图片的格式是否正确,并且在转换成 numpy 数组前是否正确解码。
2 图片预处理问题:在将图片送入 OCR 模型之前,可能需要进行一些预处理,例如缩放、裁剪、二值化等。确保预处理的方法正确,否则可能会影响 OCR 模型的检测和识别效果。
3 模型参数问题:OCR 模型的参数可能需要根据具体的使用场景进行微调,确保模型在您的数据上有较好的泛化能力。
4 接口调用问题:在将 OCR 模型封装成 Flask 接口时,需要确保数据传递和处理的正确性,特别是图片的编解码和传输方式,以及接口的参数设置和数据格式。
以上只是一些可能的问题,具体需要根据具体情况进行排查。建议您先检查图片格式、预处理、模型参数等方面是否存在问题,或者尝试打印出每个步骤的结果,以确定具体的问题所在。
以下是一些可能需要修改的地方:
1 修改模型路径:如果你的模型不在 "damo/cv_resnet18_ocr-detection-line-level_damo\tf_ckpts\checkpoint-80000" 路径下,需要修改模型路径。
2 修改服务器地址和端口号:如果你希望在不同的地址和端口上启动服务器,可以修改 app.run() 中的参数。
3 修改OCR识别的参数:OCR识别的参数可以在 ocr_recognition 函数中修改,例如识别的图片大小、阈值等。
4 修改返回结果的格式:返回结果的格式可以在 api.py 中的 ocr_recognition 函数中修改,例如返回所有识别结果、返回置信度最高的结果等。
有可能是以下原因导致识别结果不正确:
1 训练数据集不足或不够多样化,导致模型没有学到足够的特征以正确地识别字符。需要通过增加训练数据集,增加训练集的多样性或引入更高质量的数据来提高模型的准确性。
2 模型本身的架构或参数不够优秀,需要通过优化模型的结构或调整参数来提高准确性。可以考虑使用更先进的模型结构或训练策略。
3 输入图像的质量不好,包括模糊、倾斜、光照不均等问题。可以通过图像预处理的方式,比如锐化、二值化、裁剪等操作,提高输入图像的质量。
4 OCR 算法可能不太适用于当前的字符集或者字体,需要针对当前的数据集或任务进行调整或者使用不同的 OCR 算法。
5 可能存在模型过拟合的情况,导致模型过于依赖于训练集中的噪声或者特定的样本,建议通过数据增强、正则化等方法减少过拟合的影响。
在调试和优化 OCR 系统时,需要先确认问题出现的根本原因,从而有针对性地进行调整和优化。
如果对您有帮助,请给与采纳,谢谢。
参考网址:https://www.cnblogs.com/Aquish/p/flask_depoly.html 希望能帮到你哦~
您的代码中缺少图像处理部分。在接收到客户端发送的图像数据之后,您需要对图像数据进行处理,以便将其传递给OCR检测模型。以下是一个可能的图像处理代码:
try:
image_data = request.get_data()
image_data = base64.b64decode(image_data)
image = Image.open(io.BytesIO(image_data))
image = np.array(image)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
except Exception as e:
# 处理错误情况
pass
在上述代码中,我们首先从request对象中获取图像数据。然后,我们将图像数据解码为二进制数据,并使用PIL库将其转换为图像对象。接下来,我们将图像对象转换为numpy数组,并使用OpenCV库将其转换为RGB格式。最后,我们可以使用处理后的图像进行OCR检测。
请注意,上述代码仅提供了一个示例,并且可能需要根据您的具体需求进行修改。另外,您还需要将处理后的图像传递给OCR检测模型,获取OCR检测结果,并将结果返回给客户端。
对比下 img1 = cv2.imdecode(np.frombuffer(image1, np.uint8), cv2.IMREAD_ANYCOLOR)
这块是否拿到和你测试案例一样的数据把。
以下答案基于ChatGPT与GISer Liu编写:
一、 在您的代码中,您正在将图像数据从前端发送到后端并解码以进行OCR识别。但是,您似乎未在前端对图像进行任何预处理。因此,您可能遇到了以下问题:
图像格式不支持:如果您上传了不受支持的图像格式,那么后端将无法对其进行解码并将其转换为图像数据,因此将生成错误。
图像大小:当您上传大型图像时,服务器可能会超时或无法处理。在这种情况下,您需要在前端对图像进行缩小以减小文件大小。
图像质量:如果您上传的图像质量不好,那么可能会影响OCR识别的准确性。
二、 为了解决这些问题,您可以在前端对图像进行以下操作:
确保上传的图像为支持的格式。
对上传的图像进行缩小以减小文件大小。
尽可能使用高质量的图像进行上传,以提高OCR识别的准确性。
此外,您可以在后端进行其他错误检查以确保您的代码不会崩溃。例如,您可以检查请求是否为空或是否包含所有必需的参数。
该回答引用ChatGPT
首先,您需要检查您的flask接口代码,以确保它正确地读取图像信息。其次,您可以尝试使用不同的OCR库,以查看它们是否能够更好地识别图像信息。最后,您可以尝试使用图像处理技术,如图像增强,以改善图像质量,从而提高OCR检测的准确性。