Многопроцессорная обработка нескольких изображений с помощью Rekognition в Python - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь определить метки нескольких изображений с помощью AWS Rekognition в Python.Этот процесс требует около 3 секунд, чтобы изображение было помечено.Можно ли как-нибудь маркировать эти изображения параллельно?

Поскольку я ограничен использованием сеансов boto3, предоставьте фрагмент кода, если это возможно.

1 Ответ

0 голосов
/ 13 июня 2018

Лучшее, что вы можете сделать, это вместо того, чтобы запускать код на локальном компьютере, запускать его в облаке как функцию.С AWS Lambda вы можете сделать это легко.Просто добавьте загрузку объекта s3 в качестве триггера к вашей лямбде, всякий раз, когда любое изображение будет загружено в вашу корзину s3, оно будет запускать вашу лямбда-функцию и будет detect_labels , а затем вы можете использовать эти метки так, как вы хотитевы можете даже сохранить их в таблицу динамодаб для последующего использования и извлечь их из этой таблицы.

Лучше всего, если вы загружаете несколько изображений одновременно, тогда каждое изображение будет выполняться параллельно, поскольку лямбда обладает высокой масштабируемостью и вы получаетевсе результаты одновременно.

Пример кода для того же:

from __future__ import print_function

import boto3
from decimal import Decimal
import json
import urllib

print('Loading function')

rekognition = boto3.client('rekognition')


# --------------- Helper Functions to call Rekognition APIs ------------------





def detect_labels(bucket, key):
    response = rekognition.detect_labels(Image={"S3Object": {"Bucket": bucket, "Name": key}})

    # Sample code to write response to DynamoDB table 'MyTable' with 'PK' as Primary Key.
    # Note: role used for executing this Lambda function should have write access to the table.
    #table = boto3.resource('dynamodb').Table('MyTable')
    #labels = [{'Confidence': Decimal(str(label_prediction['Confidence'])), 'Name': label_prediction['Name']} for label_prediction in response['Labels']]
    #table.put_item(Item={'PK': key, 'Labels': labels})
    return response



# --------------- Main handler ------------------


def lambda_handler(event, context):

    # Get the object from the event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
    try:
        #Calls rekognition DetectLabels API to detect labels in S3 object
        response = detect_labels(bucket, key)
        print(response)

        return response
    except Exception as e:
        print(e)
        print("Error processing object {} from bucket {}. ".format(key, bucket) +
              "Make sure your object and bucket exist and your bucket is in the same region as this function.")
        raise e
...