当前位置: 首页 > news >正文

开源的OCR工具基本使用:PaddleOCR/Tesseract/CnOCR

前言

因项目需要,调研了一下目前市面上一些开源的OCR工具,支持本地部署,非调用API,主要有PaddleOCR/CnOCR/chinese_lite OCR/EasyOCR/Tesseract/chineseocr/mmocr这几款产品。
本文主要尝试了EasyOCR/CnOCR/Tesseract/PaddleOCR这四款产品。

EasyOCR

EasyOCR官方仓库:https://github.com/JaidedAI/EasyOCR
安装EasyOCR:

pip install easyocr

测试例程

import easyocr
reader = easyocr.Reader(['ch_sim','en']) # this needs to run only once to load the model into memory
result = reader.readtext('chinese.jpg')

实测EasyOCR对cuda的要求比较严格,在一个pytorch正常的环境中,运行之后会报错:

Could not load symbol cublasGetSmCountTarget from cublas64_11.dll. Error code 127

#833提到了该问题,谈及原因可能是cuda和cudnn不匹配,更换cudnn之后,报错仍未消失,遂暂置不提。

CnOCR

CnOCR官方仓库:https://github.com/breezedeus/CnOCR
CnOCR安装:

pip install cnocr

CnOCR的环境要求比较严格,其在requirements.txt写了非常多的依赖版本号,因此如果在现有环境中直接安装,它会将Pytorch等依赖卸载重装,比较坑,使用最好先单开新环境。

测试例程:

from cnocr import CnOcrimg_fp = 'img/output_2.png'
ocr = CnOcr()  # 所有参数都使用默认值
out = ocr.ocr(img_fp)
print(out)

实测在我的业务场景下,使用默认模型效果不太行。

Tesseract

Tesseract官方仓库:https://github.com/tesseract-ocr/tesseract
Tesseract是用C++进行开发的,因此如果要在python中进行使用,需要借助第三方依赖pytesseract

首先需要在本机上安装Tesseract
安装包下载地址:https://digi.bib.uni-mannheim.de/tesseract/
安装过程可参考:https://blog.csdn.net/weixin_51571728/article/details/120384909
配置完成后,在命令行输入tesseract -v打印出版本信息则表示安装成功。

在这里插入图片描述
之后安装pytesseract

pip install pytesseract

测试例程

img_path = 'img/img_1.png'
# 添加tesseract的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Users\zxy\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
"""
image_to_string():如果识别英文或数字可以不必额外参数,如果识别其他语言则需要加上lang参数
lang='chi_sim'表示要识别的是中文简体
没有识别出来时,返回空白
"""
text = pytesseract.image_to_string(Image.open(img_path), lang='chi_sim')
print(text)

实测这个效果在我的场景也表现一般,并且tesseract对于中英文有不同的模型,泛用性不是很好。

PaddleOCR

PaddleOCR是百度旗下的产品,目前已经迭代到第四版。
PaddleOCR官方仓库:https://github.com/PaddlePaddle/PaddleOCR
PaddleOCR安装:

pip install paddleocr

测试例程:

import cv2
from paddleocr import PaddleOCRif __name__ == '__main__':ocr = PaddleOCR(use_angle_cls=True, lang="ch", ocr_version='PP-OCRv4')image_input_fullname = 'img/output_5.png'img = cv2.imread(image_input_fullname)result = ocr.ocr(img, cls=True)print(result)

根据PP-OCRv4的介绍文档,PP-OCRv4在训练时以(32,320), (48,320), (64,320)三个不同尺度上进行训练。

在这里插入图片描述

实测发现当文字区域小于这个范围时,效果会受到影响,因此,可以引入padding策略,即在文字区域范围周边加一圈白边,使输入模型的图片分辨率提升。

import cv2
from paddleocr import PaddleOCRdef add_padding_to_image(image, output_size=(640, 640), color=(255, 255, 255)):h, w = image.shape[:2]# 计算需要添加的padding大小delta_w = max(output_size[0] - w, 0)delta_h = max(output_size[1] - h, 0)top, bottom = delta_h // 2, delta_h - (delta_h // 2)left, right = delta_w // 2, delta_w - (delta_w // 2)# 添加paddingpadded_image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)return padded_imageif __name__ == '__main__':ocr = PaddleOCR(use_angle_cls=True, lang="ch", ocr_version='PP-OCRv4')image_input_fullname = 'img/output_5.png'img = cv2.imread(image_input_fullname)padded_img = add_padding_to_image(img)result = ocr.ocr(img, cls=True)print(result)

在我的业务场景中,PaddleOCR的表现最好,基本能达到80%以上的识别准确率,如果还需要提升,还可以根据自己的数据再训练。

标注工具:PPOCRLabelv2
使用文档:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/PPOCRLabel/README_ch.md
训练文档:https://aistudio.baidu.com/modelsdetail/270?modelId=270

相关文章:

  • JavaScript 权威指南第七版(GPT 重译)(二)
  • 【Qt5】QVariant
  • 力扣Lc18--- 168. Excel表列名称(java版)-2024年3月19日
  • 如何使用 Elasticsearch 作为向量数据库
  • 代码审计与web安全-第四章作业
  • 链表oj测试题(上)
  • 【C语言】字符函数和字符串函数
  • SQL运维_Unix下MySQL-5.5.11配置文件示例
  • 面试算法-80-字符串相乘
  • oracle表备份及还原
  • python的BBS论坛系统flask-django-nodejs-php
  • 2024年全球生成人工智能全景图【中文】
  • Android 封装的工具类
  • 贪吃蛇(C语言超详细版)
  • 如何从零开始拆解uni-app开发的vue项目(一)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2017 年终总结 —— 在路上
  • CEF与代理
  • github指令
  • IP路由与转发
  • java8 Stream Pipelines 浅析
  • Javascript弹出层-初探
  • JavaScript类型识别
  • Java到底能干嘛?
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mac转Windows的拯救指南
  • MD5加密原理解析及OC版原理实现
  • Travix是如何部署应用程序到Kubernetes上的
  • 多线程事务回滚
  • 给github项目添加CI badge
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 简单数学运算程序(不定期更新)
  • 日剧·日综资源集合(建议收藏)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序:实现悬浮返回和分享按钮
  • hi-nginx-1.3.4编译安装
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)windows配置JDK环境
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (南京观海微电子)——COF介绍
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)LINQ之路
  • (转载)Linux 多线程条件变量同步
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Reactor简单使用教程
  • .net 生成二级域名
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C# 使用反射注册事件
  • .NET性能优化(文摘)
  • .net中生成excel后调整宽度
  • [Angularjs]ng-select和ng-options