Select Language

AI社区

数据要素产业

使用Google的Tesseract和OpenCV构建光学字符识别(OCR)系统

总览

光学字符识别(OCR)是计算机视觉领域中广泛使用的系统,了解如何为各种任务构建自己的OCR,我们将利用OpenCV库和Tesseract来构建OCR系统。

介绍你还记得考试期间我们必须填写正确答案的日子吗?或者你还记得在开始第一份工作之前进行的能力测验呢?我可以回忆起奥林匹克竞赛和多项选择测试,大学和组织会使用光学字符识别(OCR)系统对答卷进行大量评分。老实说,OCR在广泛的行业和功能中都有应用,因此从扫描文档(包括银行对帐单,收据,手写文档,优惠券等)到阅读自动驾驶汽车的路牌,都在OCR的范畴内。OCR系统在几十年前建造起来是非常昂贵和繁琐的,但随着计算机视觉和深度学习领域的进步意味着我们现在可以建立自己的OCR系统了!

但是,建立OCR系统并不是一件容易的事,对于初学者来说,面临着诸如图像中的字体不同,对比度差,图像中有多个对象等问题。因此,在本文中,我们将探讨OCR任务的一些非常著名且有效的方法,以及如何自己实施。如果你不熟悉目标检测和计算机视觉,建议你先阅读以下资源:基本目标检测算法的介绍https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introduction-to-the-basic-object-detection-algorithms-part-1计算机视觉课程https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2目录什么是光学字符识别(OCR)现实世界中流行的OCR应用使用Tesseract OCR进行文本识别文本检测的不同方法什么是光学字符识别(OCR)首先,让我们了解一下什么是OCR。OCR,或称光学字符识别是一种识别图像内文本并将其转换为电子形式的过程。这些图像可以是手写文字,文件,收据,名片等印刷文字,甚至是自然场景照片。OCR有两个部分,第一部分是文本检测,确定图像中的文本部分,文本在图像中的定位对于OCR的第二部分文本识别非常重要,其中文本是从图像中提取出来的。结合使用这些技术可以从任何图像中提取文本。

没有什么是完美的,OCR也不例外。但是,随着深度学习的到来,对这一问题有可能得到更好、更普遍的解决方案。在我们深入研究如何构建自己的OCR之前,让我们先看看OCR的一些流行应用程序。现实世界中流行的OCR应用OCR在各行各业有着广泛的应用(主要是为了减少人工操作)。它已经融入到我们的日常生活中,以至于我们几乎没有注意到它!但它肯定会努力带来更好的用户体验。

OCR常用于在手写识别任务中提取信息。该领域正在进行许多工作,也取得了一些非常重大的进步。Microsoft提出了一个很棒的数学应用程序,该应用程序以手写的数学方程式作为输入,生成解决方案,并逐步解释其工作原理。OCR越来越多地被各个行业用于数字化,以减少人工工作量。这使得从业务文档,收据,发票,护照等中提取和存储信息非常容易且高效,此外,当你为KYC(Know Your Customer,了解客户)上传文档时,OCR用于从这些文档中提取信息并存储它们以供将来参考。OCR还用于书籍扫描,它将原始图像转换为数字文本格式。许多大型项目,例如Gutenberg项目,Million Book Project和Google Books,都使用OCR扫描和数字化书籍并将作品存储为档案。银行业也越来越多地使用OCR来归档与客户相关的文书工作,例如入职资料,以轻松创建客户资料库,这显着减少了上线时间,从而改善了用户体验。此外,银行使用OCR从支票中提取诸如帐号,金额,支票号码之类的信息,以加快处理速度。

说到OCR的应用,就必须提及它们在自动驾驶汽车中的使用。自动驾驶汽车在很大程度上依赖OCR来阅读路标和交通标志,对这些标志的有效理解可以使自动驾驶汽车对行人和其他在道路上行驶的车辆保持安全。还有很多OCR应用,例如车牌识别,将扫描的文档转换为可编辑的Word文档等等。使用OCR进行数字化显然具有广泛的优势,例如易于存储和处理文本,更不用说可以应用到此数据的大量分析了!OCR绝对是计算机视觉最重要的领域之一。现在,让我们看看最著名的和广泛使用的文本识别技术之一——Tesseract。使用Tesseract OCR进行文本识别Tesseract:https://tesseract-ocr.github.io/tessdoc/documentation.htmlTesseract是一个开源的OCR引擎,最初是由HP(Hewlett-Packard)作为专有软件开发的,但后来在2005年被开源,从那时起,谷歌就采用了这个项目并赞助它的开发。


截至今天,Tesseract可以检测100多种语言,甚至可以处理从右到左的文本,例如阿拉伯语或希伯来语!难怪Google会将其用于移动设备,视频和Gmail的图像垃圾邮件检测算法中的文本检测。从版本4开始,Google对该OCR引擎进行了重大改进。Tesseract 4.0添加了新的OCR引擎,该引擎使用基于LSTM(长期短期记忆,https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/)  的神经网络系统,这是解决序列预测问题的最有效解决方案之一。尽管它以前使用模式匹配的OCR引擎仍可作为旧代码使用。将Tesseract下载(https://tesseract-ocr.github.io/tessdoc/Home.html) 到系统后,可以使用以下命令从命令行轻松运行它(https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html):tesseract <test_image> <output_file_name> -l <language(s)> --oem <mode> --psm <mode>

你可以更改Tesseract配置以获得最适合你的图像的结果:语言(-l) : 使用Tesseract可以检测一种或多种语言OCR引擎模式(-oem): 如你所知,Tesseract 4具有LSTM和Legacy OCR引擎。根据它们的组合,有4种有效的操作模式

页面分割(–psm) : 可以根据图像中的文本进行调整以获得更好的结果

Pyteseract但是,除了命令行方法之外,你还可以使用Pytesseract(https://github.com/madmaze/pytesseract) :Tesseract的Python包装器。使用此功能,你可以通过编写简单的Python脚本使用Tesseract OCR轻松实现自己的文本识别器。你可以使用pip install pytesseract命令下载Pytesseract  。Pytesseract的主要功能是image_to_text(),它将图像和命令行选项作为其参数:

Tesseract面临的挑战是什么?Tesseract并不完美,这不是什么秘密。当图像有很多噪声或者语言的字体是Tesseract OCR没有经过训练的字体时,它的性能很差。其他条件(如文本的亮度或倾斜度)也会影响Tesseract的性能。然而,它是文本识别的一个很好的起点,具有低努力和高产出的特点。文本检测的不同方法Tesseract假定输入文本图像是干净的。不幸的是,许多输入图像将包含过多的对象,而不仅仅是干净的预处理文本,因此,必须具有一个良好的文本检测系统,该系统可以检测随后可以轻松提取的文本。文本检测有几种方法:使用OpenCV的传统方式使用当代深度学习模型建立自己的自定义模型使用OpenCV进行文本检测使用OpenCV进行文本检测是经典的处理方式。你可以应用各种操作(https://www.analyticsvidhya.com/blog/2019/03/opencv-functions-computer-vision-python/) ,如图像调整大小,模糊,阈值化,形态学操作等,以清理图像。

在这里,我们有按灰度,模糊度和阈值顺序排列的图像。完成此操作后,可以使用OpenCV轮廓检测来检测轮廓以提取数据块:最后,你可以在预测文本的轮廓上应用文本识别:

上面图像中的结果是通过最少的预处理和轮廓检测以及随后使用Pytesseract进行文本识别实现的,显然,轮廓并不是每次都检测到文本。但是,使用OpenCV进行文本检测仍然是一项繁琐的任务,需要使用大量参数。同样,它在泛化方面的表现也不好,更好的方法是使用EAST文本检测模型。当代深度学习模型– EASTEAST是一种高效、准确的场景文本检测器,是一种从自然场景图像中检测文本的深度学习模型,它非常快速和准确,因为它能够以13.2fps的速度检测720p图像,f值为0.7820。该模型由一个完全卷积网络和一个非最大抑制阶段组成,用于预测单词或文本行。但是,该模型不包括其他先前模型所涉及的可以优化模型的中间步骤,例如候选建议,文本区域形成和单词划分。你可以看一下作者在论文中提供的以下图像,将EAST模型与其他先前模型进行了比较:

EAST具有U形网络。网络的第一部分包括在ImageNet数据集上训练的卷积层。下一部分是特征合并分支,该分支将当前特征图与上一阶段的未合并特征图连接在一起。然后是卷积层,以减少计算并生成输出特征图。最后,使用卷积层,输出是显示文本存在的得分图和几何图,几何图可以是旋转的框或覆盖文本的四边形,这可以从研究论文中包含的结构图像中直观地理解:

我强烈建议你亲自阅读本文(https://arxiv.org/abs/1704.03155) ,以更好地了解EAST模型。OpenCV从版本3.4开始包含EAST文本检测器模型,这使得实现自己的文本检测器变得超级方便。生成的本地化文本框可以通过Tesseract OCR传递以提取文本,这样你将拥有一个完整的OCR端到端模型。

使用TensorFlow对象的API进行文本检测的自定义模型TensorFlow Object API:https://github.com/tensorflow/models/tree/master/research/object_detection构建文本检测器的最后一种方法是用使用了TensorFlow Object API的自定义文本检测器模型。它是一个开放源代码框架,用于为目标检测任务构建深度学习模型。要详细了解它,我建议先阅读下面这篇详细的文章。https://www.analyticsvidhya.com/blog/2020/04/build-your-own-object-detection-model-using-tensorflow-api/要构建你的自定义文本检测器,你显然需要一个包含很多图像的数据集,至少要多于100个;然后你需要对这些图像进行注释,以便模型可以知道目标对象在哪里并了解有关它的一切;最后,你可以从TensorFlow’s detection model zoo(https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md) 中根据性能和速度之间的权衡选择一种预训练的模型。你可以参考这个综合性的博客来构建你的自定义模型。博客:https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/training.html#configuring-a-training-pipeline现在。训练可能需要一些计算,但是如果你真的没有足够的计算能力,请不要担心!你可以使用Google合作实验室满足所有要求!这篇文章(https://www.analyticsvidhya.com/blog/2020/03/google-colab-machine-learning-deep-learning) 将教你如何有效地使用它。最后,如果你想往前走了一步,并建立一个最先进的YOLO文本探测器模型,该文章(https://www.analyticsvidhya.com/blog/2018/12/practical-guide-object-detection-yolo-framewor-python/) 将是一个了解它的所有细节的敲门砖,是一个很好的入门教程!

尾注:在这篇文章中,我们讨论了OCR中存在的问题以及可以用来解决这项任务的各种方法。我们还讨论了这些方法的各种缺点,以及为什么OCR不像看起来那么容易!