为什么 GCP Vision API 在 python 中返回的结果比在线演示中的结果更差

2023-11-26

我编写了一个基本的 python 脚本来调用和使用 GCP Vision API。我的目标是向其发送产品图像并检索(使用 OCR)此盒子上写的文字。我有一个预定义的品牌列表,因此我可以在 API 返回的文本中搜索品牌并检测它是什么。

我的Python脚本如下:

import  io
from google.cloud import vision
from google.cloud.vision import types
import os
import cv2
import numpy as np

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "**************************"


def detect_text(file):
    """Detects text in the file."""
    client = vision.ImageAnnotatorClient()

    with io.open(file, 'rb') as image_file:
        content = image_file.read()

    image = types.Image(content=content)

    response = client.text_detection(image=image)
    texts = response.text_annotations
    print('Texts:')

    for text in texts:
        print('\n"{}"'.format(text.description))

        vertices = (['({},{})'.format(vertex.x, vertex.y)
                    for vertex in text.bounding_poly.vertices])

        print('bounds: {}'.format(','.join(vertices)))


file_name = "Image.jpg"
img = cv2.imread(file_name)

detect_text(file_name)

For now, I am experimenting with the following product image: enter image description here (951 × 335 resolution)

它的品牌是Acuvue.

问题如下。当我测试 GCP Cloud Vision API 的在线演示时,我得到了该图像的以下文本结果:

FOR ASTIGMATISM 1-DAY ACUVUE MOIST WITH LACREON™ 30 Lenses BRAND CONTACT LENSES UV BLOCKING

(此 json 结果返回所有上述单词,包括单词Acuvue这对我来说很重要,但是 json 太长,无法发布到这里)

因此,在线演示可以很好地检测产品上的文本,至少可以准确地检测到单词Acuvue(这是品牌)。但是,当我在 python 脚本中使用相同的图像调用相同的 API 时,我得到以下结果:

Texts:

"1.DAY
FOR ASTIGMATISM
WITH
LACREONTM
MOIS
30 Lenses
BRAND CONTACT LENSES
UV BLOCKING
"
bounds: (221,101),(887,101),(887,284),(221,284)

"1.DAY"
bounds: (221,101),(312,101),(312,125),(221,125)

"FOR"
bounds: (622,107),(657,107),(657,119),(622,119)

"ASTIGMATISM"
bounds: (664,107),(788,107),(788,119),(664,119)

"WITH"
bounds: (614,136),(647,136),(647,145),(614,145)

"LACREONTM"
bounds: (600,151),(711,146),(712,161),(601,166)

"MOIS"
bounds: (378,162),(525,153),(528,200),(381,209)

"30"
bounds: (614,177),(629,178),(629,188),(614,187)

"Lenses"
bounds: (634,178),(677,180),(677,189),(634,187)

"BRAND"
bounds: (361,210),(418,210),(418,218),(361,218)

"CONTACT"
bounds: (427,209),(505,209),(505,218),(427,218)

"LENSES"
bounds: (514,209),(576,209),(576,218),(514,218)

"UV"
bounds: (805,274),(823,274),(823,284),(805,284)

"BLOCKING"
bounds: (827,276),(887,276),(887,284),(827,284)

但这根本没有像演示那样检测到“Acuvue”这个词!

为什么会发生这种情况?

我可以修复 python 脚本中的某些内容以使其正常工作吗?


来自文档:

Vision API 可以检测并提取图像中的文本。有两种支持 OCR 的注释功能:

  • TEXT_DETECTION 从任何图像中检测并提取文本。例如,照片可能包含街道标志或交通标志。 JSON 包括整个提取的字符串、单个单词及其边界框。

  • DOCUMENT_TEXT_DETECTION 还从图像中提取文本,但响应针对密集文本和文档进行了优化。 JSON 包括页面、块、段落、单词和中断信息。)

我希望 Web API 实际上使用后者,然后根据置信度过滤结果。

DOCUMENT_TEXT_DETECTION 响应包括附加布局信息,例如页面、块、段落、单词和中断信息,以及每个信息的置信度分数。

无论如何,我希望(我的经验是)后一种方法会“更加努力”地找到所有字符串。

我不认为你做任何“错误”的事情。只有两种并行检测方法。其中一种 (DOCUMENT_TEXT_DETECTION) 更为密集,针对文档进行了优化(可能针对拉直、对齐和均匀间隔的线条),并提供了更多对于某些应用程序可能不需要的信息。

所以我建议你按照Python修改你的代码例子在这里.

最后,我的猜测是\342\204\242您询问的是与 utf-8 字符相对应的转义八进制值,它认为在尝试识别 ™ 符号时找到了它。

如果您使用以下代码片段:

b = b"\342\204\242"
s = b.decode('utf8')
print(s)

您会很高兴看到它打印™。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 GCP Vision API 在 python 中返回的结果比在线演示中的结果更差 的相关文章

随机推荐