如何在图像中的文本区域周围绘制边界框?(即使文本倾斜!!)

6

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

我的代码在一定的准确度下工作,但无法在倾斜的文本区域周围制作边界框。

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

我的测试图片:

enter image description here

Google Vision API在边界框之后:

enter image description here

提前感谢您:)


您可以参考以下教程:https://www.learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/ - Bahramdun Adil
我知道我不能一拍就做到同样的事情!我想知道背后的逻辑,也许是某个深奥算法的名称。 - Tathya Kapadia
@TathyaKapadia,没有这样深奥的算法。所有用于文本检测的机器学习技术都是众所周知的。任何随机的Joe Shmoe都可以编写一个深度学习文本检测算法。它的成功完全取决于实现的细微差别。人们需要获得博士学位才能理解如何调整这些模型的参数,以及如何级联不同模型的集合以实现良好的结果。这需要多年的研究和经验。 - darksky
如果你只是想给朋友留下深刻印象,直接在谷歌上搜索“python文本检测图像”就会找到一些教程,比如这个,顺便说一句,这是第一个搜索结果。 - darksky
ImageMagick没有文本识别、检测或OCR功能。但是,如果您可以以某种方式创建一个仅包含所需文本的掩码,则可以在ImageMagick 7.0.10.2或更高版本中获取旋转边界框。请参见https://imagemagick.org/script/convex-hull.php#box。 - fmw42
2个回答

16
有几个开源视觉包可以检测嘈杂背景图像中的文本,与谷歌的Vision API相当。您可以使用名为EAST(Efficient and Accurate Scene Text Detector)的简单固定卷积层架构,由Zhou等人提出。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函数)。{{Sigmoid函数是一种常用的激活函数,将任意实数映射到0和1之间。}}
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页面中定义的decode函数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)

Maggi's Ad with bounding boxes

我没有尝试过不同的阈值值。改变它们肯定会产生更好的结果,并消除将标志错误分类为文本的情况。

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


1
您需要检查这些库是否提供了将坐标转换为文本的功能,然后您可以在文本周围绘制框。OCR库
1)Python pyocr和tesseract ocr over python
2)使用R语言(从PDF中提取文本;进行OCR;所有内容都在R内部)
3)Java / Pyspark中的Tesseract库
4)Apache Tika
5)Python-OpenCV-kNN识别手写数据的OCR
6)您可以通过OpenCV和Python完成相同的操作。
免费OCR软件
谷歌和惠普的Tesseract Google Keep Microsoft文档成像(MODI)(假设我们大多数人都有Windows操作系统) Microsoft One Note Microsoft Oxford Project API(此API免费一段时间) FreeOCR(这又是基于Tesseract引擎的) 还有很多,但这些是最好的,其中如果您正在寻找准确性,则Microsoft Document Imaging可以更好地完成工作。如果您正在寻找手写文本OCR转换,则Google Keep可以更好地完成工作。
商业产品

Adobe Acrobat Pro(RTF文件格式可获得最佳结果) Captiva Abbyy Informatica(不确定是Informatica中的哪个模块) IBM Datacapture(Datacap)(IBM Watson) 如果准确性是您唯一的主要限制,则有类似于Unprecedented Data Access at your Service(captricity)的东西,它以99%的准确性自豪,因为他们通过众包人员将手写文本转换而不会影响安全性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接