选自pyimagesearch
作者:阿德里安·罗斯布鲁克

机器心脏编译
参加:陆、
最近,Adrian Rosebrock发表了一篇关于如何使用OpenCV、Python和Tesseract进行文本检测和识别的教程。从安装软件和环境,项目过程,审查代码,实验结果,到展示局限性,提出建议,这个教程可以说是非常详细了。机器之心对本教程做了汇总整理和介绍。
本教程将介绍如何使用OpenCV OCR。我们将使用OpenCV、Python和Tesseract来执行文本检测和文本识别。
之前的教程展示了如何使用OpenCV的EAST深度学习模型进行文本检测。该模型可以检测和定位图像中文本边界框的坐标。
然后下一步就是使用OpenCV和Tesseract处理每个包含文本的图像区域,识别这些文本并进行OCR处理。
本教程将介绍如何构建自己的OpenCV OCR和文本识别系统!
OpenCV OCR和使用Tesseract的文本识别
为了执行OpenCV OCR和文本识别任务,我们首先需要安装Tesseract v4,包括一个高度精确的文本识别深度学习模型。
然后,我将展示如何编写一个Python脚本,以便它能够:
使用OpenCV EAST text detector执行文本检测。该模型是一个高度精确的深度学习文本检测器,可用于检测自然场景图像中的文本。在使用OpenCV检测图像中的文本区域后,我们提取每个文本ROI并将其输入到Tesseract中,从而构建了一个完整的OpenCV OCR流程!
最后,我将展示一些使用OpenCV来应用文本识别的例子,并讨论这种方法的缺点。
下面开始本教程的正式内容!
如何安装宇宙魔方v4
图1: Tessera CT OCR引擎出现在20世纪80年代。到2018年,它已经包含了内置的深度学习模型,成为了一个更强大的OCR工具。宇宙魔方和OpenCV的东方探测器是一个伟大的组合。
Tesseract是一个非常流行的OCR引擎,它是由Hewlett Packard在20世纪80年代开发的。它于2005年开源,从2006年开始由谷歌赞助。该工具在受控条件下可以很好地运行,但如果有大量噪声或图像在输入到Tesseract之前没有得到适当的处理,性能将会很差。
深度学习对计算机视觉的各个方面都有影响,包括字符识别和手写字体识别。基于深度学习的模型可以达到前所未有的文本识别准确率,远远超过传统的特征提取和机器学习方法。将Tesseract纳入深度学习模型以进一步提高OCR的准确性只是时间问题。其实这个时候已经到了。
最新版本的Tesseract支持基于深度学习的OCR,准确率显著提升。底层OCR引擎使用循环神经网络-LSTM网络。
安装OpenCV
要运行本教程的脚本,首先需要安装OpenCV 3 . 4 . 2版或更高版本。安装教程请参考https://www . pyimagesearch . com/OpenCV-tutorials-resources-guides/
在Ubuntu上安装宇宙魔方4
在Ubuntu上安装Tesseract 4的具体命令因您使用的Ubuntu版本而异。您可以使用lsb_release命令来检查Ubuntu版本:
如上图,我的机器运行的是Ubuntu 18.04,但是你需要在继续之前检查你的Ubuntu版本。
对于Ubuntu版本18.04用户,Tesseract 4是主apt-get库的一部分,这使得使用以下命令安装Tesseract变得非常容易:
如果您使用的是Ubuntu版本14、16或17,那么由于相关要求,您需要一个额外的命令行。
Alexander Pozdnyakov为宇宙魔方创建了Ubuntu PPA,大大简化了在旧版Ubuntu上安装宇宙魔方4的过程。
只需将alex-p/Tesseract-ocr PPA库添加到系统中,更新您的包定义,然后安装Tesseract:
如果没有错误,那么您应该已经在自己的计算机上成功安装了Tesseract 4。
在macOS上安装宇宙魔方4
如果你的系统中安装了Homebrew,那么在macOS上安装Tesseract 4就很容易了。
只需要运行以下命令来确保指定了- HEAD以在Mac计算机上安装Tesseract v4:
安装后,您可能希望删除初始安装的链接:
接下来,您可以运行安装命令。
验证你的宇宙魔方版本
图2:我的系统终端截图。我输入Tesseract -v命令来检查Tesseract版本。
确保安装Tesseract后,您应该执行以下命令来验证Tesseract版本:
只要输出包含tesseract 4,那么您就已经成功地在系统中安装了最新版本的tesseract。
安装宇宙魔方+Python包
安装了Tesseract库之后,我们需要安装Tesseract+Python bundle,这样我们的Python脚本就可以和Tesseract进行通信,对OpenCV处理过的图像进行OCR。
如果使用Python虚拟环境,则使用workon命令访问虚拟环境:
如上图,我访问了一个名为cv的Python虚拟环境。您也可以用其他名称来命名虚拟环境。
接下来,我们将使用pip安装Pillow,然后安装pytesseract和imutils:
现在打开Python shell并确认您导入了OpenCV和pytesseract:
恭喜你!如果没有导入错误,那么您的机器现在已经安装,可以使用OpenCV执行OCR和文本识别任务。
了解OpenCV OCR和Tesseract文本识别
图3: OpenCV OCR流程图。
现在我们已经成功地在系统上安装了OpenCV和Tesseract,让我们简单回顾一下这个过程和相关的命令。
首先,我们使用OpenCV的EAST文本检测器来检测图像中的文本。东部文本检测器将提供文本ROI的边界框坐标。我们将提取每个文本的ROI,并将其输入到LSTM深度学习文本识别算法Tesseract v4中。LSTM的输出将提供实际的OCR结果。最后,我们将在输出图像上绘制OpenCV OCR结果。
过程中使用的Tesseract命令必须在pytesseract库下调用。当调用tessarct库时,我们需要提供许多标志。三个最重要标志是-l、- oem和- ism。
-l标志控制输入文本的语言。本教程示例中使用了eng。在这里你可以看到宇宙魔方:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files.支持的所有语言
- oem控制Tesseract使用的算法类型。执行以下命令查看可用的OCR引擎模式:
我们将使用- oem 1,这表明我们只想使用深度学习LSTM引擎。
最后一个重要标志- psm控制Tesseract使用的自动页面分段模式:
对于文本ROI上的OCR,我发现模式6和7的性能更好,但是如果你对大量文本执行OCR,那么你可以尝试3。
如果你的OCR结果不正确,那么我强烈建议调整- psm,它会对你输出的OCR结果产生很大的影响。
项目结构
您可以从本文的下载部分下载这个zip文件。然后解压进入目录。以下树命令使我们能够在终端查看目录结构:
我们的项目包含一个目录和两个重要文件:
Images/:这个目录包含六个带有场景文本的测试图像。我们将使用这些图像进行OpenCV OCR操作。Frozen _ east _ text _ detection.pb:东文检测器。这个CNN已经过预训练,可以用于文本检测。它是由OpenCV提供的,您也可以在下载部分下载它。Text_recognition.py:我们的OCR脚本。我们将逐行检查脚本。它使用EAST文本检测器找到图像中的文本区域,然后使用Tesseract v4执行文本识别。
实现我们的OpenCV OCR算法。
现在让我们开始用OpenCV执行文本识别!
打开text_recognition.py文件并插入以下代码:
本教程中的OCR脚本需要五个导入,其中一个已经内置到OpenCV中。
最值得注意的是,我们将使用pytesseract和OpenCV。我的imutils包将用于非最大抑制,因为OpenCV的NMSBoxes函数无法适配Python API。我注意到NumPy是OpenCV的依赖项。
argparse包包含在Python中,用于处理命令行参数。这里没必要安装。
既然已经处理了导入,让我们实现decode_predictions函数:
decode_predictions函数从第8行开始,在本文中有详细描述。功能:
使用基于深度学习的文本检测器来检测图像中的文本区域。文本检测器生成两个数组,其中一个数组包含给定区域包含文本的概率,另一个数组将该概率映射到输入图像中的边界框位置。
东文本检测器生成两个变量:
分数:文本区域的概率。Geometry:文本区域边界框的位置。
这两个变量都是decode_predictions函数的参数。
此函数处理输入数据以获得一个元组,该元组包含文本边界框的位置以及该区域包含文本的相应概率:

Rects:这个值是基于几何的,它的格式更紧凑,这样我们以后就可以把它应用到NMS。置信度:这个列表中的置信度值对应于rects中的每个矩形。
这两个值都是通过decode_predictions函数获得的。
注意:理想情况下,旋转后的包围盒也在rects中,但是提取旋转后的包围盒不利于解释本教程的概念。因此,我计算了水平包围盒矩形。如果要提取文本的旋转包围盒,输入Tesseract,可以在第41行得到angle。
有关上述代码块的更多详细信息,请参见https://www . pyimagesearch . com/2018/08/20/opencv-text-detection-east-text-detector/
让我们解析下面的命令行参数:
我们的脚本需要两个命令行参数:
- image:输入图像的路径。- EAST:预训练东方文本检测器的路径。
以下命令行参数是可选的:
- min-confidence:检测到的文本区域的最小概率。- width:在图像输入到EAST text检测器之前需要重新调整的宽度。我们的检测器要求宽度是32的倍数。-高度:类似于宽度。检测器要求调整后的高度是32的倍数。- padding:添加到每个ROI边界的填充量。如果发现OCR结果不正确,那么可以尝试0.05和0.10的等价物。
接下来,我们将加载和预处理图像,并初始化关键变量:
第82行和第83行,将图像加载到内存中,并复制它。
获取原始的宽度和高度,然后从args字典中提取新的宽度和高度。我们使用原始尺寸和新尺寸来计算比率,该比率用于在脚本的后面扩展边界框坐标。
然后调整图像大小,忽略这里的纵横比。
接下来,我们将使用东方文字检测器:
第99行到第101行将两个输出图层名称转换为列表格式。然后,将预先训练好的东方神经网络加载到内存中。
必须强调的是,你至少需要OpenCV 3 . 4 . 2版,里面有cv2.dnn.readNet实现。
接下来是见证第一个“奇迹”的时刻:
为了确定文本位置,我们:
在线109和110上建立斑点。详见https://www . pyimagesearch . com/2017/11月/06/deep-learning-open CVS-blob from image-works/。将blob输入EAST神经网络,获得分数和几何。使用之前定义的decode_predictions函数对预测进行解码。Imutils方法用于抑制非极大值。NMS有效地使用概率最高的文本区域,并删除其他重叠区域。
现在我们知道了文本区域的位置,我们需要识别文本。我们开始在边界框上循环,并处理结果以准备实际的文本识别:
我们初始化结果列表,使它包含我们的OCR边界框和文本。然后在盒子上循环,我们:
基于先前计算的比率扩展边界框。填充边界框。最后,提取填充的感兴趣区域。
本文中的OpenCV OCR过程可以用一点Tesseract v4“魔法”来完成:
第151行,我们设置了宇宙魔方配置参数。
注意:如果得到错误的OCR结果,您可能需要使用本教程开头的说明来配置- psm值。
在第152行,pytesseract库完成剩下的工作,调用pytesseract.image_to_string,并向其中输入roi和config字符串。
只需两行代码,您就可以使用Tesseract v4在图像中识别出一个文本ROI。记住,很多过程都发生在底层。
我们的结果附在结果列表中。
接下来,我们继续这个过程,并在循环的基础上处理其他ROI。
现在,让我们打印出结果,看看它是否真的有效:
第159行根据边界框的Y坐标从上到下对结果进行排序。
通过结果循环,我们:
将OCR处理的文本打印到终端。从文本中删除非ASCII字符,因为OpenCV不支持cv2.putText函数中的非ASCII字符。基于ROI在ROI周围绘制边界框和结果文本。显示,等待键被按下。
OpenCV文本识别结果
现在我们已经实现了OpenCV OCR流程。
确保使用本教程的下载部分下载源代码、OpenCV EAST text detector模型和示例图像。
打开命令行,导航到下载和解压缩压缩包的位置,然后执行以下命令:
图OpenCV OCR第一次尝试成功!
让我们从一个简单的例子开始。
请注意我们的OpenCV OCR系统如何正确检测图像中的文本,然后识别文本。
下一个例子更有代表性,是真实世界的图像:
图5:一个更复杂的图像示例。我们用OpenCV和Tesseract 4对这个白底招牌进行了OCR。
第三,关注我们的OpenCV OCR系统如何正确定位和识别文本。但是在终端的输出中,我们看到一个注册商标Unicode符号,Tesseract可能被骗了,因为OpenCV EAST text detector报告的包围盒与符号后面的植物重叠。
让我们看看OpenCV OCR和文本识别的另一个例子:
图6:使用OpenCV、Python和Tesseract对三个单词的大符号进行OCR处理。
本例中有三个独立的文本区域。OpenCV的文本检测器可以定位每个文本区域,然后我们用OCR精确识别每个文本区域。
下一个示例显示了在特定环境中添加填充的重要性:
图7:在这个烘焙店场景图像中,我们的OpenCV OCR进程在处理OpenCV EAST文本检测器确定的文本区域时遇到了一个问题。请记住,没有一个OCR系统是适用于所有情况的。那么我们能通过改变参数做得更好吗?
首先尝试OCR这家烘焙店的店面。我们看到“商店”被正确识别,但是:
“卡普托”中的“u”被误认为是“TI”。“卡普托的”中的“s”省略了BAKE”被错误地识别为“|”。".
现在我们添加填充,以便扩展ROI的边界框坐标并准确识别文本:
图8:通过向由EAST文本检测器确定的文本区域添加额外的填充,我们能够使用OpenCV和Tesseract正确地OCR烘焙店招牌中的三个单词。
我们只需要在边界框的四个角周围添加5%的填充,就可以准确地识别出“BAKE”、“U”和“S”。
当然,也有OpenCV的失败案例:
图9:在添加25%的填充后,我们的OpenCV OCR系统可以识别招牌中的“Designer”,但它无法识别较小的单词,因为它们的颜色与背景色太接近了。我们连“套装”这个词都检测不到,“工厂”可以检测到,但是宇宙魔方识别不到。我们的OCR系统远非完美。
下面介绍OCR系统的一些限制和缺点,以及改进OpenCV文本识别过程的建议。
局限性和不足之处
请记住,没有完美的OCR系统,尤其是在现实世界中。期望100%的OCR准确率是不现实的。
我们的OpenCV OCR系统可以很好地处理一些图像,但在处理其他图像时会失败。这个文本识别过程失败有两个主要原因:
文本扭曲或旋转。文本的字体与Tesseract模型训练的字体相差甚远。
即使Tesseract v4比v3更加强大和准确,这种深度学习模型仍然受到训练数据的限制。如果文本的字体与训练数据的字体差别太大,Tesseract可能无法对文本进行OCR。
其次,Tesseract仍然假设输入图像/ROI已经被适当地清理。然而,当我们在自然场景图像上执行文本识别时,这种假设并不总是准确的。
摘要
本教程描述了如何使用OpenCV OCR系统来执行文本检测和识别。
为了完成这项任务,我们
使用OpenCV EAST text detector定位图像中的文本区域。提取每个文本ROI,然后使用OpenCV和Tesseract v4进行文本识别。
我们还研究了执行文本检测和文本识别的Python代码。
这个OpenCV OCR过程在某些情况下工作得很好,而在其他情况下就不那么准确了。为了获得最佳的OpenCV文本识别结果,我建议您确保:
输入ROI应该尽可能地被清理和预处理。在理想的情况下,你的文本应该与图像的其余部分完美地分割开来,但在现实中,分割并不总是那么完美。这段文字是以摄像机的90度角拍摄的,类似于俯视和鸟瞰角度。如果没有,那么角度变换可以帮助你得到更好的结果。
以上是这次的教程,希望对大家有帮助!
原文链接:https://www . pyimagesearch . com/2018/09/17/opencv-ocr-and-text-recognition-with-tessera CT/

本文为机器之心整理,授权请联系本微信官方账号。
-
加入机器的心脏:hr@jiqizhixin.com
投稿或寻求报道:content@jiqizhixin.com
广告和商业合作:bd@jiqizhixin.com
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报













