在本教程中,您将学习如何使用OpenCV通过EAST文本检测器检测自然场景图像中的文本。

OpenCV的EAST文本检测器是一种深度学习模型,基于新颖的架构和训练模式。它的优势是

(1)可以以13 FPS的速度、几乎实时地在720p图像上检测运行,并且

(2)文本检测精度较高。

在本教程的接下来的部分,您将学习如何使用OpenCV和EAST检测器自动检测图像和视频流中的文本。

EAST文本检测器要求我们在系统上运行OpenCV3.4.2或OpenCV 4-如果尚未安装OpenCV3.4.2或更好的版本,请参阅我的OpenCV安装指南,并按照各自的操作系统进行相应操作 。

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

然后,我将简要讨论EAST文本检测器、我们为什么使用它以及使该算法如此新颖的原因—我还将附上包括原始论文的链接,以便您愿意时可以阅读详细信息。

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

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

图1:由于光照条件,图像质量和非平面物体而导致文本检测非常困难的自然场景图像示例

在受约束的受控环境中检测文本通常可以通过使用基于启发式的方法来完成,例如利用渐变信息或通常将文本分组为段落且字符显示在直线上这一事实。这种基于启发式文本检测器的示例可以在我之前的博客文章Detecting machine-readable zones inpassport images中看到。

因此,自然场景文本检测是不同的,而且更具挑战性。

由于廉价数码相机和智能手机的普及,我们需要高度关注图像拍摄时的条件。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: An Efficient and Accurate Scene Text Detector

论文作者说,EASTpipeline能够在720p图像上以任意方向预测单词和文本行,而且可以以13 FPS的速度运行。

也许最重要的是,由于EAST深度学习模型是端到端的,因此可能绕开一般文本识别器用的计算成本高昂的子算法,比如候选对象聚合和词汇分割等。

为了建立和训练这种深度学习模型,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中使用自己的非最大值抑制实现解决了这个问题,但是同样,由于NMSBoxes似乎接受其他参数,因此我不认为这两者是100%可互换的。

考虑到所有这些,我将尽力利用现有的功能和资源为您提供最佳的OpenCV文本检测实现。如果您对该方法有任何改进,请随时在下面的评论中分享。

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

在开始之前,我想指出,您至少需要在系统上安装OpenCV 3.4.2(或OpenCV 4)才能使用OpenCV的EAST文本检测器,因此,如果尚未安装OpenCV 3.4.2或更高版本, 在您的系统上,请参阅我的OpenCV安装指南。

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

$ pip install --upgrade imutils

至此,您的系统现已配置完毕,因此打开text_detection.py并插入以下代码:

# import the necessary packagesfrom imutils.object_detection importnon_max_suppressionimport numpy as npimport argparseimport timeimport cv2 # construct the argument parser and parse theargumentsap = argparse.ArgumentParser()ap.add_argument("-i","--image", type=str,           help="pathto input image")ap.add_argument("-east","--east", type=str,           help="pathto input EAST text detector")ap.add_argument("-c","--min-confidence", type=float, default=0.5,           help="minimumprobability required to inspect a region")ap.add_argument("-w","--width", type=int, default=320,           help="resizedimage width (should be multiple of 32)")ap.add_argument("-e","--height", type=int, default=320,           help="resizedimage height (should be multiple of 32)")args = vars(ap.parse_args())

首先,我们在2-6行中导入所需的包和模块。值得注意的是,我们导入了NumPy,OpenCV和从我的imutils.object_detection中导入non_max_suppression实现。

然后,我们继续分析第9-20行的五个命令行参数:

--image:输入图像的路径。

--east:EAST场景文本检测器模型文件路径。

--min-confidence:确定文本的概率阈值。可选,默认为0.5。

--width:调整后的图像宽度—必须为32的倍数。可选,默认为320。

--height:调整后的图像高度—必须为32的倍数。可选,默认为320。

重要提示:EAST文本要求您输入的图像尺寸必须是32的倍数,因此,如果您选择调整--width和--height值,请确保它们是32的倍数!

从那里开始,让我们加载图片并调整其大小:

# load the input image and grab the imagedimensionsimage = cv2.imread(args["image"])orig = image.copy()(H, W) = image.shape[:2] # set the new width and height and thendetermine the ratio in change# for both the width and height(newW, newH) = (args["width"],args["height"])rW = W / float(newW)rH = H / float(newH) # resize the image and grab the new image dimensionsimage = cv2.resize(image, (newW, newH))(H, W) = image.shape[:2]

在第23和24行,我们加载并复制输入图像。

从那里,第30行和第31行确定原始图像尺寸与新图像尺寸的比率(基于为--width和--height提供的命令行参数)。

然后我们调整图像大小,忽略宽高比(第34行)。

为了使用OpenCV和EAST深度学习模型执行文本检测,我们需要提取两层的输出特征图:

# define the two output layer names for theEAST detector model that# we are interested -- the first is theoutput probabilities and the# second can be used to derive the boundingbox coordinates of textlayerNames = [           "feature_fusion/Conv_7/Sigmoid",           "feature_fusion/concat_3"]

我们在第40-42行构造一个layerNames列表:

第一层是我们的输出S形激活,它为我们提供了一个区域是否包含文本的概率。

第二层是代表图像“几何形状”的输出要素图-我们将能够使用该几何形状来得出输入图像中文本的边界框坐标

让我们加载OpenCV的EAST文本检测器:

# load the pre-trained EAST text detectorprint("[INFO] loading EAST textdetector...")net = cv2.dnn.readNet(args["east"]) # construct a blob from the image and thenperform a forward pass of# the model to obtain the two output layersetsblob = cv2.dnn.blobFromImage(image, 1.0, (W,H),           (123.68,116.78, 103.94), swapRB=True, crop=False)start = time.time()net.setInput(blob)(scores, geometry) = net.forward(layerNames)end = time.time() # show timing information on text predictionprint("[INFO] text detection took {:.6f}seconds".format(end - start))

我们使用cv2.dnn.readNet将神经网络加载到内存中,方法是将路径传递到EAST检测器(包含在命令行args词典中)作为第46行的参数。

然后,通过将其转换为第50行和第51行上的斑点来准备图像。要了解有关此步骤的更多信息,请参阅深度学习:OpenCV的blobFromImage的工作方式。

为了预测文本,我们可以简单地将blob设置为输入并调用net.forward(第53和54行)。这些行周围都带有时间戳,因此我们可以在58行上打印经过的时间。

通过将layerNames作为参数提供给net.forward,我们指示OpenCV返回我们感兴趣的两个功能图:

输出几何图,用于导出输入图像中文本的边界框坐标

同样,分数图包含给定区域包含文本的概率

我们需要一个一个地遍历以下每个值:

# grab the number of rows and columns fromthe scores volume, then# initialize our set of bounding boxrectangles and corresponding# confidence scores(numRows, numCols) = scores.shape[2:4]rects = []confidences = [] # loop over the number of rowsfor y in range(0, numRows):           #extract the scores (probabilities), followed by the geometrical           #data used to derive potential bounding box coordinates that           #surround text           scoresData = scores[0, 0, y]           xData0 = geometry[0, 0, y]           xData1 = geometry[0, 1, y]           xData2 = geometry[0, 2, y]           xData3 = geometry[0, 3, y]           anglesData = geometry[0, 4, y]

首先,获取分数卷的大小(第63行),然后初始化两个列表:

rects:存储文本区域的边界框(x,y)坐标

置信度:将与每个边界框相关的概率存储在矩形中

稍后我们将对这些区域应用非最大值抑制。

行的循环从第68行开始。

第72-77行提取了当前行y的分数和几何数据。

接下来,我们遍历当前选定行的每个列索引:

        #loop over the number of columns           forx in range(0, numCols):                     #if our score does not have sufficient probability, ignore it                     ifscoresData[x] < args["min_confidence"]:                                continue                      #compute the offset factor as our resulting feature maps will                     #be 4x smaller than the input image                     (offsetX,offsetY) = (x * 4.0, y * 4.0)                      #extract the rotation angle for the prediction and then                     #compute the sin and cosine                     angle= anglesData[x]                     cos= np.cos(angle)                     sin= np.sin(angle)                      #use the geometry volume to derive the width and height of                     #the bounding box                     h= xData0[x] + xData2[x]                     w= xData1[x] + xData3[x]                      #compute both the starting and ending (x, y)-coordinates for                     #the text prediction bounding box                     endX= int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))                     endY= int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))                     startX= int(endX - w)                     startY= int(endY - h)                      #add the bounding box coordinates and probability score to                     #our respective lists                     rects.append((startX,startY, endX, endY))                     confidences.append(scoresData[x])

对于每一行,我们开始循环浏览第80行的列。

我们需要通过忽略没有足够高概率的区域来过滤掉弱文本检测(第82和83行)。

当图像通过网络时,EAST文本检测器自然会减小体积大小-我们的体积大小实际上比输入图像小4倍,因此我们乘以四以使坐标重新回到原始图像的范围内。

我已经介绍了如何在91-93行中提取角度数据;但是,正如我在上一节中提到的那样,我无法像在C ++实现中那样由它构造一个旋转的边界框-如果您想完成任务,那么从第91行的角度开始将是您的第一个 步。

97-105行从此处导出文本区域的边界框坐标。

然后,我们分别更新我们的矩形和置信度列表(第109行和第110行)。

我们快完成了!

最后一步是对边界框应用非最大值抑制,参考(https://www.pyimagesearch.com/2014/11/17/non-maximum-suppression-object-detection-python/)

,以抑制弱重叠边界框,然后显示结果文本预测:

# apply non-maxima suppression to suppressweak, overlapping bounding# boxesboxes = non_max_suppression(np.array(rects),probs=confidences) # loop over the bounding boxesfor (startX, startY, endX, endY) in boxes:           #scale the bounding box coordinates based on the respective           #ratios           startX= int(startX * rW)           startY= int(startY * rH)           endX= int(endX * rW)           endY= int(endY * rH)            #draw the bounding box on the image           cv2.rectangle(orig,(startX, startY), (endX, endY), (0, 255, 0), 2) # show the output imagecv2.imshow("Text Detection", orig)cv2.waitKey(0)

如前一节所述,我无法在我的OpenCV 4安装(cv2.dnn.NMSBoxes)中使用非最大值抑制,因为Python绑定没有返回值,最终导致OpenCV出错。我没有完全能够在OpenCV 3.4.2中进行测试,因此它可以在v3.4.2中运行。

相反,我使用了imutils软件包(第114行)中提供的非最大化抑制实现。结果仍然看起来不错;但是,我无法将我的输出与NMSBoxes函数进行比较,以查看它们是否相同。

117-126行在我们的边界框上循环,将坐标缩放回原始图像尺寸,然后将输出绘制到我们的原始图像。显示原始图像,直到按下某个键(第129和130行)。

作为最后的实现说明,我想提到我们两个嵌套的for循环,用于循环68-110行上的得分和几何体体积,这是一个很好的例子,您可以在其中利用Cython极大地加速您的管线。我已经通过OpenCV和Python在经过优化的快速“像素”像素循环中展示了Cython的功能。

您准备好对图像应用文本检测了吗?

首先抓住此博客文章的“下载”,然后解压缩文件。

从那里,您可以在终端中执行以下命令(注意两个命令行参数):

$ python text_detection.py --imageimages/lebron_james.jpg            --eastfrozen_east_text_detection.pb[INFO] loading EAST text detector...[INFO] text detection took 0.142082 seconds

输入结果如下

图4:著名的篮球运动员LebronJames的球衣文本已通过OpenCV和EAST文本检测成功识别。

$ python text_detection.py --image images/car_wash.png           --eastfrozen_east_text_detection.pb[INFO] loading EAST text detector...[INFO] text detection took 0.142295 seconds

图5:在这个自然的洗车场中,使用EAST使用Python和OpenCV可以轻松识别文本。

最后,我们将尝试一个路标:

$ python text_detection.py --image images/sign.jpg           --eastfrozen_east_text_detection.pb[INFO] loading EAST text detector...[INFO] text detection took 0.141675 seconds

图6:使用Python +OpenCV进行场景文本检测,并且EAST文本检测器成功检测到此西班牙停车标志上的文本。

opencv 文字识别_Python+opencv+EAST做自然场景文本检测!相关推荐

  1. 自然场景文本检测识别技术集合(转)

    本文及其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习与应用>,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造,自2019年1月出版以来已重印3次. 书的购买链接 书的勘 ...

  2. 自然场景文本检测识别技术综述

    其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造. 书的购买链接 书的勘误,优化,源代码资源 番外青蛇 ...

  3. 论文翻译:自然场景文本检测与识别综述

    论文翻译:自然场景文本检测与识别综述 引言 介绍 文章回顾 文本检测 文本识别 实验结果 总结和未来工作展望 引言 自然图片的检测和识别是计算机视觉领域的两个主要的问题,在运动视频分析,自动驾驶,工业 ...

  4. EAST 自然场景文本检测

    自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面. 刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate Scene Te ...

  5. 自然场景文本检测识别技术综述【转】

    转载自https://blog.csdn.net/SIGAI_CSDN/article/details/80858565 番外青蛇: 姐, 图像文本检测和识别领域现在的研究热点是什么? 白蛇: 白纸黑 ...

  6. 文字识别(五)--自然场景文本检测技术综述(CTPN, SegLink, EAST)

    转自:https://www.cnblogs.com/skyfsm/p/9776611.html 文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文 ...

  7. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)

    文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...

  8. MSER — 自然场景文本检测

    MSER是最大稳定极值区域:是对一幅灰度图像(灰度值为0-255)取阈值进行二值化处理,阈值从0到255依次递增.阈值的递增类似于分水岭算法中的水面的上升,随着水面的上升,有一些较矮的丘陵会被淹没,如 ...

  9. 选字验证码破解思路:CTPN - 自然场景文本检测

    前言 最近准备极验3代,选字验证码的破解.之前用CNN实现端到端的字符型验证码破解已满足不了需求了,我以为破解选字验证码关键步骤有三:1.图片文本的识别:2.字符坐标的识别:3.字序的识别.设计的技术 ...

最新文章

  1. 思科OSPF辅助地址
  2. t’触发器真值表和状态方程_清写出触发器按逻辑特性的分类;写出T触发器的状态方程。...
  3. 计算机网络IP分配大题,2018年IP分片网络大题
  4. 使用SDKMAN包管理器,在BSD-Unix系统上快捷安装软件(MacOS/OpenBSD/Solaris)
  5. Fedora 14 下成功驱动BCM4312的步骤
  6. 麻瓜编程python爬虫微专业_微专业:Python Web开发工程师(零基础课程),麻瓜编程侯爵主讲 价值2400元...
  7. linux桌面共享编程,Remmina:一个Linux下功能丰富的远程桌面共享工具
  8. java restsharp_如何在asp.net核心中使用RestSharp.NetCore (How to use RestSharp.NetCore in asp.net core)...
  9. 超图iServer rest服务之最佳路径分析
  10. CAN通讯程序C语言,基于单片机的CANBUS程序(C语言)
  11. pc机 串口 并口 com口 详解
  12. Pandas08--文本数据
  13. 使用python实现新浪微博登陆
  14. linux 日志报警,linux日志报警怎么解决
  15. BUG处理:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path buil
  16. Scala语法汇集ABC
  17. ubuntu20.04 GPU基准测试
  18. 微信小程序拒绝定位之后 如何再次开启以及判断是否打开了系统定位功能
  19. 1-SII--SharedPreferences完美封装
  20. 支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247

热门文章

  1. C++ STL map 中insert函数返回值问题
  2. Tensorflow——Tensorflow的用途、安装、数据流图
  3. LeetCode 56. 合并区间(合并区间+排序)
  4. 计算机装配调试员培训内容.doc,电子计算机装配调试员理论培训文档.doc
  5. mysql查球队胜场和败场sql_NBA球队_nba有哪些球队_NBA史上实力最弱的球队是哪个?用Python+SQL我们找到了答案...
  6. python下的selenium和PhantomJS
  7. jenkins 关联 钉钉机器人
  8. Java并发编程知识总结
  9. 老李分享:android手机测试之适配(1)
  10. MD5加密以及产生唯一的ID