光学字符识别入门教程

213 阅读4分钟

光学字符识别入门

光学字符识别是一种技术,页面上的每个字符都会被单独扫描,这样你的文本就会作为文本文件而不是图像上传。

EasyOCR是一个Python包,它可以让我们很容易地进行光学字符识别。我们将用它来从图像中提取文本。我们将能够使用OpenCV对这些结果进行可视化。

前提条件

要跟上这个教程,你需要。

  • 熟悉机器学习建模。
  • 使用Jupyter Notebook或Google Colab。

我们将在本教程中使用Google Colab。

安装和导入依赖项

我们需要安装的第一个依赖是PyTorch,因为EasyOCR是在PyTorch库之上运行的。要安装PyTorch,我们需要进入他们的主网站。选择你的偏好,然后就会生成一个安装代码。在我们的案例中,我们选择了Stable (1.10.1) PyTorch build,Linux OS,Pip package,Python language,和CUDA 10.2 compute platform。在选择了这些首选项后,将生成以下代码。

!pip3 install torch torchvision torchaudio

EasyOCR是我们需要安装的第二个依赖项。

pip install easyocr

我们现在已经安装了PyTorch和EasyOCR。我们需要做的下一件事是将我们的依赖项导入我们的笔记本。

import cv2
import easyocr
import numpy as np
from matplotlib import pyplot as plt

我们已经导入了四个东西。

  • EasyOCR 是我们将用来进行光学字符识别的主要软件包。
  • OpenCV作为cv2 。它将帮助我们导入我们的图像并将其可视化。
  • Matplotlib 也有助于可视化。
  • Numpy 以帮助进行数学计算。

我们现在需要读入我们的图像。 请自由使用你想要的任何图片。

读取我们的图像

from google.colab.patches import cv2_imshow

image = cv2.imread("image-one.jpg")
cv2_imshow(image)

现在我们的图像已经加载到我们的笔记本上,让我们使用EasyOCR来进行光学字符识别。

使用EasyOCR从我们的图像中提取文本

首先,我们需要传入easyocr 阅读器,并传入我们想要使用的语言。在我们的例子中,这将是英语。

其次,使用ocr_reader ,我们传入readtext 命令并传入我们的图像。我们将这些结果保存在一个叫做results 的变量中。

ocr_reader = easyocr.Reader(['en'])
results = ocr_reader.readtext(image)
results

结果。

([[121.756503204768, 455.2312153828863],
   [389.1020796120134, 432.6470713866934],
   [389.24349679523203, 524.7687846171136],
   [122.8979203879866, 547.3529286133066]],
  'GOOD',
  0.5394189953804016),
 ([[126.45506700720357, 542.3292546273735],
   [389.0906482289428, 511.83345289506786],
   [393.5449329927964, 599.6707453726265],
   [130.90935177105715, 630.1665471049322]],
  'NEWS',
  0.993106484413147),
 ([[190.6717988226486, 618.007698233973],
   [392.5179510077811, 588.6436857858664],
   [398.3282011773514, 642.992301766027],
   [196.48204899221892, 672.3563142141336]],
  'COMING',
  0.9999751310992928)]

在图像上应用EasyOCR后,我们可以看到它已经能够从图像中提取出具有良好可信度的文本。不同的值表示我们的文本在图像中的坐标。

使用OpenCV库实现结果的可视化

让我们首先定义几个关键的变量来确定我们不同的坐标位置。我们将使用OpenCV库来完成这项任务。

让我们来设置我们的坐标变量。

top_left = tuple(results[0][0][0])
bottom_right = tuple(results[0][0][2])
text = results[0][1]
font = cv2.FONT_HERSHEY_PLAIN

我们首先为我们的top_left 坐标定义了一个变量。我们把它转换成一个tuple ,因为当我们把它传给OpenCV时,它期待的是一个元组。我们对bottom_right 这个变量做了类似的事情。我们抓取该文本并将其放入一个称为text 的变量。我们还前进了一步,定义了我们要使用的OpenCV字体。

现在让我们去把它形象化。

img = cv2.imread("image-one.jpg")
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,top_left, font, 0.5,(255,255,255),2,cv2.LINE_AA)
plt.imshow(img)
plt.show()

Box

虽然很小,但我们可以看到在右上方的文字上已经画出了一个绿色的边界框。这就是光学字符识别的简况。目前,它只能够处理单行文字。如果我们有一张有多行文字的图片,会发生什么?

让我们试着让EasyOCR处理多行提取的文字。

处理多行文字

处理方法与之前的阅读器代码相同,改变的是我们如何去可视化它。我们需要通过循环来实现其他文本的可视化。

顺便提一下,由于我们现在要处理多个文本,所以处理的时间会长一点。

image = cv2.imread("image-one.jpg")
spacer = 100
for detection in results: 
    top_left_detection = tuple([int(val) for val in detection[0][0]])
    bottom_right_detection = tuple([int(val) for val in detection[0][2]])
    text = detection[1]
    image = cv2.rectangle(img,top_left_detection,bottom_right_detection,(0,255,0),3)
    image = cv2.putText(image,text,(20,spacer), font, 0.5,(0,255,0),2,cv2.LINE_AA)
    spacer+=15
    
plt.imshow(img)
plt.show()

结果。

Multiple lines

收尾工作

我们在本教程中做了很多事情。我们从安装和导入我们的依赖项开始,用EasyOCR阅读器读取我们的图像,用OpenCV画出我们的结果,最后看一下我们如何处理多行的不同检测。希望你觉得这个教程很有用。