原文链接
文本检测 OpenCV EAST文本检测器 源代码
在 2019年7月11日 上张贴 由 hotdog发表回复
文本检测
在本教程中,您将学习如何使用 EAST 文本检 测器使用 OpenCV 检测自然场景图像中的文本。
OpenCV 的 EAST 文本检测器是一种基于新颖架构和训练模式的深度学习模型。它能够(1)在720p图像上以13 FPS接近实时运行,并且(2)获得最先进的 文本检测 精度。
在本教程的其余部分,您将学习如何使用 OpenCV 的 EAST检测器 自动检测图像和视频流中的文本。
OpenCV 文本检测(EAST文本检测器)
在本教程中,您将学习如何使用EAST文本检测器使用OpenCV检测图像中的文本。
EAST文本检测器要求我们在我们的系统上运行OpenCV 3.4.2或OpenCV 4– 如果您还没有安装OpenCV 3.4.2或更高版本,请参阅我的OpenCV安装指南并按照各自的操作系统进行操作。
在今天的教程的第一部分中,我将讨论为什么在自然场景图像中检测文本会如此具有挑战性。
从那里我将简要讨论EAST文本检测器,为什么我们使用它,以及什么使算法如此新颖 – 我还将包括原始论文的链接,以便您可以阅读详细信息.
最后,我将提供我的Python + OpenCV文本检测实现,以便您可以开始在自己的应用程序中应用文本检测。
为什么自然场景文本检测如此具有挑战性
图1:自然场景图像的示例,其中文本检测由于光照条件,图像质量和非平面物体而具有挑战性(Mancas-Thillou和Gosselin的图1 )。
在受约束的受控环境中检测文本通常可以通过使用基于启发式的方法来完成,例如利用梯度信息或者文本通常被分组成段落并且字符出现在直线上的事实。在我之前关于检测护照图像中的机器可读区域的博客文章中可以看到这种基于启发式的文本检测器的示例。
自然场景文本检测不同 – 而且更具挑战性。
由于廉价数码相机的普及,更不用说几乎每部智能手机现在都有摄像头这一事实,我们需要高度关注拍摄图像的条件 – 此外,我们能做什么和不能做什么假设。我已经包含了Celine Mancas-Thillou和Bernard Gosselin在2017年优秀论文“自然场景文本理解”中描述的自然场景文本检测挑战的总结版本:
图像/传感器噪声:手持式摄像机的传感器噪声通常高于传统扫描仪的噪声。此外,低价相机通常会插入原始传感器的像素以产生真实的颜色。
视角:自然场景文本自然可以具有与文本不平行的视角,使文本更难识别。
模糊:不受控制的环境往往会模糊,特别是如果最终用户使用的智能手机没有某种形式的稳定性。
照明条件:我们无法对自然场景图像中的照明条件做出任何假设。它可能接近黑暗,相机上的闪光灯可能打开,或者太阳可能会照亮,使整个图像饱和。
分辨率:并非所有摄像机都是相同的 – 我们可能正在处理分辨率低的摄像机。
非纸质对象:大多数(但不是全部)纸张都不是反光的(至少在您尝试扫描的纸张环境中)。自然场景中的文字可能是反光的,包括徽标,标志等。
非平面物体:考虑当您将文本环绕在瓶子周围时会发生什么 – 表面上的文本变得扭曲和变形。虽然人类仍然可以轻松地“检测”并阅读文本,但我们的算法会很困难。我们需要能够处理这样的用例。
未知布局:我们不能使用任何先验信息来为我们的算法提供关于文本所在位置的“线索”。
正如我们将要了解的那样,OpenCV的EAST文本检测器实现非常强大,即使文本模糊,反射或部分模糊,也能够对文本进行本地化:
图2:OpenCV的EAST场景文本检测器即使在模糊和模糊的图像中也能检测到。
如果您对自然场景图像中的文本检测相关的挑战更感兴趣,我建议阅读Mancas-Thillou和Gosselin的作品。
EAST深度学习文本检测器
图3:EAST文本检测全卷积网络的结构(Zhou等人的图3 )。
随着OpenCV 3.4.2和OpenCV 4的发布,我们现在可以使用一种名为EAST的基于深度学习的文本检测器,它基于Zhou等人的2017年论文“EAST:一种高效精确的场景文本检测器”。
我们将算法称为“EAST”,因为它是:Efficient 和AccurateSceneText检测管道。
据作者说,EAST管道能够在720p图像上以任意方向预测文本的单词和行,并且能够以13 FPS运行。
也许最重要的是,由于深度学习模型是端到端的,因此可以回避其他文本检测器通常应用的计算上昂贵的子算法,包括候选聚合和字分区。
为了构建和训练这样一种深度学习模型,EAST方法采用了新颖,精心设计的损失函数。
有关EAST的更多详细信息,包括架构设计和培训方法,请务必参考作者的出版物。
项目结构
首先,请访问“下载”部分,确保将源代码+图像抓取到今天的帖子 。从那里,只需使用 tree terminal命令查看项目结构
请注意,我在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
1$ pip install --upgrade imutils
此时您的系统已配置好,因此打开 text_detection .py
首先,我们在第2-6行导入所需的包和模块。值得注意的是,我们 从 imutils导入NumPy,OpenCV和我的 non_max_suppression 实现。object_detection 。
然后我们继续解析第9-20行的五个命令行参数:
– image :输入图像的路径。
– east :EAST场景文本检测器模型文件路径。
– min – confidence :确定文本的概率阈值。可选, 默认值= 0.5 。
– width :调整后的图像宽度 – 必须是32的倍数。可选, 默认值= 320 。
– height :调整后的图像高度 – 必须是32的倍数。可选, 默认值= 320 。
重要提示:EAST文本要求输入图像尺寸为32的倍数,因此如果您选择调整 – 宽度 和 – 高度 值,请确保它们是32的倍数!
从那里,让我们加载我们的图像并调整它的大小
在第23和24行,我们加载并复制输入图像。
从那里,第30行和第31行确定原始图像尺寸与新图像尺寸的比率(基于为- width 和 -height提供的命令行参数 )。
然后我们调整图像大小,忽略纵横比(第34行)。
为了使用OpenCV和EAST深度学习模型执行文本检测,我们需要提取两层的输出特征映射
我们 在40-42行构建一个layerNames列表:
第一层是我们的输出sigmoid激活,它给出了包含文本或不包含文本的区域的概率。
第二层是表示图像“几何”的输出要素图 – 我们将能够使用此几何来导出输入图像中文本的边界框坐标
让我们加载OpenCV的EAST文本检测器
我们使用cv2将神经网络加载到内存中 。dnn 。readNet 将路径传递给EAST检测器(包含在我们的命令行 args 字典中)作为第46行的参数 。
然后,我们通过转换准备好图像,形成 blob第50和51行。要了解有关此步骤的更多信息,请参阅深度学习:OpenCV的blobFromImage如何工作。
要预测文本,我们可以简单地将blob设置 为输入并调用 net 。前进 (第53和54行)。这些行被抓取时间戳包围,以便我们可以 在第58行打印经过的时间 。
通过提供 layerNames 作为net的参数 。前进 ,我们正在指导的OpenCV返回两个特征的地图
输出 geometry 图用于导出输入图像中文本的边界框坐标
类似地, scores 图包含包含文本的给定区域的概率
我们需要逐个遍历每个值
我们首先抓住 scores 的维度 (第63行),然后初始化两个列表:
rects :存储文本区域的边界框(x,y) –坐标
confidences 置信度 :存储与 rects中每个边界框关联的概率
我们稍后将对这些区域应用非最大值抑制。
在第68行开始循环 。
第72-77行提取当前行的分数和几何数据 y 。
接下来,我们遍历当前所选行的每个列索引
对于每一行,我们开始循环第80行 。
我们需要通过忽略不具有足够高概率的区域来过滤掉弱文本检测(第82和83行)。
当文本通过网络时,EAST文本检测器自然地减小了体积大小 – 我们的体积大小实际上比输入图像小4倍,所以我们乘以4使坐标回到原始图像的方向。
我已经介绍了如何 在第91-93行提取 角度数据; 但是,正如我在上一节中提到的,我无法像在C ++实现中那样构建一个旋转的边界框 – 如果你想要处理任务,从第91行的角度开始将是你的第一个步。
从那里,第97-105行导出文本区域的边界框坐标。
然后,我们 分别更新我们的 rects 和 confidences列表(第109和110行)。
我们差不多完成了!
最后一步是将非最大值抑制应用于我们的边界框以抑制弱重叠边界框,然后显示结果文本预测
正如我在上一节中提到的,我不能使用非最大值抑制在我的OpenCV 4安装( cv2.dnn.NMSBoxes )作为Python绑定没有返回值,最终导致OpenCV的错误了。我无法完全在OpenCV 3.4.2中进行测试,因此它可以在v3.4.2中运行。
相反,我使用 了imutils 包中提供的非最大值抑制实现(第114行)。结果仍然很好; 但是,我无法将输出与NMSBoxes 函数进行比较 ,看它们是否相同。
第117-126行环绕我们的边界 框 ,将坐标缩放回原始图像尺寸,并将输出绘制到我们的 原始 图像。显示 原始 图像,直到按下一个键(第129和130行)。
作为最后的实现说明,我想提一下,我们的两个嵌套 for 循环用于循环第68-110行的 scores 和 geometry ,这将是一个很好的例子,你可以利用Cython来大大加速你的管道。我已经展示了Cython在Fast中的强大功能,使用OpenCV和Python优化了’for’像素循环。
OpenCV文本检测结果
你准备好对图像应用文本检测了吗?
首先抓住 此博客文章的“下载”并解压缩文件。
从那里,您可以在终端中执行以下命令(记下两个命令行参数)
$ python text_detection.py --image images/lebron_james.jpg \ --east frozen_east_text_detection.pb
您的结果应类似于以下图像:
图4:着名的篮球运动员,Lebron James的球衣文字通过OpenCV和EAST文本检测成功识别。
勒布朗詹姆斯确定了三个文本区域。
现在让我们尝试检测商业标志的文字
$ python text_detection.py --image images/car_wash.png \ --east frozen_east_text_detection.pb
图5:在洗车站的这个自然场景中使用EAST和Python以及OpenCV可以轻松识别文本。
最后,我们将尝试一个路标
$ python text_detection.py --image images/sign.jpg \ --east frozen_east_text_detection.pb
图6:使用Python + OpenCV进行场景文本检测,EAST文本检测器成功检测到此西班牙语停止标志上的文本。
此场景包含西班牙停车标志。OpenCV和EAST正确检测到“ALTO”这个词。
正如您所知,EAST非常准确且相对较快,每张图像的平均时间约为0.14秒。
使用OpenCV在视频中进行文本检测
现在我们已经看到了如何检测图像中的文本,让我们继续使用OpenCV检测视频中的文本。
这个解释非常简短; 有关详细信息,请参阅上一节。
打开 text_detection_video 。py
我们首先导入我们的包。我们将使用 VideoStream 访问网络摄像头和 FPS 来对此脚本的每秒帧进行基准测试。其他所有内容与上一节中的相同。
为方便起见,让我们定义一个新函数来解码我们的预测函数 – 它将被重用于每个帧并使我们的循环更清晰
在第11行,我们定义了 decode_predictions 函数。此函数用于提取:
文本区域的边界框坐标
以及文本区域检测的概率
此专用函数将使代码在此脚本中更易于阅读和管理。
让我们解析我们的命令行参数
我们的命令行参数在第69-80 行解析:
– east :EAST场景文本检测器模型文件路径。
– video :输入视频的路径。可选 – 如果提供了视频路径,则不会使用网络摄像头。
–min-confidence :确定文本的概率阈值。可选, 默认值= 0.5 。
– width :调整后的图像宽度(必须是32的倍数)。可选, 默认值= 320 。
– height :调整后的图像高度(必须是32的倍数)。可选, 默认值= 320 。
上一节中仅使用图像的脚本(就命令行参数而言)的主要变化是我 用- video替换了 -image参数 。
重要提示:EAST文本要求输入图像尺寸为32的倍数,因此如果您选择调整 – 宽度 和 – 高度 值,请确保它们是32的倍数!
接下来,我们将执行模仿前一个脚本的重要初始化
第84-86行的高度/宽度和比率初始化将允许我们稍后正确地缩放我们的边界框。
定义了输出层名称,我们在第91-97行加载了预训练的EAST文本检测器。
以下块设置我们的视频流和每秒帧数计数器
我们的视频流设置为:
网络摄像头(100-103行)
或视频文件(第106-107行)
从那里我们初始化我们在第110行的每秒帧数, 并开始循环传入帧
我们开始在113行的视频/网络摄像头帧上循环 。
我们的框架调整大小,保持纵横比(第124行)。从那里,我们抓住尺寸并计算比例比(第129-132行)。然后,我们调整框架再次(必须是32的倍数),此时忽略纵横比,因为我们已经存储保管在比(135行)。
推理和绘图文本区域边界框发生在以下行
在这个块中我们:
使用EAST通过创建blob 并将其传递通过网络来检测文本区域 (第139-142行)
解码预测并应用NMS(第146和147行)。我们使用 此脚本中先前定义的decode_predictions函数和我的imutils non_max_suppression 便利函数。
环绕边界框并在框架上绘制它们 (第150-159行)。这涉及通过先前收集的比率来缩放框。
从那里我们将关闭帧处理循环以及脚本本身
我们 在循环的每次迭代中更新我们的 fps计数器(第162行),以便在我们突破循环时计算并显示计时(第173-175行)。
我们在165行显示EAST文本检测的输出 并处理按键(第166-170行)。如果按“q”进行“退出”,我们就会 跳出 循环并继续清理并释放指针。
视频文本检测结果
要使用OpenCV将文本检测应用于视频,请务必使用此博客文章的“下载”部分。
从那里,打开一个终端并执行以下命令(这将启动你的网络摄像头,因为我们没有 通过命令行参数提供 – 视频)
$ python text_detection_video.py --east frozen_east_text_detection.pb
我们的OpenCV文本检测视频脚本可实现7-9 FPS。
这个结果并不像作者报道的那么快(13 FPS); 但是,我们使用的是Python而不是C ++。通过使用Cython优化for循环,我们应该能够提高文本检测管道的速度。
摘要
在今天的博客文章中,我们学习了如何使用OpenCV的新EAST文本检测器来自动检测自然场景图像中是否存在文本。
文本检测器不仅准确,而且能够在720p图像上以大约13 FPS的近实时速度运行。
为了提供OpenCV的EAST文本检测器的实现,我需要转换OpenCV的C ++示例; 然而,我遇到了许多挑战,例如:
无法使用OpenCV的 NMSBox 进行非最大值抑制,而是必须使用imutils的实现 。
由于缺少RotatedRect的Python绑定,无法计算真正的旋转边界框 。
我试图让我的实现尽可能接近OpenCV,但请记住,我的版本与C ++版本没有100%完全相同,并且可能会有一两个小问题需要随着时间的推移而解决。
无论如何,我希望你喜欢今天的OpenCV文本检测教程!
源代码下载
下载链接 https://hotdog29.com/?p=643
原文链接
文本检测 OpenCV EAST文本检测器 源代码
文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月11日访问
相关文章
YOLO 对象检测 OpenCV 源代码
代码下载
dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
OpenCV 人脸识别 源代码
OpenCV教程 ,资源和指南
张贴在技术博客、opencv标签:opencv、深度学习、文本检测、EAST编辑