使用Flask部署ppocr模型_3

PaddleOCR环境搭建、模型训练、推理、部署全流程(Ubuntu系统)_1_paddle 多进程推理-CSDN博客

PP-Structure 文档分析-CSDN博客

接前两篇继续完成Flask部署

一、使用Flask部署ppocr模型

 GET方法用于从服务器获取资源,即客户端向服务器请求数据。POST方法用于向服务器提交数据,即客户端向服务器发送数据。

  1.  服务器:一般是指
  2. 客户端:一般是指网页

部署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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单链表讲解

一.链表的概念以及结构 链表是一种物理结构上不连续,逻辑结构上连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构与火车是类似的,一节一节的,数据就像乘客一样在车厢中一样。 与顺序表不同的…

如何使用pytorch进行图像分类

如何使用pytorch进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f

【软考】UML中的图之用例图

目录 1. 说明2. 建模2.1 说明2.2 语境建模2.3 需求建模 3. 图示4. 组成部分 1. 说明 1.用例图(Use Case Diagram)。2.展现了一组用例、参与者(Actor)以及它们之间的关系。3.用例图通常包括以下的内容:用例、参与者、用…

配置IP地址并验证连通性

1.实验环境 主机 A和主机 B通过一根网线相连,如图6.13所示。 图6.13 实验案例一示意图 2.需求描述 为两台主机配置!P地址,验证P地址是否生效;验证同一网段的两台主机可以互通,不同网段的主机不能直接互通。 3.推荐步骤 为两台…

uni原生导航栏相关设置

动态设置某一项内容 使用场景:不同角色显示不同导航栏或设置不同名称,不同图标 API: uni.setTabBarItem(OBJECT) 属性类型默认值必填说明indexnumber无是tabBar的哪一项,从左边算起(从0开始)textString无否tab上的按…

【Linux】封装一下简单库 理解文件系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、封装一下简单库 二、理解一下stdin(0)、stdout(1)、stderr(3) 2.1、为什么要有0、1、2呢? 2.2、特点 2.3、如果我想让2也和1重定向到一个文件…

uni-app 微信小程序设置全局转发给朋友、分享到朋友圈

小程序右上角原生菜单自带的分享按钮,默认不可用 1.创建一个mixin share.js export default {created() {//#ifdef MP-WEIXINwx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline]});//#endif}, }export default {created() {//#ifde…

vs2022断点调试怎么看堆栈帧,找异常位置

打一个断点以后,会出现如图报错 我们要怎么找到报错的语句?鼠标点击->堆栈帧->上一行运行的位置->直到找到错误出错如图所示: 跳转到,我们手写的代码,执行出错的位置

Unity | Shader基础知识(第十二集:颜色混合)

目录 前言 一、日常生活中的常见现象 二、unity自带的一个结构体(表面着色器SurfaceOutputStandard) 三、自己写一个颜色混合的Shader 1.只加基础颜色Albedo 2.加入法线 3.加入光滑度 4.加入金属度 5.加入自发光 四、作者的话 前言 shader里每一…

docker安装nessus服务及使用

Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件,现在软件服务越来越多,越来越复杂,涉及的数据也更多;因此系统完成后对于系统漏洞的检测并对其进行修改十分有必要,本文介绍通过docker安装nessus服务及简单的使…

设计模式-模板方法模式(TemplateMethod)

1. 概念 模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 2. 原理结构图 2.1 图 2.2 角色 抽象类(Abstract Class) 定义抽象的基本操作(Primitive Operations&#xff…

从启发式到模型化 京东推荐广告排序机制演化

1、序言:广告排序机制的前世今生 1.1、简介:广告排序机制 在线广告是国内外各大互联网公司的重要收入来源之一,而在线广告与传统广告最大的区别就在于其超大规模的实时竞价环境:数以万计的广告主在一天内可以参与亿级别的流量竞…

解决宝塔的FTP无法使用被动模式

问题:宝塔安装完ftp管理软件之后,无法使用被动模式连接 解决: 提示: 如果还是不行,那么要看看防火墙和安全组有没有放行被动模式的端口,宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…

Kubernetes 升级不弃 Docker:KubeKey 的丝滑之道

作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社区用户委员会杭州站站长。 引言 随着 Kubernetes 社区的不断发展,即将迎来 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中,社区作出一个重要决策…

计算机网络——42攻击和对策

攻击和对策 IDS:入侵检测系统 分组过滤 对TCP/IP头部进行检查不检查会话间的相关性 IDS:intrusion detection system 深入分组检查:检查分组的内容(e.g. 检查分组中的特征串,已知攻击数据库的病毒和攻击串)检查分组间…

【网站项目】捷邻小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

FPGA - 以太网UDP通信(二)

一,引言 前文链接:FPGA - 以太网UDP通信(一) 在上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑,接下来介绍UDP通信结构框图以及数据链路层&#xff…

Python | Leetcode Python题解之第28题找出字符串中的第一个匹配项的下标

题目: 题解: class Solution:def strStr(self, haystack: str, needle: str) -> int:# Func: 计算偏移表def calShiftMat(st):dic {}for i in range(len(st)-1,-1,-1):if not dic.get(st[i]):dic[st[i]] len(st)-idic["ot"] len(st)1re…

自己开发的App如何上架,详细解读App上架操作流程

对于企业或个人开发的App,上架是必经之路。然而,许多人不清楚如何进行App上架。工信部在2023年规定,App必须备案才能上架。那么,让我们一起了解App上架流程吧。 1. 准备上架所需材料 在上架App之前,需要准备应用图标…

类加载子系统

目录 类的加载 加载流程 类的加载器 类的链接 类的检验阶段 类的准备阶段 类的解析阶段 类的初始化 static与final的搭配问题 ()的线程安全性 类的初始化情况:主动使用vs被动使用 类的使用 类的卸载 类、类的加载器、类的实例之间的引用关系 类的生命…