AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


一个简单的OCR识别引擎,但是很强大,支持80+的语言,Star 22.3K+!(本文附带一个简单的开发教程DEMO)
发布日期:2024-05-27 07:29:59 浏览次数: 1933 来源:有趣的开源集市


**点击上方蓝字 关注我**


OCR(Optical Character Recognition,光学字符识别)已经融入到我们日常生活和工作中,有可能你没感觉到,但是你一定用到过,比如常见的一些场景:

  • 文档数据存储:例如,将纸质书籍、报纸、杂志或其他文件转换为可编辑的文本格式,便于存储和搜索;

  • 自动数据录入:比如在报销发票、整理收据时。利用OCR技术,可以自动提取这些信息,提高处理速度;

  • 车牌识别:智能交通中的一个最常见应用,无论是停车场的自动收费系统,还是交通违法行的车牌设别等,都是采用了OCR车牌设别技术;

  • 身份验证:识别身份证、护照、驾照等证件上的文本信息来验证身份,比如很多银行APP添加银行卡时的号卡自动化设别,身份证自动设别验证等;

  • 物流和电商:最常见的就是菜鸟驿站的自助取件时扫描取货码,OCR可以读取快递上的标签信息。

  • 社交媒体:OCR可以用于识别照片中的文字标签等,比如电脑端的微信聊天发送的图标,微信自动提取文字的功能。

  • 文档比较和对比:OCR可以提取文档中的文本内容,并与其他文档或数据库中的信息进行比较和审计,以发现差异或潜在的问题。比如在测试工作中最常见的UI页面对比技术。


所以,作为一个IT人员,我们一定要对OCR的技术实现、原理等具备一定的了解和运用。目前市场上主流的开源OCR技术框架有以下几种:Tesseract (Tesseract-OCR)、OCRopus、EasyOCR,具体优缺点对比如下:


OCR技术框架 简介 优点 缺点
Tesseract 由Google开发的OCR引擎

1. 开源性:用户可以自由使用和修改,适应性强

2. 多平台支持:支持Windows、Linux、Mac等多种操作系统。

3. 多种语言支持:支持多种语言的识别,包括英语、中文等。

4. 深度学习支持:采用深度学习技术,提供较高的识别精度。

5. 丰富的API和工具:提供丰富的API接口和命令行工具,方便开发者集成和使用。

1. 识别准确性:虽然识别准确率较高,但在某些复杂场景下仍可能存在误识别。

2. 依赖图像质量:输入图像的质量对识别结果有很大影响,低质量的图像可能导致识别率下降。

3. 定制和优化需求:针对不同语言或特定字体,可能需要额外的定制和优化工作。

4. 学习曲线:对于不熟悉OCR技术的用户来说,可能需要一定的学习成本来掌握其使用方法。

OCRopus 一款基于Python的OCR引擎

1. 高识别准确性:结合多种先进技术,如神经网络、深度学习等,提供高识别准确性

2. 可扩展性:支持自定义训练数据和语言模型,可根据需求进行扩展和优化。

3. 模块化设计:采用模块化设计,各模块之间相对独立,方便进行二次开发和定制。

4. 多种语言支持:支持多种语言的OCR识别,满足多语言处理需求。

5. 基于Python:对于熟悉Python的用户来说,上手容易,易于集成到Python项目中。

1. 依赖外部库:可能需要安装额外的Python库或依赖项,增加了部署的复杂性。

2. 学习曲线:对于不熟悉OCR技术或Python语言的用户来说,可能需要一定的学习成本。

3. 性能:在处理大量图像或复杂场景时,性能可能受到一定限制。

4. 定制和优化需求:针对不同语言或特定场景,可能需要额外的定制和优化工作。

EasyOCR 款基于Python的OCR引擎

1. 易于使用:提供简单易用的API接口,使开发者能够轻松集成OCR功能

2. 多语言支持:支持多种语言的识别,包括中文、英文、日文、韩文等。

3. 高精度识别:使用深度学习技术进行文本识别,提供高精度识别的能力。

4. 多种输出格式:支持多种输出格式,如TXT、JSON、XML等,方便后续处理。

5. 批量处理:支持同时处理多个图像文件,提高处理效率。

1. 性能:在处理大量图像或复杂场景时,性能可能受到一定影响。

2. 依赖外部库:可能需要安装额外的Python库或依赖项。

3. 定制和优化需求:针对不同语言或特定字体,可能需要额外的定制和优化工作。

4. 学习曲线:对于不熟悉OCR技术的用户来说,能够快速的入门和使用

当然今天也不是来帮助大家选择的,还是那句话,合适自己的才是最好的。结合上述不同OCR框架的对比,为了快速入门和使用,本文选择EasyOCR进行介绍和说明。

01 
— 

 EasyOCR 介绍 

一句话介绍EasyOCR:一款基于Python的开源OCR引擎。支持80+种语言,包括中文、日语、韩语等,并且具有高效的识别速度和准确的识别结果,支持用户自定义设别模型,还提供了灵活的API接口,方便集成到第三方应用系统中。


?  项目信息

#github地址https://github.com/JaidedAI/EasyOCR#项目地址https://www.jaided.ai/#使用文档https://www.jaided.ai/easyocr/install/

?功能特性

  • 图像文本识别:EasyOCR能够将图像中的文本转换为可编辑的文本,支持多种语言,包括英文、中文、法文、德文等。它使用深度学习技术进行文本识别,具有高精度识别的能力,能够识别各种字体、字号和印刷质量的文本。

  • 验证码识别:EasyOCR特别针对CAPTCHA验证码图片进行了优化,能够识别并清理各种验证码和票据图片,提高了识别的准确性。

  • 票据识别:EasyOCR还针对票据等特定场景进行了优化,使其能够更准确地识别票据上的文本信息。

  • 图像清理:EasyOCR内置了图片清理功能,可以自动清理图像中的干扰元素,如噪点、背景色等,以提高文本识别的准确率。同时,它还支持多种预定义的图片清理模式,可以根据不同的场景进行灵活选择。

  • 本地化开发SDK集成:EasyOCR 提供了本地化的开发SDK集成,可以与C/S、B/S及Android移动端项目进行原生集成,方便开发者将OCR功能集成到自己的应用中。

02

 EasyOCR 安装和使用 

备注:需要具备Python和pip环境。本文环境信息:

#python and pip versionPython 3.10.12pip 22.0.2

一、安装EasyOCR

pip install easyocr# 如果发现安装较慢,可以添加阿里源pip install easyocr -i https://mirrors.aliyun.com/pypi/simple/# 安装过程如下none-manylinux1_x86_64.whl (731.7 MB)     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.7/731.7 MB 540.4 kB/s eta 0:00:00DEPRECATION: The HTML index page being used (https://mirrors.aliyun.com/pypi/simple/nvidia-cusparse-cu12/) is not a proper HTML 5 document. This is in violation of PEP 503 which requires these pages to be well-formed HTML 5 documents. Please reach out to the owners of this index page, and ask them to update this index page to a valid HTML 5 document. pip 22.2 will enforce this behaviour change. Discussion can be found at https://github.com/pypa/pip/issues/10825Collecting nvidia-cusparse-cu12==12.1.0.106  Downloading https://mirrors.aliyun.com/pypi/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 196.0/196.0 MB 1.5 MB/s eta 0:00:00DEPRECATION: The HTML index page being used (https://mirrors.aliyun.com/pypi/simple/nvidia-cuda-cupti-cu12/) is not a proper HTML 5 document. This is in violation of PEP 503 which requires these pages to be well-formed HTML 5 documents. Please reach out to the owners of this index page, and ask them to update this index page to a valid HTML 5 document. pip 22.2 will enforce this behaviour change. Discussion can be found at https://github.com/pypa/pip/issues/10825Collecting nvidia-cuda-cupti-cu12==12.1.105  Downloading https://mirrors.aliyun.com/pypi/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.1/14.1 MB 2.0 MB/s eta 0:00:00DEPRECATION: The HTML index page being used (https://mirrors.aliyun.com/pypi/simple/nvidia-curand-cu12/) is not a proper HTML 5 document. This is in violation of PEP 503 which requires these pages to be well-formed HTML 5 documents. Please reach out to the owners of this index page, and ask them to update this index page to a valid HTML 5 document. pip 22.2 will enforce this behaviour change. Discussion can be found at https://github.com/pypa/pip/issues/10825Collecting nvidia-curand-cu12==10.3.2.106  Downloading https://mirrors.aliyun.com/pypi/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861

二、验证是否安装完成

安装完成后,本地具备 EasyOCR命令

easyocr -husage: easyocr [-h] -l LANG [LANG ...] [--gpu {True,False}] [--model_storage_directory MODEL_STORAGE_DIRECTORY]               [--user_network_directory USER_NETWORK_DIRECTORY] [--recog_network RECOG_NETWORK] [--download_enabled {True,False}]               [--detector {True,False}] [--recognizer {True,False}] [--verbose {True,False}] [--quantize {True,False}] -f FILE               [--decoder {greedy,beamsearch,wordbeamsearch}] [--beamWidth BEAMWIDTH] [--batch_size BATCH_SIZE] [--workers WORKERS]               [--allowlist ALLOWLIST] [--blocklist BLOCKLIST] [--detail {0,1}] [--rotation_info ROTATION_INFO] [--paragraph {True,False}]               [--min_size MIN_SIZE] [--contrast_ths CONTRAST_THS] [--adjust_contrast ADJUST_CONTRAST] [--text_threshold TEXT_THRESHOLD]               [--low_text LOW_TEXT] [--link_threshold LINK_THRESHOLD] [--canvas_size CANVAS_SIZE] [--mag_ratio MAG_RATIO] [--slope_ths SLOPE_THS]               [--ycenter_ths YCENTER_THS] [--height_ths HEIGHT_THS] [--width_ths WIDTH_THS] [--y_ths Y_THS] [--x_ths X_THS] [--add_margin ADD_MARGIN]               [--output_format {standard,dict,json}]

三、Python中使用

# 导入easyocr库import easyocr# 创建一个Reader实例,并指定识别的语言列表。例如,识别简体中文和英文:reader = easyocr.Reader(['ch_sim', 'en'])# 读取和识别图像:result = reader.readtext('path_to_your_image.jpg')

注:reader = easyocr.Reader(['ch_sim','en'])用于将模型加载到内存中。需要联网下载模型,但只需运行一次,如果网络不好,可以按照以下说明,手动下载模型。

#模型下载地址https://www.jaided.ai/easyocr/modelhub/

首先下载文本检测模型:

下载识别模型,识别模型对应了各种语言包,下图是简体中文和英文的识别模型:

如果有其他语言设别需要,可以安装对应的语言包代码下载和加载:

# 语言模型对应的代码https://www.jaided.ai/easyocr/

下载的模型解压后,放入“~/.EasyOCR/model”文件夹中

ls /root/.EasyOCR/modelcraft_mlt_25k.pth english_g2.pth zh_sim_g2.pth 

结果输出

输出将采用列表格式,每个项目分别代表一个边界框、检测到的文本和置信度。

[([[189, 75], [469, 75], [469, 165], [189, 165]], '愚园路', 0.3754989504814148), ([[86, 80], [134, 80], [134, 128], [86, 128]], '西', 0.40452659130096436), ([[517, 81], [565, 81], [565, 123], [517, 123]], '东', 0.9989598989486694), ([[78, 126], [136, 126], [136, 156], [78, 156]], '315', 0.8125889301300049), ([[514, 126], [574, 126], [574, 156], [514, 156]], '309', 0.4971577227115631), ([[226, 170], [414, 170], [414, 220], [226, 220]], 'Yuyuan Rd.', 0.8261902332305908), ([[79, 173], [125, 173], [125, 213], [79, 213]], 'W', 0.9848111271858215), ([[529, 173], [569, 173], [569, 213], [529, 213]], 'E', 0.8405593633651733)]

可以设置 detail=0 更简单的输出。

reader.readtext('chinese.jpg', detail = 0)
结果:
['愚园路', '西', '东', '315', '309', 'Yuyuan Rd.', 'W', 'E']
命令行使用
$ easyocr -l ch_sim en -f chinese.jpg --detail=1 --gpu=True
03

 基于 EasyOCR 一个简单 DEMO 应用教程 

EasyOCR提供了强大的集成能力,提供API和SDK方便第三方应用快速集成和使用。

https://www.jaided.ai/easyocr/documentation/

本章节就是基于EasyOCR实现一个简单的OCR识别系统,包含以下两个能力:

  • 提供用户上传图片的功能,无需存储图片

  • 能够将用户上传图片采用easyocr进行设别,设别的结果直接在页面上展示

实现逻辑:用Flask作为后端服务来处理图片上传和OCR识别,并使用HTML和JavaScript在前端页面上提供上传和显示结果的功能。由于不需要存储图片,可以直接在服务器上读取上传的图片流,并使用EasyOCR进行识别。


1.首先,确保开发环境中安装了Flask和EasyOCR:

pip install Flask easyocr -i https://mirrors.aliyun.com/pypi/simple/

2.然后,编写Flask(一个使用 Python编写的轻量级Web应用程序开发框架)应用:

from flask import Flask, request, jsonify, render_template_string  import easyocr  import ioimport jsonfrom PIL import Image    app = Flask(__name__)    @app.route('/')  def index():      # 使用内联模板或重定向到HTML文件      return render_template_string('''      <!DOCTYPE html>      <html lang="en">      <head>          <meta charset="UTF-8">          <title>OCR Recognition</title>      </head>      <body>          <h1>OCR Recognition</h1>          <form method="post" action="/ocr" enctype="multipart/form-data">              <input type="file" name="file" required>              <input type="submit" value="Upload and Recognize">          </form>                    <div id="result" style="margin-top: 20px;"></div>                    <script>              document.querySelector('form').addEventListener('submit', function(e) {                  e.preventDefault();                  var fileInput = document.querySelector('input[type=file]');                  var formData = new FormData();                  formData.append('file', fileInput.files[0]);                                    var xhr = new XMLHttpRequest();                  xhr.open('POST', '/ocr', true);                  xhr.onreadystatechange = function () {                      if (xhr.readyState == 4 && xhr.status == 200) {                          var result = JSON.parse(xhr.responseText);                          document.getElementById('result').innerHTML = '<pre>' + JSON.stringify(result, null, 2) + '</pre>';                      }                  };                  xhr.send(formData);              });  </script>      </body>      </html>      ''')    @app.route('/ocr', methods=['POST'])  def ocr():      if 'file' not in request.files:          return jsonify({'error': 'No file part in the request'}), 400            file = request.files['file']      if not file.filename:          return jsonify({'error': 'No selected file'}), 400            # 使用io.BytesIO读取文件流      stream = io.BytesIO(file.read())      img = Image.open(stream)            # 使用EasyOCR进行OCR识别      reader = easyocr.Reader(['ch_sim', 'en'])  # 根据需要添加语言      result = reader.readtext(img,detail = 0)            # 返回识别结果    return json.dumps(result)  if __name__ == '__main__':      app.run(debug=True)


在上述脚本中,前端代码已经包含在后端Flask应用中,作为一个内联模板。这个模板包含了一个文件上传表单和一个用于显示结果元素。页面监听表单提交事件,并使用XMLHttpRequest发送文件到/ocr路由进行识别。识别结果会以JSON格式返回。


3.启动ocr_app应用

python3 ocr_app.py# 界面返回 * Serving Flask app 'ocr_app' * Debug mode: onWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 761-980-277

3.本地访问 http://127.0.0.1:5000 打开界面:

4.上传图片(网络上的一个测试身份证)进行,识别:

设别的效果:


04

 最后 

EasyOCR 支持多种编程语言和许多优点和特性。它提供了简洁的API接口,使得使用者只需几行代码就能实现复杂的OCR功能。其次,它在CPU和GPU上运行都表现优秀,即使在没有高性能硬件的情况下也能高效工作。总之,EasyOCR 是一款高效、易用、功能强大的OCR识别引擎(当然,如果需要更高精度的设别,还是需要经过特点场景的训练才行,比如上章节中图片设别就有错误),适用于各种需要文字识别和提取的场景。有兴趣的同学可以实践下,生命不息,学习不止!


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询