Vision API: как получить JSON-вывод - PullRequest
0 голосов
/ 04 сентября 2018

У меня проблемы с сохранением вывода, предоставленного API Google Vision. Я использую 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 голосов
/ 03 апреля 2019

Существует библиотека, выпущенная Google

from google.protobuf.json_format import MessageToJson

webdetect = vision_client.web_detection(blob_source) jsonObj = MessageToJson(webdetect)

0 голосов
/ 19 декабря 2018

Мне удалось сохранить вывод с помощью следующей функции:

# 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,
                        }]
            }]
        })
0 голосов
/ 20 декабря 2018

В объектах текущей библиотеки Vision отсутствуют функции сериализации (хотя это хорошая идея).

Стоит отметить, что они собираются выпустить существенно другую библиотеку для Vision (сейчас она находится на репозитории master of vision, хотя еще не выпущена для PyPI), где это будет возможно. Обратите внимание, что это несовместимое назад обновление, поэтому потребуется некоторое (надеюсь, не слишком) преобразование.

Эта библиотека возвращает простые объекты protobuf, которые можно сериализовать в JSON, используя:

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

Вы также можете использовать что-то вроде protobuf3-to-dict

0 голосов
/ 12 декабря 2018

Возможно, вы уже смогли найти решение своей проблемы (если это так, я приглашаю вас поделиться им как ответом на свой собственный пост), но в любом случае позвольте мне поделиться некоторыми заметками, которые могут быть полезным для других пользователей с похожей проблемой:

Как вы можете проверить с помощью функции type() в Python, response является объектом google.cloud.vision_v1.types.AnnotateImageResponse типа , тогда как labels[i] является объектом google.cloud.vision_v1.types.EntityAnnotation типа . Кажется, что ни у одного из них нет какой-либо готовой реализации для преобразования их в JSON, как вы пытаетесь это сделать, поэтому я считаю, что самый простой способ преобразовать каждый из EntityAnnotation в labels будет превращать их в словари Python, затем группировать их в массив и преобразовывать в JSON.

Для этого я добавил несколько простых строк кода в ваш фрагмент:

[...]

label_dicts = [] # Array that will contain all the EntityAnnotation dictionaries

print('Labels:')
for label in labels:
    # Write each label (EntityAnnotation) into a dictionary
    dict = {'description': label.description, 'score': label.score, 'mid': label.mid}

    # Populate the array
    label_dicts.append(dict) 

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