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

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

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



  • 如下图所示:

2.效果演示



  • 详情如下:

3.接口返回



  • 接口测试效果图

  • 返回结果详情部分示例
    1. {
    2.     "error_code": "000000",
    3.     "error_msg": "识别成功",
    4.     "filename": "cstp2.png",
    5.     "recognize_time": "5890",
    6.     "result": [
    7.         {
    8.             "points": [
    9.                 [
    10.                     14.0,
    11.                     11.0
    12.                 ],
    13.                 [
    14.                     108.0,
    15.                     11.0
    16.                 ],
    17.                 [
    18.                     108.0,
    19.                     40.0
    20.                 ],
    21.                 [
    22.                     14.0,
    23.                     40.0
    24.                 ]
    25.             ],
    26.             "score": 0.979973316192627,
    27.             "text": "性别:男"
    28.         },
    29.         {
    30.             "points": [
    31.                 [
    32.                     289.0,
    33.                     11.0
    34.                 ],
    35.                 [
    36.                     400.0,
    37.                     9.0
    38.                 ],
    39.                 [
    40.                     401.0,
    41.                     37.0
    42.                 ],
    43.                 [
    44.                     290.0,
    45.                     39.0
    46.                 ]
    47.             ],
    48.             "score": 0.8993546962738037,
    49.             "text": "住院号:"
    50.         },
    51.         {
    52.             "points": [
    53.                 [
    54.                     677.0,
    55.                     2.0
    56.                 ],
    57.                 [
    58.                     713.0,
    59.                     12.0
    60.                 ],
    61.                 [
    62.                     707.0,
    63.                     31.0
    64.                 ],
    65.                 [
    66.                     672.0,
    67.                     21.0
    68.                 ]
    69.             ],
    70.             "score": 0.6370271444320679,
    71.             "text": "贝别:"
    72.         }
    73.     ]
    74. }
    复制代码
4.代码详情

4.1 HTML代码详情



    1. <!DOCTYPE html>
    2. <html>
    3. <meta charset="utf-8">
    4. <head>
    5.     <title>OCR文字检测识别试运行系统</title>
    6.     <!--静态加载 样式-->
    7.     <link rel="stylesheet" href={{ url_for('static',filename='bootstrap-3.4.1/css/bootstrap.min.css') }}></link>
    8.     <link rel="stylesheet" href={{ url_for('static',filename='css/upload.css') }}></link>
    9.     <link rel="stylesheet" href={{ url_for('static',filename='css/36buttons.css') }}></link>
    10. </head>
    11. <body>
    12. <div class="header">
    13.     <div class="title">【OCR】PP-OCRv3 文字检测识别试运行系统v0.3.0</div>
    14. </div>
    15. <ul class="menu">
    16.     <li><a href="/upload/">通用文本检测识别处理</a></li>
    17. </ul>
    18. <div class="content">
    19.     <!--上传图片文件-->
    20.     <div id="upload_file">
    21.         <form id="fileForm" action="/upload/" method="POST" enctype="multipart/form-data">
    22.             <div class="form-group">
    23.                 <input type="file" class="form-control" id="_upload_file" name="upload_file">
    24. <!--                <label class="sr-only" for="upload_file">上传图片</label>-->
    25.                 </br>
    26.                 <button id="resetButton" name="resetButton" type="reset" class="button green">重置推理结果</button>
    27.             </div>
    28.         </form>
    29.     </div>
    30. </div>
    31. </div>
    32. <div id="show" style="display: none;">
    33.     <!--显示上传的图片-->
    34.     <div class="col-md-6" style="border: 2px solid #ddd;">
    35.         </br>
    36.         <span class="label label-info" style="font-size: 24px;"><<<<<< 原始图片展示 >>>>>> </br></span>
    37.         <!--静态加载 图片, url_for() 动态生成路径 -->
    38.         </br>
    39.         <img id="src_pic_show" src="" alt="Image preview area..." title="preview-img" class="img-responsive">
    40.     </div>
    41.     <div class="col-md-6" style="border: 2px solid #ddd;">
    42.         <!--显示识别结果JSON报文列表-->
    43.         </br>
    44.         <span class="label label-info" style="font-size: 24px;"><<<<<< 推理结果详情 >>>>>> </br></span>
    45.         </br>
    46.         <!-- 结果显示区 -->
    47.         <div id="result_show" style="font-size: 28px;">客官,您提交的任务加急推理中......</div>
    48.     </div>
    49. </div>
    50. </body>
    51. </html>
    52. <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    53. <script src="http://malsup.github.io/jquery.form.js"></script>
    54. <script type="text/javascript">
    55.     var fileInput = document.querySelector('input[type=file]');
    56.     var previewImg = document.querySelector('img');
    57.     {#上传图片事件#}
    58.     fileInput.addEventListener('change', function () {
    59.         var file = this.files;
    60.         var reader = new FileReader();
    61.         //显示预览界面
    62.         $("#show").css("display", "block");
    63.         // 监听reader对象的的onload事件,当图片加载完成时,把base64编码賦值给预览图片
    64.         reader.addEventListener("load", function () {
    65.             previewImg.src = reader.result;
    66.         }, false);
    67.         // 调用reader.readAsDataURL()方法,把图片转成base64
    68.         reader.readAsDataURL(file);
    69.         //初始化输出结果信息
    70.         $("#result_show").html("</br>客官,您提交的任务加急推理中......");
    71.         {#上传图片识别表单事件,并显示识别结果信息#}
    72.         {# ajaxSubmit 请求异步响应#}
    73.         $("#fileForm").ajaxSubmit(function (data) {
    74.             var inner = '<table border="1"> <thead> <tr> <th>序号</th> <th>文本目标</th> <th>置信度分数</th> </tr> </thead> <tbody>';
    75.             //循环输出返回结果,响应识别结果为每行列表
    76.             var inc = 1;
    77.             for (var i in data['result']) {
    78.                 var text = data['result'][i]['text'];
    79.                 var score = data['result'][i]['score'];
    80.                 inner += "<tr><td>" + inc + "</td>" + "<td>" + text + "</td>" + "<td>" + score + "</td></tr>";
    81.                 inc += 1;
    82.             }
    83.             inner += '</tbody></table>'
    84.             //清空输出结果信息
    85.             $("#result_show").html("");
    86.             //添加识别结果信息
    87.             $("#show").append( inner );
    88.         });
    89.     }, false);
    90.     document.getElementById('resetButton').addEventListener('click', function() {
    91.         document.getElementById('src_pic_show').src = '';
    92.         $('#result_show').empty();
    93.     });
    94. </script>
    复制代码
4.2Python代码详情



  • 源代码
    1. import json
    2. import os
    3. import time
    4. import numpy as np
    5. import pandas as pd
    6. from pyautogui import *
    7. from paddleocr import PaddleOCR
    8. from PIL import Image, ImageDraw
    9. from flask import Flask, render_template, request, jsonify
    10. # 应用名称,当前py名称,视图函数
    11. app = Flask(__name__)
    12. # 相对路径
    13. BASE_DIR = os.path.dirname(os.path.basename(__name__))
    14. # 上传文件路径
    15. UPLOAD_DIR = os.path.join(os.path.join(BASE_DIR, 'static'), 'upload')
    16. def ocr_img2text( image ):
    17.     result_dict = {'result': []}
    18.     paddleocr = PaddleOCR(det_model_dir='./inference/ch_PP-OCRv3_det_infer/',
    19.                     rec_model_dir='./inference/ch_PP-OCRv3_rec_infer/',
    20.                     cls_model_dir='./inference/ch_ppocr_mobile_v2.0_cls_infer/',
    21.                     use_angle_cls=True, lang="ch", use_gpu=True)
    22.     if image == "":
    23.         image = screenshot()  # 使用pyautogui进行截图操作
    24.         image = np.array(image)
    25.     else:
    26.         # 不为空就打开
    27.         image = Image.open(image).convert('RGB')
    28.         image = np.array(image)  # 经提醒,需要添加array
    29.     print( image, type(image) )
    30.     # 识别图片文件
    31.     result0 = paddleocr.ocr( image, cls=True )
    32.     result = result0[0]
    33.     # for line in result0:
    34.     #     for word in line:
    35.     #         print( word )
    36.     for index in range(len(result)):
    37.         line = result[index]
    38.         p_dict = {}
    39.         points = line[1]
    40.         text = line[1][0]
    41.         score = line[1][1]
    42.         p_dict['points'] = points
    43.         p_dict['text'] = text
    44.         p_dict['score'] = score
    45.         result_dict['result'].append( p_dict )
    46.     return result_dict
    47. @app.route('/')
    48. def upload_file():
    49.     return render_template('upload.html')
    50. @app.route('/upload/', methods=['GET', 'POST'])
    51. def upload():
    52.     if request.method == 'POST':
    53.         # 每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。
    54.         filedata = request.files['upload_file']
    55.         upload_filename = filedata.filename
    56.         print(upload_filename)
    57.         # 保存文件到指定路径
    58.         # 目标文件的名称可以是硬编码的,也可以从 ​request.files[file] ​对象的​ filename ​属性中获取。
    59.         # 但是,建议使用 ​secure_filename()​ 函数获取它的安全版本
    60.         if not os.path.exists(UPLOAD_DIR):
    61.             os.makedirs(UPLOAD_DIR)
    62.         img_path = os.path.join(UPLOAD_DIR, upload_filename)
    63.         filedata.save(img_path)
    64.         start = time.time()
    65.         # 打开图片
    66.         img1 = Image.open(img_path)
    67.         # 识别图片
    68.         result_dict = ocr_img2text(img_path)
    69.         # 识别时间
    70.         end = time.time()
    71.         recognize_time = int((end - start) * 1000)
    72.         result_dict["filename"] = upload_filename
    73.         result_dict["recognize_time"] = str(recognize_time)
    74.         result_dict["error_code"] = "000000"
    75.         result_dict["error_msg"] = "识别成功"
    76.         return jsonify(result_dict)
    77.     else:
    78.         return render_template('upload.html')
    复制代码
5.后续展望



  • 持续改进优化该部分代码,并完善文档。欢迎交换。。。
  • https://www.cnblogs.com/xh2023/p/17642994.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表