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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】SpringBoot框架开发不良邮件过滤系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统用户模块2.2 收件箱模块2.3 发件箱模块2.4 垃圾箱模块2.5 回收站模块2.6 邮箱过滤设置模块 三、实体类设计3.1 系统用户3.2 邮件3.3 其他实体 四、系统展示五、核心代码5.1 查询收件箱档案5.2 查询回收站档案5.3 新…

C语言 数组

文章目录 1.一维数组2.二维数组3.冒泡排序4.一维函数的数组名5.二维数组的数组名 1.一维数组 语法形式:type_t arr_name [const_n] 数组是一组相同类型元素的集合 type_t是指数组的元素类型 arr_name是指数组的名称 const_n是一个常量表达式,用来指定数…

mongoDB7.0.6版安装与使用(最新版踩坑记录)

这里写自定义目录标题 0.前言1.MongoDB下载与安装2.启动服务及验证3.命令行访问4.navicat访问5.停止服务 0.前言 本文总结了最近版mongoDB下载安装的过程及简单的应用,整个过程不涉及修改配置文件,甚至不用设置用户名密码也不用登录认证,在进…

HarmonyOS NEXT应用开发—投票动效实现案例

介绍 本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。 效果预览图 使用说明 加载完成后会有一个胶囊块被切割成两个等大的图形来作为投票的两个选项,中间由PK两字分隔开点击左边选项,两个图形会随着选择人数…

Java城管智慧执法管理系统源码带APP

目录 一、系统概述 二、系统开发环境 三、功能模块 四、应用价值 1、提升案件办理效率 2、提升监管效能 3、提升行政执法水平 4、推进行政执法创新 一、系统概述 智慧城管系统是一个基于现代信息技术手段的综合管理平台,旨在通过强化信息获取自动化、监督管…

官宣!眉州东坡终生认养大熊猫“星星”

2024年03月19日,眉州东坡终生认养大熊猫“星星”签约仪式暨第八届有机川熊猫竹笋节在北京和重庆同时举行。眉州东坡董事长王刚先生、重庆动物园副处长殷毓中先生等嘉宾在重庆共同出席了此次认养仪式,重庆动物园向眉州东坡授予大熊猫终生认养证书,宣布星星正式加入眉州东坡大家庭…

Game of Nodes 16进8

KNIME 还可以用成这样? 是不是有点过分了。 Tableau, PowerBI 同学请绕行,我们讨论的不是同一个东西... 由于 Game of Nodes 没有公开题目,且各个小组赛的题目也是不一样的,在这里我们只能通过拼接图来猜想小组赛题目了。 有的解决方案我甚至…

Android源码阅读 SharedPreferences - 1

目录 前言 正文 SharedPreferences.java PreferenceManager.java ContextImpl.java 前言 由于笔者目前水平限制,表达能力有限,尽请见谅。 SharedPreferences提供了一种轻量级的数据存储方式,允许保存和获取简单的键值对。它适用于保存少…

中霖教育:一级建造师和一级造价师通过率高吗?

在建筑工业领域,一级建造师和一级造价工程师考试都是比较热门的考试,每年参加的人数都非常多,如果只备考一个的话,2024年选择哪项考试更为合适? 一建和一造的平均通过率均未超过10%,两者难度相近: 1. 一…

力扣刷题---岛屿问题--c++

DFS:深度优先遍历:深度优先遍历是一种优先走到底、无路可走再回头的遍历方式 我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题…

源码部署LAMP架构

LAMP 文章目录 LAMP1. lamp简介2. web服务器工作流程2.1 cgi与fastcgi2.2 httpd与php结合的方式2.3 web工作流程 3. LAMP平台构建3.1 安装httpd3.2 安装mysql3.3 安装php3.4 验证 1. lamp简介 有了前面学习的知识的铺垫,今天可以来学习下第一个常用的web架构了。 …

【基于HTML5的网页设计及应用】——动态添加下拉菜单

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

什么是增强型SSL证书?购买一张需要多少钱?

增强型SSL证书是一种提供更高级别安全验证与用户信任度的网络安全工具,也被称为EV证书。相较于DV(域名验证)和OV(组织验证)证书,它通过严格的身份核实流程确保网站所有者的合法性和真实性。 首先&#xff0…

【C++】string 类---字符判断与大小写转换(超详细解析!)

目录 一、string 类的介绍 二、字符大小写转换与判断常用函数 💦 字符大小写判断 ① isalpha() ② isalnum() ③ isdigit() ④ islower() ⑤ isupper() 💦 字符大小写转换 ① tolower() ✨方法一: ✨方法二: ② toupper() ✨方…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图,对基表数据有影响3.修改了基表,对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称…

【springboot】@SpringBootApplication 加载原理解析

从何处放入 AutoConfigurationImportSelector.selectImports AbstractApplicationContext.refresh AbstractApplicationContext.invokeBeanFactoryPostProcessors PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 此处一个关键信息 只有BeanDefinition…

Html Open with Live Server 报错windows找不到文件

输入setting.json 填入你的浏览器路径 即可

【Qt】Qt代码格式化配置

这里记录一下个人使用的格式化配置: 个人使用的格式化工具Artistic Style格式化信息: --stylelinux #:Linux 风格格式和缩进 #--stylekr #indentspaces4 # 缩进采用4个空格 -A1 #使用AllMan程序风格,即大括号另起一行。 indent-switche…

java入门-变量与常量

java 基本语法-变量与常量 变量 变量的本质 程序中我们会经常看到类似 int x 3**;** 的表达式,x就是我们常说的变量,从计算机角度我们来看看变量x的本质是什么? 在程序开发中定义一个变量x, 计算机会在内存中开辟内存空间,计算…

测电笔与零火线

火线零线不分正负,因此即使接反电气仍可以使用,只是当开关断电的时候灯泡是有电的,此时比较危险容易触电。 火线和零线上的电流都是正弦波。简单的来讲,对于交流电路,电流一会从火线出发通过用电设备流向零线&#xff…