视觉API:如何获取JSON输出

时间:2018-09-04 15:06:35

标签: google-api google-cloud-platform google-vision

我无法保存Google Vision API给出的输出。我正在使用Python并使用演示图像进行测试。我收到以下错误:

TypeError: [mid:...] + is not JSON serializable

我执行的代码:

import io
import os
import json
# Imports the Google Cloud client library
from google.cloud import vision
from google.cloud.vision import types

# Instantiates a client
vision_client = vision.ImageAnnotatorClient()


# The name of the image file to annotate
file_name = os.path.join(
    os.path.dirname(__file__),
    'demo-image.jpg') # Your image path from current directory

# Loads the image into memory
with io.open(file_name, 'rb') as image_file:
    content = image_file.read()
    image = types.Image(content=content)

# Performs label detection on the image file
response = vision_client.label_detection(image=image)
labels = response.label_annotations


print('Labels:')
for label in labels:
    print(label.description, label.score, label.mid)

with open('labels.json', 'w') as fp:
   json.dump(labels, fp)

输出出现在屏幕上,但是我不知道该如何保存。有人有建议吗?

4 个答案:

答案 0 :(得分:1)

也许您已经能够找到解决问题的方法(如果是这种情况,我也邀请您分享它作为对您自己帖子的回答),但是无论如何,让我分享一些可能对于遇到类似问题的其他用户有用:

正如您可以在Python中使用type()函数进行检查一样, response google.cloud.vision_v1.types.AnnotateImageResponse type的对象,而 labels[i] google.cloud.vision_v1.types.EntityAnnotation type的对象。正如您正在尝试做的那样,它们似乎都没有现成的实现来将它们转换为JSON,因此,我相信在 {{中转换每个EntityAnnotation的最简单方法1}} 是将它们转换成Python字典,然后将它们全部组合成一个数组,然后将其转换为JSON。

为此,我向您的代码段添加了一些简单的代码行:

labels

答案 1 :(得分:1)

我能够使用以下功能保存输出:

# Save output as JSON
def store_json(json_input):
    with open(json_file_name, 'a') as f:
        f.write(json_input + '\n')

正如@dsesto所述,我必须定义一个字典。在这本词典中,我定义了我想在输出中保存的信息类型。

with open(photo_file, 'rb') as image:
    image_content = base64.b64encode(image.read())
    service_request = service.images().annotate(
        body={
            'requests': [{
                'image': {
                    'content': image_content
                },
                'features': [{
                    'type': 'LABEL_DETECTION',
                    'maxResults': 20,
                },
                    {
                        'type': 'TEXT_DETECTION',
                        'maxResults': 20,
                    },
                        {
                            'type': 'WEB_DETECTION',
                            'maxResults': 20,
                        }]
            }]
        })

答案 2 :(得分:0)

当前Vision库中的对象缺少序列化功能(尽管这是一个好主意)。

值得注意的是,他们将在可能的情况下为Vision发布一个完全不同的库(虽然它尚未发布给PyPI,但它现在是视觉的仓库的主人,尽管它尚未发布给PyPI)。请注意,这是一个向后不兼容的升级,因此会付出一些努力(希望不会太多)。

该库返回普通的protobuf对象,可以使用以下方法将其序列化为JSON:

from google.protobuf.json_format import MessageToJson
serialized = MessageToJson(original)

您还可以使用类似protobuf3-to-dict

答案 3 :(得分:0)

有一个由Google发布的图书馆

which

from google.protobuf.json_format import MessageToJson