python 系列 07 - 基于easyocr的ocr识别

news/2024/5/5 5:11:14/文章来源:https://blog.csdn.net/momo1938/article/details/130535816

OCR,光学文字识别,对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。本示例通过easyocr库来演示。easyocr是一个比较流行的库,支持超过80种语言。安装的时候注意会附带安装torch库(一个深度学习框架,大小600多M)。目前还不支持最新版的python3.11.如果你是最新版的pyton。可以对python降级或者安装另一个版本的python。切换python版本详见文末。

1 安装库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple easyocr

2 中文识别示例

首先准备一张图片如图:

01.png

示例代码:

# 导入easyocr
import easyocr
# 创建reader对象,参数为要识别的目标语言的列表,ch_sim代表中文
# 如识别中英文混合,则参数可设置为['ch_sim','en']
reader = easyocr.Reader(['ch_sim']) 
# 读取图像
result = reader.readtext('01.png')print(result)

2.1 如果出现如下提示

Downloading detection model, please wait. This may take several minutes depending upon your network connection.
Progress: |███-----------------------------------------------| 6.9% Complete

表示需要下载语言模型和检测模型,如果你的网络很慢,或者链接中断,可以手动下载这些模型,模型地址:

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

下载检测模型:CRAFT,然后下载 zh_sim_g2(中文语言) 和 english_g2(英文语言)即可,如果你有其它语言需要识别也可下载其它语言。解压后的.pth文件放入/home/user/.EasyOCR/model目录下。

2.2 如果出现如下错误并退出

[W NNPACK.cpp:64] Could not initialize NNPACK! Reason: Unsupported hardware

说明的计算机不支持NNPACK所需的指令集。你可以安装easyocr的较低的版本如1.3.2等不使用这些指令集的版本。

2.3 如果出现其它错误

查看文末错误汇总,看有没有你碰到的。

2.4 识别结果

上面的demo识别结果:

[([[55, 18], [218, 18], [218, 54], [55, 54]], '数据源配置 @', 0.6604536146884444), ([[56, 112], [152, 112], [152, 142], [56, 142]], '接口配置:', 0.9232571757257206), ([[56, 154], [148, 154], [148, 180], [56, 180]], '接口地址:', 0.9036295025243269), ([[76, 200], [148, 200], [148, 228], [76, 228]], '用户名:', 0.9765614867210388), ([[94, 248], [146, 248], [146, 274], [94, 274]], '密码:', 0.8677780360538662), ([[56, 330], [152, 330], [152, 360], [56, 360]], '文件选择:', 0.9148985481070583), ([[56, 374], [150, 374], [150, 404], [56, 404]], '文件选择:', 0.928823627061566), ([[58, 462], [152, 462], [152, 490], [58, 490]], '页面缩放:', 0.9813329106982849), ([[56, 504], [148, 504], [148, 532], [56, 532]], '缩放比例:', 0.986201483892586), ([[160, 506], [324, 506], [324, 530], [160, 530]], '请输入0-1之间的小数', 0.3022109861905718), ([[204, 598], [276, 598], [276, 622], [204, 622]], '保存配置', 0.9112837910652161), ([[378, 598], [418, 598], [418, 622], [378, 622]], '退出', 0.9667384789164919)]

识别精度还不错,当然,根据你提供的图片分辨率,分辨率越高,而且干扰元素越少,正确率越高,但识别速度略慢,可能我的环境没有GPU,只能用CPU来执行。用GPU应该会更快一些。

下面对上面的输出结果简单说明:

以上数据是一个标定区域块的数组,数据内包含多个元组,每个元组是标定的每个区域块的数据。每个元组包含三个元素,第一个元组为标定的区域的座标,第二个元素为识别出的文字,第三个元素是识别概率。

下面通过简单的循环来把所有文本提取出来并写入txt:

# 导入easyocr
import easyocr
# 创建reader对象,参数为要识别的目标语言的列表,ch_sim代表中文
# 如识别中英文混合,则参数可设置为['ch_sim','en']
reader = easyocr.Reader(['ch_sim']) 
# 读取图像
result = reader.readtext('01.png')content = ''for area in result:text = area[1]content += text + '\n'f = open('01.txt','w')
f.write(content)
f.close()

写入结果:
02.png

3.中英文混合识别

3.1 准备图片

准备一张分辨率较低的图片:

03.jpg

3.2 进行识别

# 导入easyocr
import easyocr
# 创建reader对象,参数为要识别的目标语言的列表,ch_sim代表中文
# 如识别中英文混合,则参数可设置为['ch_sim','en']
reader = easyocr.Reader(['ch_sim','en']) 
# 读取图像
result = reader.readtext('03.jpg')print(result)

识别结果:

[([[254, 4], [328, 4], [328, 28], [254, 28]], '参考文献', 0.8226658701896667), ([[17, 57], [97, 57], [97, 73], [17, 73]], '[I]Lastrapes', 0.69268751703223), ([[157, 57], [275, 57], [275, 73], [157, 73]], 'Hleteroskedasticity', 0.5667352767424044), ([[305, 57], [343, 57], [343, 73], [305, 73]], 'Stock', 0.9890904862981488), ([[349, 57], [393, 57], [393, 71], [349, 71]], 'Return', 0.9465216417908011), ([[399, 57], [473, 57], [473, 71], [399, 71]], 'dnta: Volume', 0.4470853061822261), ([[479, 55], [523, 55], [523, 71], [479, 71]], 'Versus', 0.9191125950849435), ([[529, 57], [565, 57], [565, 71], [529, 71]], 'Garch', 0.9873791273496051), ([[17, 77], [65, 77], [65, 91], [17, 91]], 'Effects', 0.7349260169399585), ([[59, 73], [83, 73], [83, 93], [59, 93]], ';[]]', 0.8840106725692749), ([[93, 77], [217, 77], [217, 91], [93, 91]], 'Journal of Finance;', 0.4778455046237064), ([[221, 77], [279, 77], [279, 91], [221, 91]], '1998 (3:', 0.2858050027265414), ([[283, 77], [323, 77], [323, 91], [283, 91]], '21-24.', 0.4554373637279304), ([[17, 105], [139, 105], [139, 121], [17, 121]], '[2]nntulio N Bootio', 0.14424732812093452), ([[147, 103], [567, 103], [567, 121], [147, 121]], 'Federal Reserve Board Vonetary and Financial Varket Mnalysis Section', 0.43462905641690097), ([[23, 123], [49, 123], [49, 139], [23, 139]], '[4]。', 0.20602943003177643), ([[55, 123], [187, 123], [187, 139], [55, 139]], 'Academic Press; 2003', 0.7509114069902773), ([[201, 123], [249, 123], [249, 139], [201, 139]], '214-251', 0.5970671133900244), ([[15, 149], [171, 149], [171, 169], [15, 169]], '[3]黄达。货币银行学 [山]。', 0.12469001948068836), ([[181, 149], [305, 149], [305, 169], [181, 169]], '中围人民大学出版,', 0.3803464118912367), ([[313, 151], [349, 151], [349, 167], [313, 167]], '2000:', 0.9948236855370229), ([[353, 153], [375, 153], [375, 167], [353, 167]], '185', 0.9979106811742814), ([[15, 177], [77, 177], [77, 197], [15, 197]], '[4]张尚学', 0.9675273647448231), ([[85, 177], [285, 177], [285, 197], [85, 197]], '贷而银学 [4]。南开大学出版社。', 0.08337038842991375), ([[289, 179], [403, 179], [403, 197], [289, 197]], '2OOI 年笫一敞; 354', 0.15708182763479275), ([[15, 205], [427, 205], [427, 225], [15, 225]], '[5]大卫I弗里德曼。贷币与银行[4]。北京;  中圜计划出版社 2001: 234。', 0.18551760040425924), ([[15, 235], [77, 235], [77, 253], [15, 253]], '[6]郑迸平', 0.8119106360798195), ([[85, 233], [229, 233], [229, 253], [85, 253]], '龙玮娟。货币银行学原理', 0.2061057527270198), ([[235, 235], [263, 235], [263, 253], [235, 253]], '[w]。', 0.061789486557245255), ([[269, 237], [363, 237], [363, 253], [269, 253]], '2002 年版:  294.', 0.20901156631832898), ([[14, 258], [382, 258], [382, 285], [14, 285]], '[7]吕建藜。中圈汇率政策与贷币政笼的措配研究 [J]。符区经济', 0.00512204089347133), ([[395, 265], [495, 265], [495, 281], [395, 281]], '2008 (1):  59-61', 0.45054786903818533), ([[15, 291], [385, 291], [385, 311], [15, 311]], '[8]付俊文。赵  红。我圈窗口指导货币政策工具的理论与实践 [0', 0.031182130030847348), ([[399, 291], [511, 291], [511, 309], [399, 309]], '中央鼾经大学擘报,', 0.05041427001669892), ([[519, 293], [563, 293], [563, 309], [519, 309]], '2008 年', 0.2104904628177295), ([[23, 315], [49, 315], [49, 329], [23, 329]], '(9);', 0.4151167571544647), ([[53, 315], [89, 315], [89, 329], [53, 329]], '32-33', 0.9119664043023943), ([[16, 335], [292, 335], [292, 360], [16, 360]], '[9]曾雁。中央银行"窗口指导"机制研究 [叨', 0.08059719872422297), ([[303, 339], [387, 339], [387, 359], [303, 359]], '广西大学学报', 0.8053077108426586), ([[395, 341], [475, 341], [475, 357], [395, 357]], '2006(3)25.', 0.47657615675708886), ([[15, 367], [507, 367], [507, 387], [15, 387]], '[10]霍建军。刘 平。改进和捉盲 "窗口指导"  的建议 []。金触参考。2005{10)+115', 0.009912717726994289)]

对比会发现,多个字符识别错误。

3.3 将扫描的文本块在图片上做标记

将识别出的区块标记在图像上,以便与识别结果做对比。绘制图像库是opencv,pip库名:opencv-python

# 导入easyocr
import easyocr
import cv2reader = easyocr.Reader(['ch_sim','en'],gpu=False) 
result = reader.readtext('03.jpg')img = cv2.imread('03.jpg')for area in result:top_left = area[0][0]bottom_right = area[0][2]img = cv2.rectangle(img,top_left,bottom_right,(255,0,0),3)cv2.imshow('image',img)
cv2.waitKey(0)

标记结果:

06.png

4 一些简单的应用场景测试

4.1 对于图片验证码的识别

4.1.1 第一种,字符验证码

04.png

代码demo不再列出,同上,识别结果:

[([[38, 12], [88, 12], [88, 36], [38, 36]], '邮箱:', 0.67093855956966), ([[20, 96], [88, 96], [88, 120], [20, 120]], '验证码:', 0.9571285843849182), ([[98, 96], [248, 96], [248, 122], [98, 122]], '输入右边图片内容', 0.5983784957928567), ([[304, 96], [380, 96], [380, 126], [304, 126]], 'FgUV', 0.9349045753479004), ([[443, 111], [465, 111], [465, 131], [443, 131]], '张', 0.2765016087989949)]

现在这么清晰可见的验证码不多见了,即便如此,还是识别错了一个字符,带更多干扰码的验证码几乎无法识别。有兴趣可自己尝试。

4.1.2 需要计算的验证码

05.jpeg

[([[57, 37], [191, 37], [191, 81], [57, 81]], '输入用户', 0.9178350567817688), ([[57, 159], [193, 159], [193, 201], [57, 201]], '输入密码', 0.8854490518569946), ([[57, 279], [163, 279], [163, 319], [57, 319]], '验证码', 0.9951367245352766), ([[306, 264], [410, 264], [410, 336], [306, 336]], '24', 0.9999937622721186), ([[429, 273], [471, 273], [471, 325], [429, 325]], '8', 0.9997730383920498)]

可以发现,24和8识别出来了,减号由于干扰码存在,没有识别。

总结起来,就是对于验证码的识别,没有太大作用,示例图片都是还都是比较清晰的图片,识别结果不尽如人意。这也就是为什么现在很多网站费劲心思添加各种验证码和干扰码的原因。需求场景不大,不必强求。把它用做文档识别就好了。对于复杂场景的识别,如果你有条件的话,可以对easyocr的模型进一步的训练,以达到更好的识别某种信息的结果。

5 题外话:安装多个python版本及版本更换

由于pyenv难以安装,所以利用update-alternatives来切换版本.

5.1 安装多个版本python

安装另一个版本的python.利用系统命令即可,我当前版本是3.11,安装3.10:

sudo dnf install python3.10

5.2 查看python可选项

update-alternatives --display python

5.3 如果没有可选项就新建

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 2

5.4 再次查看版本

update-alternatives --display python

输出:

python - 状态为自动。链接当前指向 /usr/bin/python3.11
/usr/bin/python3.10 - 优先度 1
/usr/bin/python3.11 - 优先度 2
当前“最佳”版本是 /usr/bin/python3.11。

5.5 切换版本

sudo update-alternatives --config python 

输出:

共有 2 个提供“python”的程序。选项    命令
-----------------------------------------------1           /usr/bin/python3.10
*+ 2           /usr/bin/python3.11

选择1即可。

最后将python3.10 的pip 改名为pip3.10。这个pip文件多半在/home/user/.local/bin下面。如果不在,就whereis命令查找一下,安装easyocr的时候使用pip3.10。

pip3.10 install easyocr

6 错误汇总

AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' (most likely due to a circular import)

降低opencv-python的版本到4.5.5.64.用于适配easyocr1.3.2.

ImportError: cannot import name 'model_urls' from 'torchvision.models.vgg' (/home/eva/.local/lib/python3.10/site-packages/torchvision/models/vgg.py)

降低torchvision的版本到0.13.用于适配easyocr1.3.2.

以上错误基本是由easyocr降级之后版本不匹配造成的。如果你的机子配置比较高,而且使用了GPU。多半不会有以上问题。如果你降级easyocr到其它版本,请查看官网对应的opencv-python版本和torchvision版本。

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

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

相关文章

【Python】序列类型③-集合

文章目录 1.集合(set)简介2.集合的定义3.集合的遍历4.集合的常用方法 1.集合(set)简介 集合是一种无序可变的容器对象 集合最大的特点:同一个集合内元素是不允许有重复的,因此集合自带"去重"效果 2.集合的定义 集合的定义有两种方式: 使用{}进行定义,这种方式不能定…

获得 随机验证码(以图片为底层)

1:工具类 Slf4j public class RandomValidateCode {private static String baseNumLetter "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";private static String font "微软雅黑";//绘制验证码图片,返回验证码文本内容pu…

基于海鸥算法改进的随机森林分类算法-附代码

基于海鸥算法改进的随机森林分类算法 文章目录 基于海鸥算法改进的随机森林分类算法1.数据集2.RF模型3.基于海鸥算法优化的RF4.测试结果5.Matlab代码6.Python代码 摘要:为了提高随机森林数据的分类预测准确率,对随机森林中的树木个数和最小叶子点数参数利…

版本控制系统Git - 配置与基本使用

Git 1 Git简介1 Git概述2 Git的作用2.1 项目版本管理2.2 多人协同开发2.3 Git 的结构2.4 Git的工作原理 2 Git安装1 下载Git2 安装Git3 配置环境变量4 测试git是否安装成功5 安装git桌面工具(可以不安装) 3 Git基本操作1 设置Git用户2 新建仓库3 查看仓库状态4 添加到暂存文件5…

【python可视化】常用数据类型

🙋‍ 哈喽大家好,本次是python数据分析、挖掘与可视化专栏第二期 ⭐本期内容:常用数据类型 🏆系列专栏:Python数据分析、挖掘与可视化 👍欢迎大佬指正,一起学习,一起加油&#xff01…

C++入门3(C++新特性 using string auto)

C入门3 C新特性auto推导规则auto 作为函数的形参类型decltype基于范围for循环 typedef与usingC语言定义变量typedef 在C语言中的写法using在C11中的写法using与template的结合 string的简单使用 C新特性 auto推导规则 auto类型推导: auto定义的变量,可以根据初始化…

C语言单链表

本节目标: ①定义单链表结构体 ②初始化单链表 ③单链表增加结点(头插法、尾插法) ④删除指定结点 ⑤打印输出 目录 导入头文件 定义单链表结构体 初始化单链表 头插法 尾插法插入 删除指定结点 打印单链表 全部代码展示 导入头文件 …

中文大模型安全性哪家强?清华团队新发布

当前大型语言模型的火爆程度我们不用再进行赘述了,伴随着百度文心一言打响国内商业大模型第一枪,华为盘古,阿里通义千问,智谱ChatGLM,科大讯飞星火等国内公司纷纷开始布局。 另一方面由于众所周知的政策原因,和如火如荼…

5 分钟教你如何免费用上 GPT-4

今天要分享的就是普通用户,没有 OpenAI 账号,不需要写代码,你依然可以免费体验 GPT-4,当然,会有一些缺点,本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步:打开 Stea…

Threejs进阶之十三:CSS3DRenderer与Tween.js实现粒子小球按规律变化

今天我们使用CSS3DRendererTween.js实现Threejs官方示例中的粒子小球按规律变化的效果,先看下最终实现的效果 先来分析下,这个页面的动画效果是由512个小球组合起来的四种不同变化,分别是曲面、立方体、随机和圆球四种变化;下面我…

UDP的报文结构

UDP 报文结构 基本上所有的教科书上都是这样画的图, 但实际上 UDP 报文结构不是这样的, 这样显示应该是容易排版. 正确应该如下图 : 端口号 : 每个端口号在 UDP 报文里占两个字节, 取值范围就是: 0 ~ 65535 源 ip 和源端口描述了数据从哪里来, 目的 ip 和目的端口描述了数据去哪…

文本的清洗和标准化:如何处理混乱的数据?

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为:在原本的调度算法设计中,高优先级进程可以抢占低优先级的CPU资源,先执行高优先级任务。但是存…

x265码控分析

D和R的关系 高分辨率量化 均匀量化:量化区间 ‘ Δ k y k − y k − 1 ‘ \Delta_ky_k-y_{k-1} ‘Δk​yk​−yk−1​‘,近似为常数;p(x)为信源概率密度函数,且 ‘ Δ k ‘ \Delta_k ‘Δk​‘的大小相对于p(x)的变化率充分小&…

电力NLP:指令票规范识别

文章目录 任务目的想法讲解数据集介绍1电气主语2操作任务判断数据集3操作内容判断数据集4错误词数据集 解法讲解程序、数据集下载链接 任务目的 识别调度指令票(或者其它操作票)是否规范。 想法讲解 按石第2014—16号定值单投入石双西线161开关6区保护…

突发!ChatGPT王炸级更新!支持GPT-4联网 Code Interpreter!

4月30日,OpenAI官方悄悄发布了联网版GPT-3.5。虽然名字变了,但使用体验却是换汤不换药,还是那套。 然而,万万没想到的是,刚过去没几天,昨天5月4日,鱼哥发现自己的Plus账号竟然多了一些能力&…

树莓派硬件介绍及配件选择

目录 树莓派Datasheet下载地址: Raspberry 4B 外观图: 技术规格书: 性能介绍: 树莓派配件选用 电源的选用: 树莓派外壳选用: 内存卡/U盘选用 树莓派Datasheet下载地址: Raspberry Pi …

C++11多线程:std::thread创建线程和std::async创建异步任务的区别,std::async创建异步任务后没有被推迟执行。

系列文章目录 文章目录 系列文章目录前言一、thread和async的区别1.1 新线程和异步任务1.2 std::async和std::thread最明显的不同,就是async有时候并不创建新线程。1.3 std::async和std::thread的区别1.4 std::async不确定性问题的解决 二、使用方法2.1 std::async创…

JVM学习随笔02——虚拟机内存区组成与内存溢出异常

一、Java虚拟机内存区组成图 1、程序计数器: 每个线程独占一个计数器,用来指示该线程下一条要执行的指令的地址。这一部分不会导致内存异常。PS:如果一个线程进入的是一般的Java方法,计数器指示的是下一条指令地址;如果…

浅谈“孔乙己”的长衫

书中的孔乙己 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。 当代的“孔乙己” 如今社会,从小学开始每…