• PaddleOCR学习笔记2-初步识别服务


    今天初步实现了网页,上传图片,识别显示结果到页面的服务。后续再完善。

    采用flask + paddleocr+ bootstrap快速搭建OCR识别服务。

    代码结构如下:

    模板页面代码文件如下:

    upload.html :

    1. <!DOCTYPE html>
    2. <html>
    3. <meta charset="utf-8">
    4. <head>
    5. <title>PandaCodeOCR</title>
    6. <!--静态加载 样式-->
    7. <link rel="stylesheet" href={{ url_for('static',filename='bootstrap3/css/bootstrap.min.css') }}></link>
    8. <style>
    9. body {
    10. font-family: Arial, sans-serif;
    11. margin: 0;
    12. padding: 0;
    13. }
    14. .header {
    15. background-color: #f0f0f0;
    16. text-align: center;
    17. padding: 20px;
    18. }
    19. .title {
    20. font-size: 32px;
    21. margin-bottom: 10px;
    22. }
    23. .menu {
    24. list-style-type: none;
    25. margin: 0;
    26. padding: 0;
    27. overflow: hidden;
    28. background-color: #FFDEAD;
    29. border: 2px solid #DCDCDC;
    30. }
    31. .menu li {
    32. float: left;
    33. font-size: 24px;
    34. }
    35. .menu li a {
    36. display: block;
    37. color: #333;
    38. text-align: center;
    39. padding: 14px 16px;
    40. text-decoration: none;
    41. }
    42. .menu li a:hover {
    43. background-color: #ddd;
    44. }
    45. .content {
    46. padding: 20px;
    47. border: 2px solid blue;
    48. }
    49. </style>
    50. </head>
    51. <body>
    52. <div class="header">
    53. <div class="title">PandaCodeOCR</div>
    54. </div>
    55. <ul class="menu">
    56. <li><a href="http://localhost:5000/uploader">通用文本识别</a></li>
    57. </ul>
    58. <div class="content">
    59. <!--上传图片文件-->
    60. <div id="upload_file">
    61. <form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data">
    62. <div class="form-group">
    63. <input type="file" class="form-control" id="upload_file" name="upload_file" placeholder="upload_file">
    64. </div>
    65. <div class="form-group">
    66. <button type="submit" class="form-control btn-primary">上传图片文件</button>
    67. </div>
    68. </form>
    69. </div>
    70. </div>
    71. </body>
    72. </html>

    result.html :

    1. html>
    2. <html>
    3. <meta charset="utf-8">
    4. <head>
    5. <title>结果title>
    6. <link rel="stylesheet" href={{ url_for('static',filename='bootstrap3/css/bootstrap.min.css') }}>link>
    7. <style>
    8. body {
    9. font-family: Arial, sans-serif;
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .header {
    14. background-color: #f0f0f0;
    15. text-align: center;
    16. padding: 20px;
    17. }
    18. .title {
    19. font-size: 32px;
    20. margin-bottom: 10px;
    21. }
    22. .menu {
    23. list-style-type: none;
    24. margin: 0;
    25. padding: 0;
    26. overflow: hidden;
    27. background-color: #FFDEAD;
    28. border: 2px solid #DCDCDC;
    29. }
    30. .menu li {
    31. float: left;
    32. font-size: 24px;
    33. }
    34. .menu li a {
    35. display: block;
    36. color: #333;
    37. text-align: center;
    38. padding: 14px 16px;
    39. text-decoration: none;
    40. }
    41. .menu li a:hover {
    42. background-color: #ddd;
    43. }
    44. style>
    45. head>
    46. <body>
    47. <div class="header">
    48. <div class="title">PandaCodeOCRdiv>
    49. div>
    50. <ul class="menu">
    51. <li><a href="http://localhost:5000/uploader">通用文本识别a>li>
    52. ul>
    53. <div class="row">
    54. <div class="col-md-6" style="border: 2px solid #ddd;">
    55. <span class="label label-info">上传图片span>
    56. <img src="{{ url_for('static', filename = result_dict['filename'])}}" alt="show_img" class="img-responsive">
    57. div>
    58. <div class="col-md-6" style="border: 2px solid #ddd;">
    59. <span class="label label-info">识别结果:span>
    60. {% for line_str in result_dict['result'] %}
    61. <p class="text-left">{{ line_str['text'] }}p>
    62. {% endfor %}
    63. div>
    64. div>
    65. body>
    66. html>
    67. <script src={{ url_for('static',filename='jquery1.3.3/jquery.min.js')}}>script>

     主要视图代码文件如下:

    views.py :
    1. import json
    2. import os
    3. import time
    4. from . import blue_task
    5. from flask import Flask, render_template, request
    6. from paddleocr import PaddleOCR
    7. from PIL import Image,ImageDraw
    8. import numpy as np
    9. '''
    10. 自定义模型测试ocr方法
    11. '''
    12. def test_model_ocr(img):
    13. # 返回字典结果对象
    14. result_dict = {'result': []}
    15. # paddleocr 目前支持的多语言语种可以通过修改lang参数进行切换
    16. # 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
    17. # 使用CPU预加载,不用GPU
    18. # 模型路径下必须包含model和params文件,目前开源的v3版本模型 已经是识别率很高的了
    19. # 还要更好的就要自己训练模型了。
    20. ocr = PaddleOCR(det_model_dir='./inference/ch_PP-OCRv3_det_infer/',
    21. rec_model_dir='./inference/ch_PP-OCRv3_rec_infer/',
    22. cls_model_dir='./inference/ch_ppocr_mobile_v2.0_cls_infer/',
    23. use_angle_cls=True, lang="ch", use_gpu=False)
    24. # 识别图片文件
    25. result0 = ocr.ocr(img, cls=True)
    26. result = result0[0]
    27. for index in range(len(result)):
    28. line = result[index]
    29. tmp_dict = {}
    30. points = line[0]
    31. text = line[1][0]
    32. score = line[1][1]
    33. tmp_dict['points'] = points
    34. tmp_dict['text'] = text
    35. tmp_dict['score'] = score
    36. result_dict['result'].append(tmp_dict)
    37. return result_dict
    38. # 转换图片
    39. def convert_image(image, threshold=None):
    40. # 阈值 控制二值化程度,不能超过256,[200, 256]
    41. # 适当调大阈值,可以提高文本识别率,经过测试有效。
    42. if threshold is None:
    43. threshold = 200
    44. print('threshold : ', threshold)
    45. # 首先进行图片灰度处理
    46. image = image.convert("L")
    47. pixels = image.load()
    48. # 在进行二值化
    49. for x in range(image.width):
    50. for y in range(image.height):
    51. if pixels[x, y] > threshold:
    52. pixels[x, y] = 255
    53. else:
    54. pixels[x, y] = 0
    55. return image
    56. @blue_task.route('/upload')
    57. def upload_file():
    58. return render_template('upload.html')
    59. @blue_task.route('/uploader', methods=['GET', 'POST'])
    60. def uploader():
    61. if request.method == 'POST':
    62. #每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。
    63. filedata = request.files['upload_file']
    64. upload_filename = filedata.filename
    65. print(upload_filename)
    66. #保存文件到指定路径
    67. #目标文件的名称可以是硬编码的,也可以从 ​request.files[file] ​对象的​ filename ​属性中获取。
    68. #但是,建议使用 ​secure_filename()​ 函数获取它的安全版本
    69. img_path = os.path.join('upload/', upload_filename)
    70. filedata.save(img_path)
    71. print('file uploaded successfully')
    72. start = time.time()
    73. print('=======开始OCR识别======')
    74. # 打开图片
    75. img1 = Image.open(img_path)
    76. # 转换图片, 识别图片文本
    77. # print('转换图片,阈值=220时,再转换为ndarray数组, 识别图片文本')
    78. # 转换图片
    79. img2 = convert_image(img1, 220)
    80. # Image图像转换为ndarray数组
    81. img_2 = np.array(img2)
    82. # 识别图片
    83. result_dict = test_model_ocr(img_2)
    84. # 识别时间
    85. end = time.time()
    86. recognize_time = int((end - start) * 1000)
    87. result_dict["filename"] = img_path
    88. result_dict["recognize_time"] = str(recognize_time)
    89. result_dict["error_code"] = "000000"
    90. result_dict["error_msg"] = "识别成功"
    91. # return json.dumps(result_dict, ensure_ascii=False), {'Content-Type': 'application/json'}
    92. # render_template方法:渲染模板
    93. # 参数1: 模板名称 参数n: 传到模板里的数据
    94. return render_template('result.html', result_dict=result_dict)
    95. else:
    96. return render_template('upload.html')

    启动flask应用,测试结果如下:

  • 相关阅读:
    Spring5学习笔记01--BeanFactory 与 ApplicationContext
    2022-06-26 数据结构-数组、链表、栈、队列
    如何开发一个人脸识别,人脸识别系统,人脸识别考勤系统毕业设计毕设作品
    ABB眼中AI推动机器人创新的三大方向
    “人间烟火”背后,长沙招商引资再出圈
    存储过程与函数(MySQL)
    Threejs之射线拾取模型
    Matlab:Matlab编程语言学习之向量化编程的简介、技巧总结案例应用之详细攻略
    金仓数据库 KingbaseGIS 使用手册(8.9. 栅格波段统计和分析函数、8.10. 栅格输出)
    【Spring-3.4】解析配置类,标注import注解
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/132754176