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

server/2024/9/23 6:19:22/

1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
2.了解、学习OCR相关技术知识领域,结合日常的场景进行测试、总结。如本文总结的html" title=flask>flask+paddlehtml" title=ocr>ocr+html" title=bootstrap>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代码详情

  • html"><!DOCTYPE html>
    <html>
    <meta charset="utf-8">
    <head><title>OCR文字检测识别试运行系统</title><!--静态加载 样式--><link rel="stylesheet" href={{ url_for('static',filename='html" title=bootstrap>bootstrap-3.4.1/css/html" title=bootstrap>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 paddlehtml" title=ocr>ocr import PaddleOCR
    from PIL import Image, ImageDraw
    from html" title=flask>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 html" title=ocr>ocr_img2text( image ):result_dict = {'result': []}paddlehtml" title=ocr>ocr = PaddleOCR(det_model_dir='./inference/ch_PP-OCRv3_det_infer/',rec_model_dir='./inference/ch_PP-OCRv3_rec_infer/',cls_model_dir='./inference/ch_pphtml" title=ocr>ocr_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 = paddlehtml" title=ocr>ocr.html" title=ocr>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 = html" title=ocr>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.ppmy.cn/server/103384.html

相关文章

如何用CWE API 来减轻软件产品中的安全风险

本文分享自华为云开发者社区《用CWE API 减轻软件产品中的安全风险》作者&#xff1a; Uncle_Tom 1. CWE REST API 推出的目的 8 月 8 号&#xff0c;CWE™ 计划推出了“CWE REST API”。 CWE™计划由美国网络安全与基础设施安全局(Cybersecurity & Infrastructure Secur…

如何提升 RocketMQ 顺序消费性能?

提升RocketMQ顺序消费性能&#xff0c;可以从多个方面进行优化。以下是一些关键策略和步骤&#xff1a; 优化消息发送策略 使用Sharding Key&#xff1a;在发送顺序消息时&#xff0c;通过Sharding Key&#xff08;如用户ID、订单ID等&#xff09;将相关联的消息发送到同一个队…

uniapp-部分文件中文乱码

一、问题 在开发时遇到&#xff0c;部分页面的中文显示乱码&#xff0c;如图 搜索了一下解决方法&#xff0c;这里记录一下 二、问题原因&#xff1a; 页面的编码格式不是 utf-8 造成的 三、解决方法 打开出现乱码页面选择编译器左上角的文件 > 以指定编码重新打开 选择U…

基于Spring Boot的大学校园生活信息平台的设计与实现pf

TOC springboot523基于Spring Boot的大学校园生活信息平台的设计与实现pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关…

在 C++ 中实现自定义异常类

在 C 中实现自定义异常类 作为一名 C 程序员&#xff0c;你可能会遇到需要自定义异常类的情况。自定义异常类可以让你更好地控制异常处理&#xff0c;并且可以使你的代码更加易读和易维护。在这篇博文中&#xff0c;我们将学习如何在 C 中实现自定义异常类。 为什么要自定义异…

使用 `<springProperty>` 在 Logback 配置中引用 Spring 应用程序属性

在 Spring Boot 应用程序中&#xff0c;日志配置通常是一个至关重要的任务。使用 Logback 作为日志框架时&#xff0c;能够动态地引用 Spring 应用程序中的属性值是非常有用的。这不仅使日志配置更加灵活&#xff0c;还能确保日志格式与应用程序配置保持一致。本文将介绍 Logba…

使用亮数据爬虫工具解锁复杂爬虫场景

在当今数据驱动型时代&#xff0c;数据采集和分析能力算是个人和企业的核心竞争力。然而&#xff0c;手动采集数据耗时费力且效率低下&#xff0c;而且容易被网站封禁。 我之前使用过一个爬虫工具&#xff0c;亮数据&#xff08;Bright Data&#xff09; &#xff0c;是一款低…

生产环境中MapReduce的最佳实践

目录 MapReduce跑的慢的原因 MapReduce常用调优参数 1. MapTask相关参数 2. ReduceTask相关参数 3. 总体调优参数 4. 其他重要参数 调优策略 MapReduce数据倾斜问题 1. 数据预处理 2. 自定义Partitioner 3. 调整Reduce任务数 4. 小文件问题处理 5. 二次排序 6. 使用…