【ocr识别003】flask+paddleocr+bootstrap搭建OCR文本推理WEB服务

1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
2.了解、学习OCR相关技术知识领域,结合日常的场景进行测试、总结。如本文总结的flask+paddleocr+bootstrap搭建OCR文本推理WEB服务应用示例场景。

文章目录

    • 1.代码结构
    • 2.效果演示
    • 3.接口返回
    • 4.代码详情
      • 4.1 `HTML`代码详情
      • 4.2`Python`代码详情
    • 5.PaddleOCR模型推理参数解释
    • 6.后续展望

1.代码结构

  • 如下图所示:
    在这里插入图片描述

2.效果演示

  • 详情如下:
    在这里插入图片描述

3.接口返回

  • 接口测试效果图
    在这里插入图片描述

  • 返回结果详情部分示例

    {"error_code": "000000","error_msg": "识别成功","filename": "cstp2.png","recognize_time": "5890","result": [{"points": [[14.0,11.0],[108.0,11.0],[108.0,40.0],[14.0,40.0]],"score": 0.979973316192627,"text": "性别:男"},{"points": [[289.0,11.0],[400.0,9.0],[401.0,37.0],[290.0,39.0]],"score": 0.8993546962738037,"text": "住院号:"},{"points": [[677.0,2.0],[713.0,12.0],[707.0,31.0],[672.0,21.0]],"score": 0.6370271444320679,"text": "贝别:"}]
    }
    

4.代码详情

4.1 HTML代码详情

  • <!DOCTYPE html>
    <html>
    <meta charset="utf-8">
    <head><title>OCR文字检测识别试运行系统</title><!--静态加载 样式--><link rel="stylesheet" href={{ url_for('static',filename='bootstrap-3.4.1/css/bootstrap.min.css') }}></link><link rel="stylesheet" href={{ url_for('static',filename='css/upload.css') }}></link><link rel="stylesheet" href={{ url_for('static',filename='css/36buttons.css') }}></link>
    </head>
    <body>
    <div class="header"><div class="title">【OCR】PP-OCRv3 文字检测识别试运行系统v0.3.0</div>
    </div><ul class="menu"><li><a href="/upload/">通用文本检测识别处理</a></li>
    </ul><div class="content"><!--上传图片文件--><div id="upload_file"><form id="fileForm" action="/upload/" method="POST" enctype="multipart/form-data"><div class="form-group"><input type="file" class="form-control" id="_upload_file" name="upload_file">
    <!--                <label class="sr-only" for="upload_file">上传图片</label>--></br><button id="resetButton" name="resetButton" type="reset" class="button green">重置推理结果</button></div></form></div>
    </div>
    </div><div id="show" style="display: none;"><!--显示上传的图片--><div class="col-md-6" style="border: 2px solid #ddd;"></br><span class="label label-info" style="font-size: 24px;"><<<<<< 原始图片展示 >>>>>> </br></span><!--静态加载 图片, url_for() 动态生成路径 --></br><img id="src_pic_show" src="" alt="Image preview area..." title="preview-img" class="img-responsive"></div><div class="col-md-6" style="border: 2px solid #ddd;"><!--显示识别结果JSON报文列表--></br><span class="label label-info" style="font-size: 24px;"><<<<<< 推理结果详情 >>>>>> </br></span></br><!-- 结果显示区 --><div id="result_show" style="font-size: 28px;">客官,您提交的任务加急推理中......</div></div>
    </div>
    </body>
    </html>
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="http://malsup.github.io/jquery.form.js"></script><script type="text/javascript">var fileInput = document.querySelector('input[type=file]');var previewImg = document.querySelector('img');{#上传图片事件#}fileInput.addEventListener('change', function () {var file = this.files;var reader = new FileReader();//显示预览界面$("#show").css("display", "block");// 监听reader对象的的onload事件,当图片加载完成时,把base64编码賦值给预览图片reader.addEventListener("load", function () {previewImg.src = reader.result;}, false);// 调用reader.readAsDataURL()方法,把图片转成base64reader.readAsDataURL(file);//初始化输出结果信息$("#result_show").html("</br>客官,您提交的任务加急推理中......");{#上传图片识别表单事件,并显示识别结果信息#}{# ajaxSubmit 请求异步响应#}$("#fileForm").ajaxSubmit(function (data) {var inner = '<table border="1"> <thead> <tr> <th>序号</th> <th>文本目标</th> <th>置信度分数</th> </tr> </thead> <tbody>';//循环输出返回结果,响应识别结果为每行列表var inc = 1;for (var i in data['result']) {var text = data['result'][i]['text'];var score = data['result'][i]['score'];inner += "<tr><td>" + inc + "</td>" + "<td>" + text + "</td>" + "<td>" + score + "</td></tr>";inc += 1;}inner += '</tbody></table>'//清空输出结果信息$("#result_show").html("");//添加识别结果信息$("#show").append( inner );});}, false);document.getElementById('resetButton').addEventListener('click', function() {document.getElementById('src_pic_show').src = '';$('#result_show').empty();});
    </script>
    

4.2Python代码详情

  • 源代码
    import json
    import os
    import time
    import numpy as np
    import pandas as pd
    from pyautogui import *
    from paddleocr import PaddleOCR
    from PIL import Image, ImageDraw
    from flask import Flask, render_template, request, jsonify
    # 应用名称,当前py名称,视图函数
    app = Flask(__name__)
    # 相对路径
    BASE_DIR = os.path.dirname(os.path.basename(__name__))# 上传文件路径
    UPLOAD_DIR = os.path.join(os.path.join(BASE_DIR, 'static'), 'upload')def ocr_img2text( image ):result_dict = {'result': []}paddleocr = PaddleOCR(det_model_dir='./inference/ch_PP-OCRv3_det_infer/',rec_model_dir='./inference/ch_PP-OCRv3_rec_infer/',cls_model_dir='./inference/ch_ppocr_mobile_v2.0_cls_infer/',use_angle_cls=True, lang="ch", use_gpu=True)if image == "":image = screenshot()  # 使用pyautogui进行截图操作image = np.array(image)else:# 不为空就打开image = Image.open(image).convert('RGB')image = np.array(image)  # 经提醒,需要添加arrayprint( image, type(image) )# 识别图片文件result0 = paddleocr.ocr( image, cls=True )result = result0[0]# for line in result0:#     for word in line:#         print( word )for index in range(len(result)):line = result[index]p_dict = {}points = line[1]text = line[1][0]score = line[1][1]p_dict['points'] = pointsp_dict['text'] = textp_dict['score'] = scoreresult_dict['result'].append( p_dict )return result_dict@app.route('/')
    def upload_file():return render_template('upload.html')@app.route('/upload/', methods=['GET', 'POST'])
    def upload():if request.method == 'POST':# 每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。filedata = request.files['upload_file']upload_filename = filedata.filenameprint(upload_filename)# 保存文件到指定路径# 目标文件的名称可以是硬编码的,也可以从 ​request.files[file] ​对象的​ filename ​属性中获取。# 但是,建议使用 ​secure_filename()​ 函数获取它的安全版本if not os.path.exists(UPLOAD_DIR):os.makedirs(UPLOAD_DIR)img_path = os.path.join(UPLOAD_DIR, upload_filename)filedata.save(img_path)start = time.time()# 打开图片img1 = Image.open(img_path)# 识别图片result_dict = ocr_img2text(img_path)# 识别时间end = time.time()recognize_time = int((end - start) * 1000)result_dict["filename"] = upload_filenameresult_dict["recognize_time"] = str(recognize_time)result_dict["error_code"] = "000000"result_dict["error_msg"] = "识别成功"return jsonify(result_dict)else:return render_template('upload.html')
    

5.PaddleOCR模型推理参数解释

  • 参数详情
    在这里插入图片描述

6.后续展望

  • 持续改进优化该部分代码,并完善文档。欢迎交流。。。
  • PaddleOCR模型推理参数解释
  • https://www.cnblogs.com/xh2023/p/17642994.html

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

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

相关文章

MySQL 在 Windows 和 Ubuntu 上的安装与远程连接配置简介

MySQL 是一个广泛使用的开源关系型数据库管理系统&#xff0c;它提供了多用户、多线程的数据库服务。本文将介绍如何在 Windows 和 Ubuntu 操作系统上安装 MySQL&#xff0c;并配置远程连接。 Windows 上的 MySQL 安装 1. 下载 MySQL Installer 访问 MySQL 官方网站下载 Win…

融合创新:EasyCVR视频汇聚平台云计算技术与AI技术共筑雪亮工程智能防线

随着信息技术的飞速发展&#xff0c;视频云计算技术作为云计算领域的一个重要分支&#xff0c;正逐步在公共安全、社会治理等领域展现出其独特的优势。特别是在雪亮工程这一群众性治安防控工程中&#xff0c;视频云计算技术更是发挥了不可替代的作用。本文将从视频云计算技术的…

【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)

前缀和的优势 给定一个数组&#xff0c;前缀和的特点在于&#xff0c;任意给出一对始末位置&#xff0c;能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。 题型分析 这道题目正是“给出始末位置&#xff0c;检测其中元素特点”那一类&#xff0c;那我们就想&#…

自动化与高效设计:推理技术在FPGA中的应用

想象一下&#xff0c;你正在设计一个复杂的电路系统&#xff0c;就像在搭建一座精巧的积木城堡。你手头有各种形状和功能的积木块&#xff0c;这些积木块可以组合成任何你需要的结构。在这个过程中&#xff0c;你有两种主要的方法&#xff1a;一种是手动挑选和搭建每一块积木&a…

【Qt】内置对话框

一.Qt内置对话框 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt标准对话框全部继承于QDialog类。常⽤标准对话框如下&#xff1a; 二.内置对话框分类 1.消息对话框 QMessageBox 1.1 概念 消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为…

Android-RK356x GT9XX多点触控设置为单点触控的方法

本文基于RK356x Android11系统描述GT9XX驱动芯片由多点触摸改为单点触摸功能。本次介绍的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;Purple Pi OH是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大…

Opencv模板匹配

使用OpenCV和C来识别彩色图片中的特定物体&#xff0c;如黑桃♠&#xff0c;通常涉及几个步骤&#xff1a;预处理图像、特征提取、对象检测等。下面是一个基本的示例代码&#xff0c;演示如何使用OpenCV的模板匹配方法来识别图片中的黑桃♠。 函数原型 void matchTemplate(Inp…

【Mac】植物大战僵尸杂交版 for Mac(经典策略塔防游戏)游戏介绍

游戏介绍 植物大战僵尸杂交版 for Mac是一款非常受欢迎的策略塔防游戏&#xff0c;植物大战僵尸游戏以其独特的主题、幽默的风格和富有挑战性的关卡设计而著称。玩家需要种植各种植物来防御入侵的僵尸&#xff0c;每种植物都有其特定的功能和攻击方式。植物大战僵尸杂交版&…

老友记台词 第一季 第十五集 Friends 115(全英版)

文章目录 115 The One With the Stoned Guy[Scene: Central Perk, Rachel is serving Joey, Ross, and Monica their drinks.][Scene: Chandlers job, Chandler is typing data into his computer, he keeps typing even while taking a drink of coffee with one hand. One of…

VScode前端环境搭建

前言 VScode是企业中最常用的前端开发工具&#xff0c;本文描述如何利用VScode搭建前端开发环境 一、安装VScode 下载Vscode 点击前往下载页面 安装 安装时一直点击下一步即可 二、环境配置 1&#xff09;更改语言 点击拓展搜索Chinese后下载第一个&#xff0c;下载完后…

Bruno API 工具

Bruno 是Postman 和Insomnia 的开源桌面替代品&#xff0c;用于 API 的测试、开发和调试。它将测试集合保存在本地&#xff0c;因此可以使用 Git 或其他版本控制工具来进行协作。 下载地址: https://www.usebruno.com/downloads 功能 1. 左边菜单 Collections Create Collec…

影院订票系统/电影院售票系统/电影院购票系统的设计与实现/影院管理系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多电影院日常业务仍是通过人工管理的方式进行&#xff0c;需要在影院订票投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&…

Nginx 核心配置详解

目录 1 配置文件说明 1.1 nginx 配置文件格式说明 1.2 Nginx 主配置文件的配置指令方式&#xff1a; 1.3 主配置文件结构&#xff1a;四部分 1.4 nginx 文件作用解释 1.5 配置文件说明 2 nginx-web应用 2.1 定义进程数以及进程绑定 2.2 定义进程优先级与文件打开上限 2.3 even…

解锁冻结的 iPhone 和 iPad 的具体教程

许多苹果用户选择 iDevices 主要是因为他们认为苹果产品更稳定&#xff0c;使用效果也更好。然而&#xff0c;一些苹果用户报告说他们的 iPhone 或 iPad 屏幕没有响应。换句话说&#xff0c;他们的 iOS 设备被冻结了。如果你想解决这样的故障并恢复 iOS 数据&#xff0c;你可以…

挺进大别山(一)

大别山坐落于安徽省、湖北省、河南省交界处&#xff0c;是长江与淮河的分水岭。8月3日&#xff0c;我们早上8点&#xff0c;从马村出发&#xff0c;穿越郑州--许昌--周口--驻马店--信阳&#xff0c;日行5百多公里&#xff0c;到了安徽进入了大别山。近距离的领略了它的魅力。 雨…

Cesium模型制作,解决Cesium加载glb/GLTF显示太黑不在中心等问题

Cesium模型制作&#xff0c;解决Cesium加载glb/GLTF显示太黑不在中心等问题 QQ可以联系这里&#xff0c;谢谢

鸿蒙环境和模拟器安装

下载华为开发者工具套件&#xff0c;并解压 https://developer.harmonyos.com/deveco-developer-suite/enabling/kit?currentPage1&pageSize10 双击dmg安装ide 复制并解压sdk 安装模拟器 https://yuque.antfin-inc.com/ainan.lsd/cm586u/po19k1mi9b2728da?singleDoc#…

算法【Java】—— 双指针算法

双指针算法 常见的双指针有对撞指针&#xff0c;快慢指针以及前后指针&#xff08;这个前后指针是指两个指针都是从从一个方向出发&#xff0c;去往另一个方法&#xff0c;也可以认为是小学学习过的两车并行&#xff0c;我也会叫做同向指针&#xff09;&#xff0c;在前后指针…

使用VNC-viewer对树莓派5 远程连接桌面—详细记录笔记版

树莓派5 的远程桌面连接&#x1f680; 在完成了对树莓派镜像的安装&#xff0c;以及点亮了屏幕之后&#xff0c;接下来就是为开发做一些准备&#xff0c;就是配置树莓派5的远程的桌面的操作&#xff0c;因为如果不这样的话&#xff0c;我在PC上和树莓派系统上分别进行作业的时候…

CSS 布局

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。布局有一下几种 正常布局流display属性弹性盒子网格浮动定位CSS 表格布局多列布局 每种布局都有它们的用途&#xff0c;各有优缺点&#xff0c;相…