Объект ответа от Google Vision Api protobuf на словарь Python - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над проектом, в котором мне нужно проанализировать изображение с помощью Google Vision API и опубликовать ответ в таблицу Dynamodb.

Я успешно реализовал API Vision, но не смог преобразовать его ответ в словарь Python.

Вот что я пробовал:

       if form.is_valid():
            obj = form
            obj.imageFile = form.cleaned_data['imageFile']
            obj.textFile = form.cleaned_data['textFile']
            obj.save()
            print(obj.imageFile)
            # Process the image using Google's vision API
            image_path = os.path.join(settings.MEDIA_ROOT, 'images/', obj.imageFile.name)
            print(image_path)
            image = vision_image_manager(image_path)
            text_path = os.path.join(settings.MEDIA_ROOT, 'texts/', obj.textFile.name)
            text = nlp_text_manager(text_path)
            # print(image)
            # print(text)
            results = {
                'imageResponse': image,
                'textResult': text
            }
            print(results.values())
            print(type(results))
            post_to_dynamo_db(image, text)

Вот реализация Vision API:

def vision_image_manager(image_file):
    # Instantiates a client
    client = vision.ImageAnnotatorClient()
    file_name = str(image_file)
    with open(file_name, 'rb') as img_file:
        content = img_file.read()
    image = types.Image(content=content)
    response = client.label_detection(image=image)
    labels = response.label_annotations
    print('Labels:')
    for label in labels:
        print(label.description)
    return labels

А вот и post_to_dynamo_db Функция:

def post_to_dynamo_db(image, text):
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY
)
client = session.resource('dynamodb')
table = client.Table('basetbl')
result_dict = {
    'image': image,
    'text': text
}
json_dict = dict_to_item(result_dict)
# item = dict_to_item(result_dict)
table.put_item(
    Item={
        'id': int(generate_pid()),
        'response_obj': json_dict
    }
)

Теперь, он не возвращает никакой ошибки, но response_obj не размещен в таблице базы данных, потому что это неправильная форма объекта, проблема здесь в том, что <class 'google.protobuf.pyext._message.RepeatedCompositeContainer'> тип ответа возвращается из API Google.

1 Ответ

0 голосов
/ 05 мая 2018

Лучший способ получить правильный ответ от Python от Vision API - это использовать этот API через службу Google Discovery.

Вот как это будет работать для вас:

def vision_image_manager(image_file):
    # Instantiates a client
    service = discovery.build('vision', 'v1', credentials=credentials)
    # text.png is the image file.
    file_name = str(image_file)
    with open(file_name, 'rb') as image:
        image_content = base64.b64encode(image.read())
        service_request = service.images().annotate(body={
            'requests': [{
                'image': {
                    'content': image_content.decode('UTF-8')
                },
                'features': [{
                    'type': 'LABEL_DETECTION',
                }]
            }]
        })
    response = service_request.execute()
    print(response['responses'])
    res_dict = dict(response)
    return res_dict
...