【问题标题】:How to make bounding box around text-areas in an image? (Even if text is skewed!!)如何在图像中的文本区域周围制作边界框? (即使文字歪斜!!)
【发布时间】:2019-02-22 07:19:57
【问题描述】:

我正在尝试从任何消费品广告的屏幕截图中检测和抓取文本。

我的代码以一定的精度工作,但未能在倾斜的文本区域周围制作边界框。

最近我尝试了 Google Vision API,它在几乎所有可能的文本区域周围制作边界框,并以极高的准确度检测该区域中的文本。我很好奇如何实现相同或相似!

我的测试图:

边界框后的 Google Vision API:

提前谢谢你:)

【问题讨论】:

  • I am curious about how can I achieve the same or similar!,通过手动操作,打开每个图像,并在 Microsoft 绘图中绘制框。说真的,你在这里问什么?谷歌有成千上万的员工在研究他们的算法。您希望获得类似的结果吗?有很多不同的文本分类算法,试着挑一个写一些代码。
  • 你可以学习这个教程:learnopencv.com/…
  • 我知道我不能一拍即合!我想知道背后的逻辑是什么,可能是什么高深算法的名字。
  • @TathyaKapadia 没有这么高深的算法。所有用于文本检测的 ML 技术都是众所周知的。任何随机的 Joe Shmoe 都可以编写深度学习文本检测算法。它的成功完全取决于实施的细微差别。人们获得博士学位以了解如何调整这些模型的参数,以及如何级联不同模型的集合以获得良好的结果。它拥有多年的研究和经验。
  • 如果你只是想给你的朋友留下深刻印象,实际上是谷歌搜索,“python 文本检测图像”将为你提供诸如 this one 之类的教程,顺便说一句,这是第一次点击。

标签: opencv imagemagick bounding-box google-vision python-tesseract


【解决方案1】:

有一些开源视觉包能够检测嘈杂背景图像中的文本,可与 Google 的 Vision API 相媲美。

您可以使用 Zhou 等人的称为 EAST(高效准确的场景文本检测器)的固定卷积层简单架构。 https://arxiv.org/abs/1704.03155v2

使用 Python:

https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz?dl=1 下载预训练模型。 将模型提取到当前文件夹。

您需要 OpenCV >= 3.4.2 才能执行以下命令。

import cv2
import math
net = cv2.dnn.readNet("frozen_east_text_detection.pb")   #This is the model we get after extraction
frame = cv2.imread(<image_filename>)
inpWidth = inpHeight = 320  # A default dimension
# Preparing a blob to pass the image through the neural network
# Subtracting mean values used while training the model.
image_blob = cv2.dnn.blobFromImage(frame, 1.0, (inpWidth, inpHeight), (123.68, 116.78, 103.94), True, False)

现在我们必须定义输出层,它会生成检测到的文本的位置值及其置信度分数(通过 Sigmoid 函数)

output_layer = []
output_layer.append("feature_fusion/Conv_7/Sigmoid")
output_layer.append("feature_fusion/concat_3")

最后我们将通过网络进行前向传播以获得所需的输出。

net.setInput(image_blob)
output = net.forward(output_layer)
scores = output[0]
geometry = output[1]

这里我使用了opencv的github页面https://github.com/opencv/opencv/blob/master/samples/dnn/text_detection.py中定义的解码函数将位置值转换为框坐标。 (第 23 到 75 行)。

对于框检测阈值,我使用了 0.5 的值,对于非最大抑制,我使用了 0.3。您可以尝试不同的值来获得更好的边界框。

confThreshold = 0.5
nmsThreshold = 0.3
[boxes, confidences] = decode(scores, geometry, confThreshold)
indices = cv2.dnn.NMSBoxesRotated(boxes, confidences, confThreshold, nmsThreshold)

最后,将框覆盖在图像中检测到的文本上:

height_ = frame.shape[0]
width_ = frame.shape[1]
rW = width_ / float(inpWidth)
rH = height_ / float(inpHeight)

for i in indices:
    # get 4 corners of the rotated rect
    vertices = cv2.boxPoints(boxes[i[0]])
    # scale the bounding box coordinates based on the respective ratios
    for j in range(4):
        vertices[j][0] *= rW
        vertices[j][1] *= rH
    for j in range(4):
        p1 = (vertices[j][0], vertices[j][1])
        p2 = (vertices[(j + 1) % 4][0], vertices[(j + 1) % 4][1])
        cv2.line(frame, p1, p2, (0, 255, 0), 3)

# To save the image:
cv2.imwrite("maggi_boxed.jpg", frame)

我没有尝试过不同的阈值。更改它们肯定会带来更好的结果,并且还会消除将徽标误分类为文本的问题。

注意:该模型是在英语语料库上训练的,因此不会检测到印地语单词。您还可以阅读这篇论文,其中概述了它作为基准的测试数据集。

【讨论】:

    【解决方案2】:

    您需要检查是否有任何库为文本提供坐标,然后您可以在文本周围绘制框。 OCR 库

    1) Python pyocr 和 tesseract ocr over python

    2) 使用 R 语言(从 PDF 中提取文本;进行 OCR;全部在 R 中)

    3) Java/Pyspark 中的 Tesseract 库

    4) 阿帕奇蒂卡

    5) Python - OpenCV - 使用 kNN 对手写数据进行 OCR

    6)您可以通过 OpenCV 和 Python 执行相同的操作。

    免费 OCR 软件

    Google 和 HP 的 Tesseract 谷歌的保持 Microsoft Document Imaging (MODI)(假设我们大多数人都使用 Windows 操作系统) 微软一注 Microsoft Oxford Project API(此 API 在一段时间前免费) FreeOCR(这又是基于 Tesseract 引擎) 还有更多,但这些是最好的,如果您正在寻找准确性,Microsoft Document Imaging 会做得更好。如果您正在寻找手写文本 ocr 转换,那么 Google 的 Keep 会做得更好。

    商业产品

    Adobe Acrobat Pro(RTF 文件格式为您提供最佳效果) 俘虏 艾比 Informatica(不确定 Informatica 中的哪个模块) IBM 数据捕获 (Datacap) (IBM Watson) 如果准确性只是您的主要限制条件,那么您的服务中存在前所未有的数据访问(captricity)之类的东西,它拥有 99% 的准确性,因为他们将人员聚集在一起并让他们在不影响安全性的情况下转换手写文本。

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2014-07-24
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2014-01-14
      • 2021-12-03
      相关资源
      最近更新 更多