开源的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 CnOcr

img_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 PaddleOCR

if __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 PaddleOCR

def 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)
    # 添加padding
    padded_image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
    return padded_image

if __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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/476448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot+Vue的在线考试系统

项目介绍 这是一个在线考试系统,使用Maven进行项目管理,基于springbootmybatis框架开发的项目,mysql底层数据库,前端采用VueElementPlus,作为初学springbootvue前后端分离架构的同学是一个很不错的项目,如…

软件工程-第5章 结构化设计

5.1 总体设计的目标及其表示方法 5.2 总体设计 变换设计基本步骤: 第1步:设计准备--复审并精华系统模型; 第2步:确定输入、变换、输出这三部分之间的边界; 第3步:第一级分解--系统模块结构图顶层和第一层…

大模型来了,你的“存力”攒够了吗?

作者 | 曾响铃 文 | 响铃说 提到AI、大模型,很多人脑海里最先想到的是算力、算法、数据这“三驾马车”。 而要论谁最重要,恐怕多数人都会觉得是算力。 毕竟,“算力紧缺”的气氛常常被渲染起来。 然而,随着大模型进一步演进&a…

MySQL 字段定义时的属性设置

开发的时候第一步就是建表,在创建表的时候,我们需要定义表的字段,每个字段都有一些属性,比如说是否为空,是否允许有默认值,是不是逐渐等。 这些约束字段的属性,可以让字段的值更符合我们的预期&…

什么是代理IP?TikTok运营需要知道的IP知识

对于运营TikTok的从业者来说,IP的重要性自然不言而喻。 在其他条件都正常的情况下,拥有一个稳定,纯净的IP,你的视频起始播放量很可能比别人高出不少,而劣质的IP轻则会限流,重则会封号。那么,如何…

ThreaTrace复现记录

1. 环境配置 服务器环境 需要10.2的cuda版本 conda环境 包的版本: python 3.6.13 pytorch 1.9.1 torch-cluster 1.5.9 torch-scatter 2.0.9 torch-sparse 0.6.12 torch-spline-conv 1.2.1 torch-geometric 1.4.3 环境bug 这里环境搭建好以后,就可以正…

有哪些工具可以替代Gitbook?这篇文章告诉你

你是否曾经在搜索在线文档创建和共享工具时,遇到了Gitbook? Gitbook 是一个相当出色的工具,具有强大的编辑和发布功能,但也有其不足之处,如使用起来有一定的技术要求,入门门槛较高等。如果你正在寻找Gitbook的替代品&…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1(入口手机)8(电脑、VR、手环、iPad、智慧屏、)–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异,是一个兼容N种的超级终端harmonyOS干了两件事: (1&a…

HarmonyOS ArkTS 基础组件

目录 一、常用组件 二、文本显示(Text/Span) 2.1 创建文本 2.2 属性 2.3 添加子组件(Span) 2.4 添加事件 三、按钮(Button) 3.1 创建按钮 3.2 设置按钮类型 3.3 悬浮按钮 四、文本输入(TextInput/TextArea)…

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行,每行包含 m 个字符,代表残缺纸张。 保证: 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…

SSTI漏洞详解

目录 前备知识 模块引擎: 模块渲染函数: 继承关系: SSTI漏洞简介 SSTI漏洞成因 SSTI漏洞原理 一些常见模块介绍 php Twig模块引擎 代码演示1 Twig模块引擎代码演示2 python flask模块 代码演示1: python jinja模块 代…

读取pdf文件转为txt文件,使用正则表达式删除页码

通过下述链接中的代码python 读取pdf中的文本,读取pdf的文字到txt文本中。 txt文本中,包含pdf的页码信息,使用如下代码删除pdf的页码 下述是包含页码信息的一段文本,在其中给出了4中不同格式的页码信息。 text ""&qu…

day2 nestjs应用初始化及调试

Java转Ts全栈的学习记录 基础知识 Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。(对标springboot)ES ECMAScript 规范,约束js用的语法规范吧,比如const let这类语法就可以用了Eslint与Prettier美化代…

高可用、逻辑保护、容灾、多活、妥协、流程

可用性三叉戟: 本地高可用性:消除单点故障,确保链路所有环节系统高可用 本地是指:针对生产中心的内部故障 故障类型:服务器、硬盘、适配器卡、网络 特点:快速恢复、自动的接管、实施简单 RPO-0 业务逻辑保护…

Python基础学习笔记(一)

Python简介 Python 语言是一种跨平台、开源、免费、解释型、面向对象、动态数据类型的高级程序设计语言。早期版本的 Python 被称作是 Python1;Python2 最后一个版本是 2.7;Python3 是目前最活跃的版 本,基本上新开发的 Python 代码都会支持…

【网络原理】详解HTTPS协议加密过程

文章目录 🌴HTTPS协议是什么?🎄运营商劫持事件🌲HTTPS的工作过程🌸对称加密🌸非对称加密🌸引入证书🌸完整流程 🌳HTTPS加密总结⭕总结 🌴HTTPS协议是什么&…

用户行为分析是什么?为什么我们需要 bitmap?

本文非常好:https://blog.bcmeng.com/post/doris-bitmap.html meta搜也非常好:https://metaso.cn/ 用户行为分析是什么?简单说,就是围绕全体用户,做各种分析。用户就是一个个的 id。id 在不同方面有各种行为记录&…

日志集中审计系列(2)--- LogAuditor接收ASG设备日志

日志集中审计系列(2)--- LogAuditor接收ASG设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

使用参数创建动态报表

动态报表是开发人员可以根据用户规范更改数据的报表。 可以通过确定要在报表中要查看其数据的值来使用参数,报表会通过筛选数据来相应地进行更新。对于数据量非常大,影响Power BI 运行性能的,可以通过这个动态更改数据源筛选的方法。 通过创…

2024最全 Java 面试八股文

2024 年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套 1000道的 Java 面试手册我整理了整整 1 个月,上传到 Git 上目前 star 数达到了 30K 这套互联网 Jav…