可以提取图像文本的 5 大 Python 库

news2024/11/28 10:57:32

主要是了解并掌握文本定位和识别的OCR工具哦~

adebbe6106326062bb6ac5d829835f86.jpeg光学字符识别是一个古老但依然具有挑战性的问题,涉及从非结构化数据中(包括图像和PDF文档)检测和识别文本。它在银行、电子商务和社交媒体内容管理等领域具有广泛的应用。

但与数据科学中的每个主题一样,尝试学习如何解决OCR任务时存在大量的资源。这就是为什么我写下这篇教程,它可以帮助您入门。

在本文中,我将展示一些Python库,可以让您轻松从图像中提取文本,无需太多麻烦。这些库的说明后面附有一个实际示例。所使用的数据集均来自Kaggle。

目录:

  1. pytesseract

  2. EasyOCR

  3. Keras-OCR

  4. TrOCR

  5. docTR

1. pytesseract

它是最流行的Python库之一,用于光学字符识别。它使用Google的Tesseract-OCR引擎从图像中提取文本。支持多种语言。

如果想知道是否支持您的语言,请查看这个链接:https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html。您只需要几行代码将图像转换为文本:

# installation
!sudo apt install tesseract-ocr
!pip install pytesseract


import pytesseract
from pytesseract import Output
from PIL import Image
import cv2


img_path1 = '00b5b88720f35a22.jpg'
text = pytesseract.image_to_string(img_path1,lang='eng')
print(text)

输出:

03f44288be68166e3b4b3e2686dc2974.png我们还可以尝试获取图像中每个检测到的项目的边界框坐标。

# boxes around character
print(pytesseract.image_to_boxes(img_path1))

结果:

~ 532 48 880 50 0
...
A 158 220 171 232 0
F 160 220 187 232 0
I 178 220 192 232 0
L 193 220 203 232 0
M 204 220 220 232 0
B 228 220 239 232 0
Y 240 220 252 232 0
R 259 220 273 232 0
O 274 219 289 233 0
N 291 220 305 232 0
H 314 220 328 232 0
O 329 219 345 233 0
W 346 220 365 232 0
A 364 220 379 232 0
R 380 220 394 232 0
D 395 220 410 232 0
...

正如您所注意到的,它估算了每个字符的边界框,而不是每个单词!如果我们想提取每个单词的框,而不是字符,那么应该使用image_to_data的另一种方法,而不是image_to_boxes:

# boxes around words
print(pytesseract.image_to_data(img_path1))

c4457af0e3147490e6db61a3083063fe.png

这是返回的结果,并不是很完美。例如,它将“AFILM”解释为一个单词。此外,它没有检测和识别输入图像中的所有单词。

2. EasyOCR

轮到另一个开源Python库:EasyOCR。与pytesseract类似,它支持80多种语言。您可以通过网络演示快速而轻松地尝试它,无需编写任何代码。它使用CRAFT算法来检测文本并使用CRNN作为识别模型。此外,这些模型是使用Pytorch实现的。

6f1df674b4b00e87b6a20f3c3d43ae7a.png

如果在Google Colab上工作,建议您设置GPU,这有助于加快此框架的速度。以下是详细代码:

# installation
!pip install easyocr


import easyocr


reader = easyocr.Reader(['en'])
extract_info = reader.readtext(img_path1)


for el in extract_info:
   print(el)

db68c714c3308391a9c428a222d8fbbb.png

与pytesseract相比,结果要好得多。对于每个检测到的文本,我们还有边界框和置信度级别。

3. Keras-OCR

Keras-OCR是另一个专门用于光学字符识别的开源库。与EasyOCR一样,它使用CRAFT检测模型和CRNN识别模型来解决任务。与EasyOCR的不同之处在于,它使用Keras而不是Pytorch实现。Keras-OCR的唯一不足之处是它不支持非英语语言。

# installation
!pip install keras-ocr -q


import keras_ocr


pipeline = keras_ocr.pipeline.Pipeline()
extract_info = pipeline.recognize([img_path1])
print(extract_info[0][0])

这是提取的第一个单词的输出:

('from',
 array([[761.,  16.],
        [813.,  16.],
        [813.,  30.],
        [761.,  30.]], dtype=float32))

为了可视化所有结果,我们将输出转换为Pandas数据框:

diz_cols = {'word':[],'box':[]}
for el in extract_info[0]:
    diz_cols['word'].append(el[0])
    diz_cols['box'].append(el[1])
kerasocr_res = pd.DataFrame.from_dict(diz_cols)
kerasocr_res

517fb5ae276c0ddd485d9d0cf712026d.png

神奇的是,我们可以看到我们有更清晰和更精确的结果。

4. TrOCR

TrOCR是一种基于transformers的生成式图像模型,用于从图像中检测文本。它由编码器和解码器组成:TrOCR使用预训练的图像变换器作为编码器和预训练的文本变换器作为解码器。有关更多详细信息,请查看论文。Hugging Face平台上还有这个库的良好文档。首先,我们加载预训练模型:

# installation
!pip install transformers


from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image


model_version = "microsoft/trocr-base-printed"
processor = TrOCRProcessor.from_pretrained(model_version)
model = VisionEncoderDecoderModel.from_pretrained(model_version)

在传递图像之前,我们需要调整其大小并进行规范化。一旦图像已经转换,我们可以使用.generate()方法提取文本。

image = Image.open(img_path1).convert("RGB")
pixel_values = processor(image, return_tensors="pt").pixel_values
generated_ids = model.generate(pixel_values)
extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print('output: ',extract_text)
# output: 2.50

这与先前的库不同,它返回一个无意义的数字。为什么?TrOCR仅包含识别模型,而没有检测模型。要解决OCR任务,首先需要检测图像中的对象,然后提取输入中的文本。由于它只关注最后一步,它的性能不佳。要使其正常工作,最好使用边界框裁剪图像的特定部分,如下所示:

crp_image = image.crop((750, 3.4, 970, 33.94))
display(crp_image)

ea3bde8f01327fa5046885b19111ceb1.png

然后,我们尝试再次应用模型:

pixel_values = processor(crp_image, return_tensors="pt").pixel_values
generated_ids = model.generate(pixel_values)
extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(extract_text)

ea3e5155b817271ec88e1106e1af2b5b.png

此操作可以重复应用于图像中包含的每个单词/短语。

5. docTR

最后,我们涵盖了用于从文档中检测和识别文本的最后一个Python包:docTR。它可以将文档解释为PDF或图像,然后将其传递给两阶段方法。在docTR中,文本检测模型(DBNet或LinkNet)后跟文本识别的CRNN模型。由于使用了这两个深度学习框架,这个库要求安装Pytorch和Tensorflow。

! pip install python-doctr
# for TensorFlow
! pip install "python-doctr[tf]"
# for PyTorch
! pip install "python-doctr[torch]"

然后,我们导入使用docTR的相关库并加载模型,它是一个两步方法。实际上,我们需要指定文本检测和文本识别的DBNet和CRNN的模型,文本检测和文本识别的后端模型:

from doctr.io import DocumentFile
from doctr.models import ocr_predictor
model = ocr_predictor(det_arch = 'db_resnet50',
                      reco_arch = 'crnn_vgg16_bn',
                      pretrained = True
                     )

我们最终读取文件,使用预训练模型,并将输出导出为嵌套字典:

# read file
img = DocumentFile.from_images(img_path1)


# use pre-trained model
result = model(img)


# export the result as a nested dict
extract_info = result.export()

这是非常长的输出:

{'pages': [{'page_idx': 0, 'dimensions': (678, 1024), 'orientation': {'value': None, 'confidence': None},...

为更好地可视化,最好使用双重循环,仅获取我们感兴趣的信息:

for obj1 in extract_info['pages'][0]["blocks"]:
    for obj2 in obj1["lines"]:
        for obj3 in obj2["words"]:
            print("{}: {}".format(obj3["geometry"],obj3["value"]))

4d8418e718d909285d630f3601f65c19.png

docTR是从图像或PDF中提取有价值信息的另一个好选择。

结论

五个工具各有优点和缺点。当选择这些软件包之一时,首先考虑您正在分析的数据的语言。如果考虑到非英语语言,EasyOCR可能是最适合的选择,因为它具有更广泛的语言覆盖和更好的性能。免责声明:该数据集根据知识共享署名4.0国际许可(CC by 4.0)许可。

·  END  ·

HAPPY LIFE

1dc0163624fab613f118757581ee7231.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

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

相关文章

FreeRTOS中osDelay和HAL_Delay的区别

问题场景 在FreeRTOS中创建了线程A、线程B,其中线程A优先级大于线程B。线程A、B任务代码如下: void A(void *argument) {while (1){printf("A\r\n");HAL_Delay(1000);} }void B(void *argument) {while (1){printf("B\r\n");HAL_Delay(1000);} …

基于springboot实现校园疫情防控系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园疫情防控系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&am…

回溯法(1)--装载问题和0-1背包

一、回溯法 回溯法采用DFS+剪枝的方式,通过剪枝删掉不满足条件的树,提高本身作为穷举搜索的效率。 回溯法一般有子集树和排列树两种方式,下面的装载问题和01背包问题属于子集树的范畴。 解空间类型: 子集树&#xff1…

【C++项目】高并发内存池第七讲性能分析

目录 1.测试代码2.代码介绍3.运行结结果 1.测试代码 #include"ConcurrentAlloc.h" #include"ObjectPool.h" #include"Common.h" void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds) {std::vector<std::thread> vthread(…

超强Redis基础学习 优化 使用 常见问题

问题大纲 为什么Redis可以这么快&#xff1f; 它是纯内存操作&#xff0c;内存本身就很快 其次&#xff0c;它是单线程的&#xff0c;Redis服务器核心是基于非阻塞的IO多路复用机制&#xff0c;单线程避免了多线程的频繁上下文切换问题 Redis的持久化机制 Redis提供了持久化…

会声会影2024输出文件太大什么原因 会声会影输出文件处于保护状态什么原因

会声会影2024是一款专业的视频编辑软件&#xff0c;它由于简单易学的操作被众人所喜爱。在会声会影中编辑好的视频一般以渲染的形式导出保存&#xff0c;但是有时会出现输出文件太大的情况&#xff0c;这到底是什么原因呢&#xff1f;下面由我带大家一起来了解会声会影输出文件…

git本地搭建服务器[Vmware虚拟机访问window的git服务器]

先按照https://zhuanlan.zhihu.com/p/494988089说明下载好Gitblit然后复制到tomcat的webapps目录下,如下: 双击"startup.bat"启动tomcat: 然后访问"http://127.0.0.1:8080/gitblit/"即可看到git的界面: 说明git服务器已经能够成功运行了! Vmware虚拟机…

机器学习(五)如何理解机器学习三要素

1.8如何理解机器学习三要素 统计学习模型策略算法 模型&#xff1a;规律yaxb 策略&#xff1a;什么样的模型是好的模型&#xff1f;损失函数 算法&#xff1a;如何高效找到最优参数&#xff0c;模型中的参数a和b 1.8.1模型 机器学习中&#xff0c;首先要考虑学习什么样的…

5G 3GPP全球频谱介绍

所谓 “频谱”&#xff0c;是指特定类型的无线通信所在的射频范围。不同的无线技术使用不同的频谱&#xff0c;因此互不干扰。由于一项技术的频谱是有限的&#xff0c;因此频谱空间存在大量竞争&#xff0c;并且人们也在不断开发和增强全新的、高效率的频谱使用方式。 介绍5G …

ConcurrentHashMap 的 size()方法是线程安全的吗?为什么

ConcurrentHashMap 的 size()方法是非线程安全的。也就是说&#xff0c;当有线程调用 put 方法在添加元素的时候&#xff0c;其他线程在调用 size()方法获取的元素个数和实际存储元素个数是不一致的。原因是 size()方法是一个非同步方法&#xff0c;put()方法和 size()方法并没…

获取某个抖音用户的视频列表信息

思路 确定url确定并获取相关参数构造header发送请求解析数据输出数据 运行结果 代码 import requests # 获取某个用户的的视频信息&#xff0c;截至20231028&#xff0c;程序可以正常运行。 # 构造请求头header headers {User-Agent:..........................,Cookie:...…

10分钟了解JWT令牌 (JSON Web)

10分钟了解JSON Web令牌&#xff08;JWT&#xff09; JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案。今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。…

IOC课程整理-12 Spring 国际化

1. Spring 国际化使用场景 2. Spring 国际化接口 3. 层次性 MessageSource 4. Java 国际化标准实现 5. Java 文本格式化 6. MessageSource 开箱即用实现 7. MessageSource 內建依赖 8. 课外资料 9. 面试题精选 Spring 国际化接口有哪些&#xff1f; • 核心接口 - MessageSour…

Linux操作系统 - 从概念上认识进程

目录 前置知识 冯诺依曼和现代计算机结构 操作系统的理解 进程的概念 进程和PCB 查看进程信息的指令 - ps 进程的一些特性 进程标识符 - PID 进程状态 进程状态的概念 Linux下的进程状态 父子进程 子进程的创建 - fork 僵尸进程 孤儿进程 进程切换 CPU上下文切…

PLC案例集合

这里写自定义目录标题 按时断电一次性按钮震荡电路上升沿和下降沿红绿灯案例抢答器未完待续 下载程序时&#xff0c;必须将PLC处于停机状态&#xff08;STOP&#xff09; 重新下载程序后&#xff0c;M会保持上一次程序中的状态。 所以&#xff0c;程序开始前要对中继进行复位 …

Windows查看核心与线程数

文章目录 前言一、可视化界面1、任务管理器2、设备管理器3、CPU-Z 二、命令或程序1、cmd命令2、Java程序 前言 查询电脑硬件CPU信息命令的学习&#xff0c;予以记录&#xff01; 参考博客&#xff1a;https://blog.csdn.net/huazicomeon/article/details/53540852 一、可视化界…

【计算机网络笔记】Web缓存/代理服务器技术

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

echarts 按需加载处理

下载内容 npm install echarts --save按需封装组件 // 引入 echarts 核心模块&#xff0c;核心模块提供了 echarts 使用必须要的接口。 import * as echarts from echarts/core; import echarts/lib/component/legend// 引入柱状图图表&#xff0c;图表后缀都为 Chart // 引入…

HarmonyOS鸿蒙原生应用开发设计- 图标库

HarmonyOS设计文档中&#xff0c;为大家提供了独特的图标库&#xff0c;开发者可以根据需要直接引用。 图标库可以分为双色图标、填充图标、线性图标。具体分为 键盘、箭头、连接状态、媒体、人、设备、索引、通信、文件、物体与工具等。 整体分类 开发者直接使用官方提供的图标…

杂牌行车记录仪mp4恢复案例

行车记录仪是一种常见的视频采集设备&#xff0c;随着国内汽车市场的疯涨而普及&#xff0c;基本上每个车上都有&#xff0c;这一类记录仪有的是主机厂自带的&#xff08;如特斯拉&#xff09;&#xff0c;但更多的是第三方厂商生产的独立的记录仪。下面我们看一个小厂商的记录…