选自pyimagesearch
参加:陆、
阿德里安·罗斯布鲁克最近发表了一篇关于如何使用OpenCV、Python和Tesseract执行文本检测和识别的教程。从安装软件和环境,项目流程,审核代码,实验结果,到展示局限性,提出建议,这个教程可以说是非常详细了。机器心已经总结编译了这个教程。
本教程将向您展示如何使用OpenCV OCR。我们将使用OpenCV、Python和Tesseract来执行文本检测和文本识别。
前面的教程展示了如何使用OpenCV的EAST深度学习模型进行文本检测。使用该模型,我们可以检测和定位图像中文本的边界框坐标。
然后下一步就是用OpenCV和Tesseract处理每一个包含文本的图像区域,识别这些文本并进行OCR处理。
本教程将介绍如何构建自己的OpenCV OCR和文本识别系统!
OpenCV光学字符识别和使用镶嵌的文本识别
为了执行OpenCV OCR和文本识别任务,我们首先需要安装Tesseract v4,包括一个用于文本识别的高度精确的深度学习模型。
然后,我将向您展示如何编写一个Python脚本,它可以:
使用 OpenCV EAST 文本检测器执行文本检测,该模型是一个高度准确的深度学习文本检测器,可用于检测自然场景图像中的文本。使用 OpenCV 检测出图像中的文本区域后,我们提取出每个文本 ROI 并将其输入 Tesseract,从而构建完整的 OpenCV OCR 流程!最后,我将展示一些使用OpenCV应用于文本识别的例子,并讨论这种方法的缺陷。
让我们开始本教程的正式内容。
如何安装Tesseract v4
如上图,我访问了一个叫cv 的Python虚拟环境,你也可以用其他名字给虚拟环境命名。
接下来,我们将使用pip安装pil,然后安装pytesseract和imutils:
现在打开Python shell,确认已经导入了OpenCV和pytesseract:
恭喜!如果没有导入错误,您的机器现在已经安装,可以使用OpenCV执行光学字符识别和文本识别任务。
了解OpenCV光学字符识别和镶嵌文字识别
图3: OpenCV OCR流程图。
现在我们已经在系统上成功安装了OpenCV和Tesseract,让我们简单回顾一下这个过程和相关的命令。
首先,我们使用OpenCV的EAST文本检测器来检测图像中的文本。东部文本检测器将提供文本感兴趣区域的边界框坐标。我们将提取每个文本的感兴趣区域,并将其输入到镶嵌v4的LSTM深度学习文本识别算法中。LSTM的输出将提供实际的光学字符识别结果。最后,我们将在输出图像上绘制OpenCV OCR结果。
过程中使用的Tesseract命令必须在pytesseract库下调用。在调用tessarct库时,我们需要提供大量的标志。最重要的三个标志是-l,- oem和- ism。
-l标志控制输入文本的语言。英语在本教程示例中使用。在这里你可以看到宇宙魔方支持的所有语言:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files.
- oem控制Tesseract使用的算法类型。执行以下命令查看可用的光学字符识别引擎模式:
我们将使用- oem 1,这表明我们只想使用深度学习LSTM引擎。
最后一个重要标志- psm控制着Tesseract使用的自动页面分割模式:
在对文本ROI进行OCR时,我发现模式6和模式7表现更好,但如果对大量文本进行OCR,可以尝试3。
如果你得到不正确的OCR结果,我强烈建议调整- psm,这会极大地影响你输出的OCR结果。
项目结构
您可以从本文的下载部分下载。然后解压进入目录。以下树形命令使我们能够在终端查看目录结构:
我们的项目包含一个目录和两个重要文件:
images/:该目录包含六个含有场景文本的测试图像。我们将使用这些图像进行 OpenCV OCR 操作。frozen_east_text_detection.pb:EAST 文本检测器。该 CNN 已经经过预训练,可用于文本检测。它是由 OpenCV 提供的,你也可以在「Downloads」部分下载它。text_recognition.py:我们的 OCR 脚本。我们将逐行 review 该脚本。它使用 EAST 文本检测器找到图像中的文本区域,然后利用 Tesseract v4 执行文本识别。实现我们的OpenCV光学字符识别算法
现在让我们开始使用OpenCV来执行文本识别!
打开text_recognition.py文件并插入以下代码:
本教程中的OCR脚本需要五次导入,其中一次已经内置到OpenCV中。
最重要的一点是,我们将使用pytesseract和OpenCV。我的imutils包会用于非最大值抑制,因为OpenCV的NMSBoxes函数无法适应Python API。我注意到NumPy是OpenCV的一个依赖。
argparse包包含在Python中,用于处理命令行参数,所以不需要在这里安装。
现在您已经处理了导入,让我们实现decode_predictions函数:
decode_predictions函数从第8行开始,本文对此进行了详细描述。功能:
使用基于深度学习的文本检测器来检测(不是识别)图像中的文本区域。该文本检测器生成两个阵列,一个包括给定区域包含文本的概率,另一个阵列将该概率映射到输入图像中的边界框位置。东部文本检测器产生两个变量:
scores:文本区域的概率。geometry:文本区域的边界框位置。这两个变量都是decode_predictions函数的参数。
该函数处理输入数据,并获得包含文本边界框的位置和该区域包含文本的相应概率的元组:
rects:该值基于 geometry,其格式更加紧凑,方便我们稍后将其应用于 NMS。confidences:该列表中的置信度值对应 rects 中的每个矩形。这两个值都是由decode_predictions函数获得的。
注意:在完美的情况下,旋转的包围盒也是矩形的,但是提取旋转的包围盒不利于解释本教程的概念。因此,我计算了水平边框矩形。如果你想提取文本的旋转边界框并输入宇宙魔方,你可以在第41行得到角度。
有关上述代码块的更多详细信息,请参见https://www . pyimagesearch . com/2018/08/20/opencv-text-detection-east-text-detector。
让我们解析命令行参数:
我们的脚本需要两个命令行参数:
--image:输入图像的路径。--east:预训练 EAST 文本检测器的路径。以下命令行参数是可选的:
--min-confidence:检测到的文本区域的最小概率。--width:图像输入 EAST 文本检测器之前需要重新调整的宽度,我们的检测器要求宽度是 32 的倍数。--height:与宽度类似。检测器要求调整后的高度是 32 的倍数。--padding:添加到每个 ROI 边框的(可选)填充数量。如果你发现 OCR 结果不正确,那么你可以尝试 0.05、0.10 等值。接下来,我们将加载和预处理图像,并初始化关键变量:
第82行和第83行,将图像加载到内存中并复制。
获取原始的宽度和高度,然后从args字典中提取新的宽度和高度。我们使用原始尺寸和新尺寸来计算比率,该比率用于在稍后的脚本中扩展边界框坐标。
然后调整图像大小,忽略这里的纵横比。
接下来,我们将使用EAST文本检测器:
第99到101行,将两个输出层的名称转换为列表格式。然后,预训练的EAST神经网络被加载到存储器中。
必须强调的是,你至少需要OpenCV 3 . 4 . 2版,有cv2.dnn.readNet实现。
下一步是见证第一个“奇迹”:
要查找文本,我们:
在第 109 和 110 行构建 blob。详情参见 https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/。将 blob 输入 EAST 神经网络中,获取 scores 和 geometry(第 111 和 112 行)。使用之前定义的 decode_predictions 函数解码预测(第 116 行)。通过 imutils 方法进行非极大值抑制(第 117 行)。NMS 高效使用概率最高的文本区域,删除其他重叠区域。现在我们知道了文本区域的位置,我们需要识别文本。我们开始围绕边界框循环,并处理结果,为实际的文本识别做准备:
我们初始化结果列表,以包括我们的光学字符识别边界框和文本。然后在盒子上循环,我们:
基于之前计算的比率扩展边界框(第 126-129 行)。填充边界框(第 134-141 行)。最后,提取被填充的 roi(第 144 行)。本文中的OpenCV OCR过程可以用一点点魔方v4“魔法”来完成:
在第151行,我们设置了宇宙魔方配置参数。
注意:如果您得到错误的光学字符识别结果,您可能需要使用本教程开头的说明来配置- psm值。
在第152行,pytesseract库执行剩余的操作,调用pytesseract.image _ to _ string,并输入roi和配置字符串。
只需两行代码,就可以使用Tesseract v4来识别图像中的文本感兴趣区域。记住,很多过程发生在底层。
我们的结果附加到结果列表。
接下来,我们继续这个过程,并在循环的基础上处理其他ROI。
现在,让我们打印出结果,看看它是否真的有效:
第159行根据边界框的Y坐标从上到下对结果进行排序。
为了循环显示结果,我们:
将 OCR 处理过的文本打印到终端(第 164-166 行)。从文本中去掉非 ASCII 字符,因为 OpenCV 在 cv2.putText 函数中不支持非 ASCII 字符(第 171 行)。基于 ROI 绘制 ROI 周围的边界框和结果文本(第 173-176 行)。展示输出,等待即将按下的键(第 179、180 行)。OpenCV文本识别结果
现在我们已经实现了OpenCV OCR流程。
请务必使用本教程的下载部分下载源代码、OpenCV EAST文本检测器模型和示例图像。
打开命令行,导航到您下载并提取压缩包的位置,然后执行以下命令:
图4:第一次尝试OpenCV OCR成功!
先说一个简单的例子。
注意我们的OpenCV OCR系统是如何正确检测图像中的文字,然后识别文字的。
下一个例子更具代表性,是一个真实世界的图像:
图5:对于更复杂的图像例子,我们使用OpenCV和Tesseract 4对白色背景的招牌进行OCR。
第三,关注我们的OpenCV OCR系统如何正确定位和识别文本。但是,在终端输出中,我们看到了一个注册商标Unicode符号,其中Tesseract可能会被欺骗,因为OpenCV EAST文本检测器报告的边界框与标志后面的植物重叠。
让我们看看OpenCV OCR和文本识别的另一个例子:
图6:使用OpenCV、Python、Tesseract对三个字的大招牌进行OCR处理。
本例中有三个单独的文本区域。OpenCV的文本检测器可以定位每个文本区域,然后我们使用光学字符识别来准确识别每个文本区域。
下一个示例显示了在特定环境中添加填充的重要性:
图7:在这个烘焙店场景图像中,我们的OpenCV OCR进程在处理OpenCV EAST文本检测器确定的文本区域时遇到了问题。请记住,没有一个光学字符识别系统是适合所有情况的。那么改变参数能做的更好吗?
首先,我们在这家烘焙店的店面上尝试了光学字符识别,我们看到“商店”被正确识别,但是:
「CAPUTO」中的「U」被错误识别为「TI」。「CAPUTO'S」中的「'S」被漏掉。「BAKE」被错误识别为「|.」。现在我们添加填充来扩展感兴趣区域的边界框坐标,并准确识别文本:
图8:通过给EAST文本检测器确定的文本区域添加额外的填充,我们可以使用OpenCV和Tesseract来正确地识别面包店标志中的三个单词。
我们可以通过在边界框的四个角周围添加5%的填充来准确识别“BAKE”、“u”和“s”。
当然,OpenCV也有失败的案例:
图9:添加25%填充后,我们的OpenCV OCR系统可以识别招牌中的“Designer”,但无法识别较小的文字,因为它们的颜色与背景颜色过于接近。我们甚至检测不到“SUIT”这个词,“FACTORY”可以检测到,但是不能被宇宙魔方识别。我们的光学字符识别系统远非完美。
以下描述了OCR系统的一些局限性和缺点,以及改进OpenCV文本识别过程的建议。
局限性和不足
记住,没有完美的OCR系统,尤其是在现实世界中。期望100%的OCR准确率是不现实的。
我们的OpenCV OCR系统可以很好地处理一些图像,但在处理其他图像时会失败。文本识别过程失败的主要原因有两个:
文本被扭曲或旋转。文本字体与 Tesseract 模型训练的字体相差太远。即使Tesseract v4比v3更强大、更精确,但这种深度学习模型仍然受到训练数据的限制。如果您的文本字体与训练数据字体相差甚远,Tesseract可能无法对文本执行光学字符识别处理。
其次,宇宙魔方仍然假设输入图像/感兴趣区域已经被正确清理。然而,当我们对自然场景图像进行文本识别时,这种假设并不总是准确的。
总结
本教程介绍如何使用OpenCV OCR系统进行文本检测和文本识别。
为了完成这项任务,我们
利用 OpenCV EAST 文本检测器定位图像中的文本区域。提取每个文本 ROI,然后使用 OpenCV 和 Tesseract v4 进行文本识别。我们还研究了执行文本检测和文本识别的Python代码。
这种OpenCV OCR过程在某些情况下运行良好,而在其他情况下则不太准确。为了获得最佳的OpenCV文本识别结果,我建议您确保:
输入 ROI 尽量经过清理和预处理。在理想世界中,你的文本应该能够与图像的其他部分完美分割,但是在现实情况下,分割并不总是那么完美。文本是在摄像机 90 度角的情况下拍摄的,类似于自上而下、鸟瞰的角度。如果不是,那么角度变换可以帮助你获得更好的结果。原文链接:https://www . pyimagesearch . com/2018/09/17/opencv-ocr-and-text-recognition-with-tesseract/
这篇文章是为机器的核心编写的。请联系本微信官方账号进行授权。
1.《opencv安装教程 教程 | Adrian小哥教程:如何使用Tesseract和OpenCV执行OCR和文本识别》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《opencv安装教程 教程 | Adrian小哥教程:如何使用Tesseract和OpenCV执行OCR和文本识别》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guoji/1691105.html