一文教你使用EasyOCR从图像中检测文本:实践指南
磐创AI什么是 OCR?
OCR 的前身是光学字符识别,它对当今的数字世界具有革命性意义。OCR 实际上是一个完整的过程,在此过程中,数字世界中存在的图像/文档被处理,文本被处理成普通的可编辑文本。
OCR的目的
OCR 是一种技术,可让你将不同类型的文档(例如扫描的纸质文档、PDF 文件或数码相机拍摄的图像)转换为可编辑和可搜索的数据。
EasyOCR 是什么?
EasyOCR 实际上是一个 Python 包,它将 PyTorch 作为后端处理程序。EasyOCR 像任何其他 OCR(Google 的 tesseract 或任何其他)一样检测图像中的文本,但我在使用它时,我发现它是从图像中检测文本的最直接的方法,而且它将 PyTorch 作为后端处理程序,准确性更可靠。EasyOCR 支持 42 多种语言进行检测。EasyOCR 是由 Jaided AI 公司创建的。
目录
安装核心依赖
导入库
读取图像
通过网址
本地
从图像中提取文本带
GPU
不带 GPU
英文文本
土耳其语文本和其他语言
在图像上绘制结果
示例 1
示例 2
处理多行文本
1.安装核心依赖
PyTorch将 PyTorch 作为完整包安装可能有点棘手,因此我建议你浏览PyTorch的官方网站。当你打开其官方网站时,你将在其界面中看到下图。
现在,如果你仔细查看上图,你会发现有许多选项可供我们选择,根据我们的选择获得最兼容的命令。让我向你展示我想提及的内容!
在上面的表示中,你可以注意到我选择了Package: pip和Compute platform: CPU,根据我的选择,我得到了命令 - pip install torchvision torchaudio。得到这个命令后,只需在你的命令提示符下运行这个命令,你的 PyTorch 库就会成功安装。EasyOCR成功安装PyTorch库后,很容易安装EasyOCR库,你只需要运行以下命令:pip3 install easyocr
然后你的命令提示符界面将如下所示:
2. 导入库import os
import easyocr
import cv2
from matplotlib import pyplot as plt
import numpy as np
3. 读取图像**拍摄在线图片:**这里我们将从URL 中获取图片(在线)IMAGE_PATH = 'https://blog.aspose.com/wp-content/uploads/sites/2/2020/05/Perform-OCR-using-C.jpg'
在上面的代码片段中,可以注意到IMAGE_PATH包含图像的URL。从本地获取图像:这里我们将从本地系统中获取图像。IMAGE_PATH = 'Perform-OCR.jpg'
在上面的代码片段中,可以注意到我从本地获取了图像。4. 从图像中提取文本英文文本检测reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
输出:[[[[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR']]
根据你的喜好添加图像。
让我们逐行分解代码:在这里,我们使用EasyOCR类中的Reader类,然后将 ['en']作为属性传递,这意味着现在它只会将图像的英文部分检测为文本,如果它找到其他语言,如中文和**日文,**则它会忽略那些文本。现在,在上面的行中,我们已经设置了语言的属性,这里我们在readText()函数中加载IMAGE_PATH并且会发现一个参数是**“段落”,这里它被设置为False**,这意味着现在easyOCR不会合并结果,即如果EasyOCR会遇到多个文本,它不会合并它们,而是将它们分开显示。以二维 NumPy 数组的形式获取结果**。**土耳其语文本检测# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
# Same code here just changing the attribute from ['en'] to ['zh']
reader = easyocr.Reader(['tr'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
输出:[[[[89, 7], [717, 7], [717, 108], [89, 108]],
'Most Common Texting Slang in Turkish'],
[[[392, 234], [446, 234], [446, 260], [392, 260]], 'test'],
[[[353, 263], [488, 263], [488, 308], [353, 308]], 'yazmak'],
[[[394, 380], [446, 380], [446, 410], [394, 410]], 'link'],
[[[351, 409], [489, 409], [489, 453], [351, 453]], 'ba?lant?'],
[[[373, 525], [469, 525], [469, 595], [373, 595]], 'tag etiket'],
[[[353, 674], [483, 674], [483, 748], [353, 748]], 'follov takip et']]
根据喜好,我正在添加我已完成此土耳其语文本检测的图像!
EasyOCR 目前**支持 42 种语言,**我提供了所有这些语言及其符号的集合。玩得开心吧伙计们!南非荷兰语 (af)、阿塞拜疆语 (az)、波斯尼亚语 (bs)、捷克语 (cs)、威尔士语 (cy)、丹麦语 (da)、德语 (de)、英语 (en)、西班牙语 (es)、爱沙尼亚语 (et)、法语 (fr)、爱尔兰语 (ga)、克罗地亚语 (hr)、匈牙利语 (hu)、印度尼西亚语 (id)、冰岛语 (is)、意大利语 (it)、日语 (ja)、韩语 (ko)、库尔德语 (ku)、拉丁语 (la)、立陶宛语 (lt)、拉脱维亚语 (lv)、毛利语 (mi)、马来语 (ms)、马耳他语 (mt)、荷兰语 (nl)、挪威语 (no)、波兰语 (pl)、葡萄牙语 (pt)、罗马尼亚语 (ro)、斯洛伐克语 (sk)、斯洛文尼亚语 (sl)、阿尔巴尼亚语 (sq)、瑞典语 (sv)、斯瓦希里语 (sw)、泰语 (th)、他加禄语 (tl)、土耳其语 (tr)、乌兹别克语 (uz)、越南语 (vi)、中文 (zh) –EasyOCR提供了足够的灵活性来选择使用或不使用 GPU 的文本检测**。**使用 GPU 从图像中提取文本# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH)
result
输出:[([[89, 7], [717, 7], [717, 75], [89, 75]],
'Most Common Texting Slang',
0.8411301022318493),
([[296, 60], [504, 60], [504, 108], [296, 108]],
'in Turkish',
0.9992136162168752),
([[392, 234], [446, 234], [446, 260], [392, 260]], 'text', 0.955612246445849),
([[353, 263], [488, 263], [488, 308], [353, 308]],
'yazmak',
0.8339281200424168),
([[394, 380], [446, 380], [446, 410], [394, 410]],
'link',
0.8571656346321106),
([[351, 409], [489, 409], [489, 453], [351, 453]],
'baglanti',
0.9827189297769966),
([[393, 525], [446, 525], [446, 562], [393, 562]], 'tag', 0.999996145772132),
([[373, 559], [469, 559], [469, 595], [373, 595]],
'etiket',
0.9999972515293261),
([[378, 674], [460, 674], [460, 704], [378, 704]],
'follow',
0.9879666041306504),
([[353, 703], [483, 703], [483, 748], [353, 748]],
'takip et',
0.9987622244733467)]
在没有 GPU 的情况下从图像中提取文本# Changing the image path
IMAGE_PATH = 'Perform-OCR.jpg'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
输出:[([[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR', 0.990493426051807)]
# Where 0.9904.. is the confidence level of detection
注意:如果你没有GPU并且没有将其设置为**False,**那么你将收到以下警告:
5.1. 单行文本的绘制结果 – 示例 1top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
在上面的代码片段中,我们正在尝试获取坐标以在我们必须执行检测的图像上绘制边界框和文本。在top_left变量中,我们以元组访问的形式从结果中获取左上角的坐标。同样,我们可以获取右下角的坐标。从二维数组格式获取文本的坐标从 cv2 包中选择文本字体为FONT_HERSHEY_SIMPLEX。img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,bottom_right, font, 0.5,(0,255,0),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
现在,我们已经获得了坐标,让我们绘制它们!使用**cv2 imread()**函数读取图像使用top_left和bottom_right坐标绘制矩形并给出下降颜色((0,255,0)) 和thickness(3)。使用top_left坐标在图像上绘制文本(矩形边界框正上方)显示图像输出:
5.2. 单行文本的绘制结果 – 示例 2IMAGE_PATH = 'sign.png'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
输出:[([[19, 181], [165, 181], [165, 201], [19, 201]],
'HEAD PROTECTION',
0.9778256296390029),
([[31, 201], [153, 201], [153, 219], [31, 219]],
'MUST BE WORN',
0.9719649866726915),
([[39, 219], [145, 219], [145, 237], [39, 237]],
'ON THIS SITE',
0.9683973478739152)]
获取坐标top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
绘制文本和边界框img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,top_left, font, 0.5,(0,0,255),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
输出:
坚持住!如果我们想查看图像本身中的所有文本检测怎么办?这就是我将在本节中做的事情!5.3. 处理多行文本的结果img = cv2.imread(IMAGE_PATH)
spacer = 100
for detection in result:
top_left = tuple(detection[0][0])
bottom_right = tuple(detection[0][2])
text = detection[1]
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,(20,spacer), font, 0.5,(0,255,0),2,cv2.LINE_AA)
spacer+=15
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
在上面的代码片段中,我们只需要关注以下几点:这里我们不是检测单行文本,而是遍历所有检测,因为我们想要绘制多行文本在cv2.putText上给出坐标时,我们使用了一个额外的变量,它是**“间隔”,这个间隔在代码后面会增加到+15**,这有助于限制文本相互碰撞。这个间隔变量将帮助文本保持排序和等距。输出:
模型的结论也结束了今天的讨论 。