本文翻译自 Adrian Rosebrock 在 深度学习,光学字符识别(OCR)教程,上一篇讲到文档图像透视转换,我们期望可以通过OCR对文档进行识别,在真正实现OCR之前,需要通过EAST深度学习库来标识出图像中含有的文本,第二步再借助OCR库实现对标识出来的文本图像进行识别。

在本教程中,您将学习如何使用EAST文本检测器使用OpenCV检测自然场景图像中的文本。OpenCV的EAST文本检测器是一种基于新颖架构和训练模式的深度学习模型。它能够

  1. 在720p图像上以13 FPS接近实时运行,并且
  2. 获得最先进的文本检测精度。

在本教程中,您将学习如何使用EAST文本检测器使用OpenCV检测图像中的文本。之后,将学习如何使用OpenCV的EAST检测器协同自动检测图像和视频流中的文本。

EAST文本检测器要求我们在我们的系统上运行OpenCV 3.4.2或OpenCV 4。

在今天的教程的第一部分中,我将讨论为什么在自然场景图像中检测文本会如此具有挑战性。

从那里我将简要讨论EAST文本检测器,为什么我们使用它,以及什么使算法如此新颖 - 我还将包括原始论文的链接,以便您可以阅读详细信息,如果你是如此倾向。

最后,我将提供我的Python + OpenCV文本检测实现,以便您可以开始在自己的应用程序中应用文本检测。

为什么自然场景文本检测如此具有挑战性




opencv做文字识别 Java opencv文字识别输出到文本_opencv识别物体

图1:自然场景图像的示例,其中文本检测由于光照条件,图像质量和非平面物体而具有挑战性(Mancas-



在受约束的受控环境中检测文本通常可以通过使用基于启发式的方法来完成,例如利用梯度信息或者文本通常被分组成段落并且字符出现在直线上的事实。在我之前关于检测护照图像中的机器可读区域的博客文章中可以看到这种基于启发式的文本检测器的示例

自然场景文本检测虽然不同 - 而且更具挑战性

由于廉价数码相机的普及,更不用说几乎每部智能手机现在都有摄像头这一事实,我们需要高度关注拍摄图像的条件 - 此外,我们能做什么和不能做什么假设。我已经包含了Celine Mancas-Thillou和Bernard Gosselin在2017年优秀论文“ 自然场景文本理解”中描述的自然场景文本检测挑战的总结版本:

  • 图像/传感器噪声:手持式摄像机的传感器噪声通常高于传统扫描仪的噪声。此外,低价相机通常会插入原始传感器的像素以产生真实的颜色。
  • 视角:自然场景文本自然可以具有与文本不平行的视角,使文本更难识别。
  • 模糊:不受控制的环境往往会模糊,特别是如果最终用户使用的智能手机没有某种形式的稳定性。
  • 照明条件:我们无法对自然场景图像中的照明条件做出任何假设。它可能接近黑暗,相机上的闪光灯可能打开,或者太阳可能会照亮,使整个图像饱和。
  • 分辨率:并非所有摄像机都是相同的 - 我们可能正在处理分辨率低于分辨率的摄像机。
  • 非纸质对象:大多数(但不是全部)纸张都不是反光的(至少在您尝试扫描的纸张环境中)。自然场景中的文字可能是反光的,包括徽标,标志等。
  • 非平面物体:考虑当您将文本环绕在瓶子周围时会发生什么 - 表面上的文本变得扭曲和变形。虽然人类仍然可以轻松地“检测”并阅读文本,但我们的算法会很困难。我们需要能够处理这样的用例。
  • 未知布局:我们不能使用任何先验信息来为我们的算法提供关于文本所在位置的“线索”。

正如我们将要了解的那样,OpenCV的EAST文本检测器实现非常强大,即使文本模糊,反射或部分模糊,也能够对文本进行本地化:




opencv做文字识别 Java opencv文字识别输出到文本_OpenCV_02

图2: OpenCV的EAST场景文本检测器即使在模糊和模糊的图像中也能检测到。



如果您对自然场景图像中的文本检测相关的挑战更感兴趣,我建议阅读Mancas-Thillou和Gosselin的作品。

EAST深度学习文本检测器




opencv做文字识别 Java opencv文字识别输出到文本_opencv识别物体_03

图3: EAST文本检测全卷积网络的结构(Zhou等人的图3 )



随着OpenCV 3.4.2和OpenCV 4的发布,我们现在可以使用一种名为EAST的基于深度学习的文本检测器,它基于Zhou等人的2017年论文“ EAST:一种高效精确的场景文本检测器”

我们将算法称为“EAST”,因为它是: E fficient 和A ccurate S cene T ext检测管道。

据作者说,EAST管道能够在720p图像上以任意方向预测文本的单词和行,并且能够以13 FPS运行。

也许最重要的是,由于深度学习模型是端到端的,因此可以回避其他文本检测器通常应用的计算上昂贵的子算法,包括候选聚合和字分区。

为了构建和训练这样一种深度学习模型,EAST方法采用了新颖,精心设计的损失函数。

有关EAST的更多详细信息,包括架构设计和培训方法,请务必参考作者的出版物。

项目结构

首先,查看项目结构:

OpenCV Text Detection (EAST text detector)

$ tree --dirsfirst├── images│ ├── car_wash.png│ ├── lebron_james.jpg│ └── sign.jpg├── frozen_east_text_detection.pb├── text_detection.py└── text_detection_video.py

1 directory, 6 files

请注意,我在images / 目录中提供了三张示例图片 。您可添加自己使用智能手机收集的图像或在线查找的图像。

我们 今天将审查两个 .py文件:

  • text_detection .py :检测静态图像中的文本。
  • text_detection_video .py :通过网络摄像头或输入视频文件检测文本。

两个脚本都使用序列化的EAST模型(frozen_east_text_detection .pb ),请自行通过网络下载这个模型 。

实施说明

我今天包含的文本检测实现基于OpenCV的官方C ++示例 ; 但是,我必须承认在将其转换为Python时遇到了一些麻烦。

首先, Python 中没有 Point2f 和 RotatedRect函数,因此,我无法100%模仿 C ++实现。C ++实现可以生成旋转的边界框,但不幸的是,我今天与你分享的那个不能。

其次, NMSBoxes 函数不返回Python绑定的任何值(至少对于我的OpenCV 4预发布安装),最终导致OpenCV抛出错误。该 NMSBoxes 功能可以在OpenCV的3.4.2工作,但我无法详尽地测试它。

我解决了这个问题,我在imutils中使用我自己的 非最大值抑制实现,但同样,我不相信这两个是100%可互换的,因为看起来 NMSBoxes 接受其他参数。

鉴于这一切,我尽力使用我的工作功能和资源为您提供最好的OpenCV文本检测实现。如果您对方法有任何改进,请随时在下面的评论中分享。

使用OpenCV实现我们的文本检测器

在我们开始之前,我想指出的是,需要至少OpenCV的3.4.2(或OpenCV的4)安装在您的系统利用OpenCV的东部文本探测器上,因此,如果您尚未安装的OpenCV 3.4.2或更高在您的系统上,请参阅我的OpenCV安装指南。

接下来,确保您的系统上还 安装/升级了imutils:

Shell

$ pip install --upgrade imutils

此时您的系统已配置好,因此打开 text_detection .py 并插入以下代码:

# import the necessary packagesfrom imutils.object_detection import non_max_suppressionimport numpy as npimport argparseimport timeimport cv2# construct the argument parser and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i