PaddleOCR环境搭建、模型训练、推理、部署全流程(Ubuntu系统)_1_paddle 多进程推理-CSDN博客
PP-Structure 文档分析-CSDN博客
接前两篇继续完成Flask部署
一、使用Flask部署ppocr模型
GET方法用于从服务器获取资源,即客户端向服务器请求数据。POST方法用于向服务器提交数据,即客户端向服务器发送数据。
- 服务器:一般是指
- 客户端:一般是指网页
部署PaddleOCR(PP-OCR)模型到Flask应用中,通常包括以下几个步骤:
1、环境准备与模型获取:
安装依赖:确保已经安装了Flask,以及PaddlePaddle(PaddleOCR的依赖库)
下载模型:
(继续前两篇所以模型和环境不在重复)
2、创建Flask应用:
初始化Flask app:编写Python脚本,创建一个新的Flask应用实例。
from flask import Flask, request, jsonifyapp = Flask(__name__)
定义路由与处理函数:创建一个路由(如/predict
),并编写对应的处理函数,该函数接收HTTP请求中的图像数据,调用PaddleOCR进行识别,并返回识别结果。
@app.route('/predict', methods=['POST'])
def ocr_predict():# 获取请求中的图像数据image_data = request.files.get('image')# 使用PaddleOCR进行识别result = ocr_api(image_data)# 返回JSON格式的结果return jsonify(result)
3、加载与封装PaddleOCR:
加载模型:在Flask应用中,使用PaddleOCR提供的API加载模型。指定模型路径和所需配置
from paddleocr import PaddleOCRocr = PaddleOCR(model_path='path/to/model', config_path='path/to/config.json')
封装识别接口:创建一个名为ocr_api
的函数,接受图像数据作为输入,使用加载的OCR对象进行识别,并处理返回结果。可能需要对图像数据进行预处理(如解码、缩放),然后调用OCR的ocr
方法。
def ocr_api(image_data):img_bytes = image_data.read()img = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_COLOR)results = ocr.ocr(img)# 对结果进行整理,例如提取文字和其坐标formatted_results = []for res in results:text, box, _ = resformatted_results.append({'text': text,'bbox': box.tolist()})return formatted_results
4、处理图像
根据Flask接收到的HTTP请求类型(如multipart/form-data),解析上传的图像数据。上述示例中,假设图像通过名为image
的字段以文件形式上传
5、配置运行参数:
设置Flask应用的运行参数,如主机地址、端口、调试模式等。例如:
if __name__ == '__main__':app.run(host='0.0.0.0', port=5001, debug=True)
6、部署与测试:
- 启动Flask应用。在命令行中运行包含以上代码的Python脚本。
- 使用HTTP客户端(如Postman)或编写简单的HTML表单,向
http://localhost:5001/predict
发送POST请求,附带上要识别的图像文件。检查响应是否包含预期的OCR识别结果
代码:
# 环境ppocr/001import os
import subprocess
import shutil
from flask import Flask, render_template, request, jsonifyapp = Flask(__name__)# 这里除了output外其它都只写成绝对路径,...
# inference里的是我自己的模型
file = 'D:/GPT_1/ppocr_1/ppstructure/table/predict_table.py'
det_model = 'D:/GPT_1/ppocr_1/ppstructure/inference/ch_PP-OCRv3_det_infer'
rec_model = 'D:/GPT_1/ppocr_1/ppstructure/inference/ch_PP-OCRv3_rec_infer'
table_model = 'D:/GPT_1/ppocr_1/ppstructure/inference/ch_ppstructure_mobile_v2.0_SLANet_infer'
rec_dict = 'D:/GPT_1/ppocr_1/ppocr/utils/ppocr_keys_v1.txt'
table_dict = 'D:/GPT_1/ppocr_1/ppocr/utils/dict/table_structure_dict_ch.txt'
output = 'D:/GPT_1/ppocr_1/ppocrtable_Flask/static/output/table'def allowed_file(filename):return '.' in filename and filename.rsplit('.', 1)[1] in set(['bmp', 'jpg', 'JPG', 'png', 'PNG'])@app.route('/', methods=['GET'])
def index():return render_template('index.html')@app.route('/Upload', methods=['POST', 'GET']) # 添加路由
def classification():if request.method == 'POST':f = request.files['images']if not (f and allowed_file(f.filename)):return jsonify({"error": 1001, "msg": "only support image formats: .bmp .png .PNG .jpg .JPG"})basepath = os.path.dirname(__file__) # 当前文件所在路径if os.path.exists('static/images/test.jpg'):os.remove('static/images/test.jpg')passelse:passif os.path.exists('static/output/table'):shutil.rmtree('static/output/table')passelse:passupload_path = os.path.join(basepath, 'static/images/test.jpg') # 注意:没有的文件夹一定要先创建,不然会提示没有该路径f.save(upload_path)f_name = f.filename# image = cv2.imread(upload_path)# image = image.astype(np.float32)# image_array = np.array(image)# input_data = np.expand_dims(image_array, axis=-0)cmd = ['python','{}'.format(file),'--det_model_dir={}'.format(det_model),'--rec_model_dir={}'.format(rec_model),'--table_model_dir={}'.format(table_model),'--rec_char_dict_path={}'.format(rec_dict),'--table_char_dict_path={}'.format(table_dict),'--image_dir={}'.format(upload_path),'--output={}'.format(output)]# 使用Popen创建进程,并与进程进行复杂的交互proc = subprocess.Popen(cmd, # cmd特定的查询空间的命令stdin=None, # 标准输入 键盘stdout=subprocess.PIPE, # -1 标准输出(演示器、终端) 保存到管道中以便进行操作stderr=subprocess.PIPE, # 标准错误,保存到管道# #)outinfo, errinfo = proc.communicate() # 获取输出和错误信息print('----------')print(outinfo)print(errinfo)print('-------')return render_template('return.html', info=outinfo.decode('utf-8'), img_name=f_name,file_loc=os.getcwd() + '\static\output\\table\show.html')return render_template('index.html')if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)