Analysieren von Bildern mit einer Funktion AWS Lambda - Rekognition

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Analysieren von Bildern mit einer Funktion AWS Lambda

AWS Lambda ist ein Rechenservice, mit dem Sie Code ausführen können, ohne Server bereitzustellen oder zu verwalten. Sie können beispielsweise Bilder analysieren, die von einer mobilen Anwendung aus übermittelt wurden, ohne einen Server für den Anwendungscode einrichten zu müssen. Die folgenden Anweisungen zeigen, wie Sie in Python eine Lambda-Funktion erstellen, die aufruft DetectCustomLabels. Die Funktion analysiert ein bereitgestelltes Bild und gibt eine Liste der im Bild gefundenen Labels zurück. Die Anweisungen enthalten einen Python-Beispielcode, der zeigt, wie die Lambda-Funktion mit einem Bild in einem Amazon-S3-Bucket oder einem von einem lokalen Computer bereitgestellten Bild aufgerufen wird.

Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole)

In diesem Schritt erstellen Sie eine leere AWS Funktion und eine IAM Ausführungsrolle, mit der Ihre Funktion den DetectCustomLabels Vorgang aufrufen kann. Es gewährt auch Zugriff auf den Amazon-S3-Bucket, in dem Bilder zur Analyse gespeichert werden. Sie geben auch Umgebungsvariablen für Folgendes an:

  • Das Amazon Rekognition Custom Labels-Modell, das Ihre Lambda-Funktion verwenden soll.

  • Das Konfidenzlimit, das das Modell verwenden soll.

Später fügen Sie der Lambda-Funktion den Quellcode und optional eine Ebene hinzu.

Um eine AWS Lambda Funktion (Konsole) zu erstellen
  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die AWS Lambda Konsole unter https://console.aws.amazon.com/lambda/.

  2. Wählen Sie Funktion erstellen aus. Weitere Informationen zur Verwendung von Lambda finden Sie unter Erstellen einer Lambda-Funktion mit der Konsole.

  3. Wählen Sie aus den folgenden Optionen.

    • Wählen Sie Von Grund auf neu schreiben aus.

    • Geben Sie einen Wert für Name der Funktion ein.

    • Wählen Sie für Laufzeit die Option Python 3.10 aus.

  4. Wählen Sie Funktion erstellen aus, um die AWS Lambda -Funktion zu erstellen.

  5. Wählen Sie auf der Seite der Funktion den Tab Konfiguration aus.

  6. Wählen Sie im Abschnitt Umgebungsvariablen Bearbeiten aus.

  7. Fügen Sie die folgenden Umgebungsvariablen hinzu. Wählen Sie für jede Variable die Option Umgebungsvariable hinzufügen und geben Sie dann den Variablenschlüssel und den Wert ein.

    Schlüssel Wert

    MODEL_ARN

    Der Amazon-Ressourcenname (ARN) des Modells, das Ihre Lambda-Funktion verwenden soll. Sie können das Modell ARN auf der Detailseite des Modells in der Amazon Rekognition Custom Labels-Konsole auf der Registerkarte Modell verwenden aufrufen.

    CONFIDENCE

    Der Mindestwert (0-100) für das Vertrauen des Modells in die Vorhersage für ein Label. Die Lambda-Funktion gibt keine Labels zurück, deren Konfidenzwerte unter diesem Wert liegen.

  8. Wählen Sie Speichern, um die Umgebungsvariablen zu speichern.

  9. Wählen Sie im Bereich Berechtigungen unter Rollenname die Ausführungsrolle aus, um die Rolle in der IAM Konsole zu öffnen.

  10. Wählen Sie auf der Registerkarte Berechtigungen die Optionen Berechtigungen hinzufügen und dann Inline-Richtlinie erstellen aus.

  11. Wählen Sie die bestehende Richtlinie aus JSONund ersetzen Sie sie durch die folgende Richtlinie.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. Wählen Sie Weiter.

  13. Geben Sie unter Richtliniendetails einen Namen für die Richtlinie ein, z. B. DetectCustomLabels-access.

  14. Wählen Sie Create Policy (Richtlinie erstellen) aus.

  15. Wenn Sie Bilder zur Analyse in einem Amazon-S3-Bucket speichern, wiederholen Sie die Schritte 10-14.

    1. Verwenden Sie für Schritt 11 die folgende Richtlinie. Ersetzen bucket/folder path mit dem Amazon S3 S3-Bucket und dem Ordnerpfad zu den Bildern, die Sie analysieren möchten.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/folder path/*" } ] }
    2. Wählen Sie für Schritt 13 einen anderen Richtliniennamen aus, z. B. S3Bucket-access.

Schritt 2: (Optional) Erstellen einer Ebene (Konsole)

Um dieses Beispiel auszuführen, müssen Sie diesen Schritt nicht ausführen. Die DetectCustomLabels Operation ist in der standardmäßigen Lambda-Python-Umgebung als Teil von AWS SDK for Python (Boto3) enthalten. Wenn andere Teile Ihrer Lambda-Funktion aktuelle AWS Service-Updates benötigen, die sich nicht in der Standard-Lambda-Python-Umgebung befinden, führen Sie diesen Schritt aus, um Ihrer Funktion die neueste SDK Boto3-Version als Ebene hinzuzufügen.

Zunächst erstellen Sie ein ZIP-Dateiarchiv, das die Boto3-Datei enthält. SDK Anschließend erstellen Sie eine Ebene und fügen der Ebene das ZIP-Dateiarchiv hinzu. Weitere Informationen finden Sie unter Verwenden von Ebenen mit Ihrer Lambda-Funktion.

So erstellen Sie eine Ebene und fügen eine hinzu (Konsole)
  1. Öffnen Sie eine Eingabeaufforderung und geben Sie dann die folgenden Befehle ein.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. Notieren Sie sich den Namen der Zip-Datei (boto3-layer.zip). Sie benötigen ihm im Schritt 6 dieses Vorgangs.

  3. Öffnen Sie die Konsole unter AWS Lambda . https://console.aws.amazon.com/lambda/

  4. Wählen Sie im Navigationsbereich Ebenen aus.

  5. Wählen Sie Ebene erstellen aus.

  6. Geben Sie einen Namen und eine Beschreibung ein.

  7. Wählen Sie Zip-Datei hochladen und dann Upload aus.

  8. Wählen Sie im Dialogfeld das ZIP-Dateiarchiv (boto3-layer.zip) aus, das Sie in Schritt 1 dieses Vorgangs erstellt haben.

  9. Wählen Sie für kompatible Laufzeiten Python 3.9.

  10. Wählen Sie Erstellen, um die Ebene zu erstellen.

  11. Wählen Sie das Menüsymbol im Navigationsbereich.

  12. Wählen Sie im Navigationsbereich Funktionen aus.

  13. Wählen Sie in der Ressourcenliste die Funktion aus, die Sie in Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole) erstellt haben.

  14. Wählen Sie die Registerkarte Code.

  15. Wählen Sie im Bereich Ebenen die Option Ebene hinzufügen aus.

  16. Wählen Sie Benutzerdefinierte Ebenen.

  17. Wählen Sie unter Benutzerdefinierte Ebenen den Namen der Ebene aus, den Sie in Schritt 6 eingegeben haben.

  18. Wählen Sie unter Version die Version der Ebene aus, die 1 sein sollte.

  19. Wählen Sie Hinzufügen aus.

Schritt 3: Hinzufügen von Python-Code (Konsole)

In diesem Schritt fügen Sie Python-Code zu Ihrer Lambda-Funktion hinzu, indem Sie den Code-Editor der Lambda-Konsole verwenden. Der Code analysiert ein bereitgestelltes Bild mit DetectCustomLabels und gibt eine Liste der im Bild gefundenen Labels zurück. Das bereitgestellte Bild kann sich in einem Amazon-S3-Bucket befinden oder als Byte64-kodierte Bildbytes bereitgestellt werden.

So fügen Sie einen Python-Code hinzu (Konsole)
  1. Wenn Sie nicht in der Lambda-Konsole sind, gehen Sie wie folgt vor:

    1. Öffnen Sie die AWS Lambda Konsole unter https://console.aws.amazon.com/lambda/.

    2. Öffnen Sie die Lambda-Funktion, die Sie in Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole) erstellt haben.

  2. Wählen Sie die Registerkarte Code.

  3. Ersetzen Sie in der Codequelle den Code in lambda_function.py durch den folgenden Code:

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose An AWS lambda function that analyzes images with an the Amazon Rekognition Custom Labels model. """ import json import base64 from os import environ import logging import boto3 from botocore.exceptions import ClientError # Set up logging. logger = logging.getLogger(__name__) # Get the model ARN and confidence. model_arn = environ['MODEL_ARN'] min_confidence = int(environ.get('CONFIDENCE', 50)) # Get the boto3 client. rek_client = boto3.client('rekognition') def lambda_handler(event, context): """ Lambda handler function param: event: The event object for the Lambda function. param: context: The context object for the lambda function. return: The labels found in the image passed in the event object. """ try: # Determine image source. if 'image' in event: # Decode the image image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = {'Bytes': img_b64decoded} elif 'S3Object' in event: image = {'S3Object': {'Bucket': event['S3Object']['Bucket'], 'Name': event['S3Object']['Name']} } else: raise ValueError( 'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.') # Analyze the image. response = rek_client.detect_custom_labels(Image=image, MinConfidence=min_confidence, ProjectVersionArn=model_arn) # Get the custom labels labels = response['CustomLabels'] lambda_response = { "statusCode": 200, "body": json.dumps(labels) } except ClientError as err: error_message = f"Couldn't analyze image. " + \ err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": err.response['Error']['Code'], "ErrorMessage": error_message } } logger.error("Error function %s: %s", context.invoked_function_arn, error_message) except ValueError as val_error: lambda_response = { 'statusCode': 400, 'body': { "Error": "ValueError", "ErrorMessage": format(val_error) } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response
  4. Wählen Sie Implementieren aus, um Ihre Lambda-Funktion bereitzustellen.

Schritt 4: Testen Ihrer Lambda-Funktion

In diesem Schritt verwenden Sie Python-Code auf Ihrem Computer, um ein lokales Bild oder ein Bild in einem Amazon-S3-Bucket an Ihre Lambda-Funktion zu übergeben. Bilder, die von einem lokalen Computer übertragen werden, müssen kleiner als 6.291.456 Byte sein. Wenn Ihre Bilder größer sind, laden Sie die Bilder in einen Amazon-S3-Bucket hoch und rufen Sie das Skript mit dem Amazon S3-Pfad zum Bild auf. Weitere Informationen zum Hochladen von Dateien auf einen Amazon-S3-Bucket finden Sie unter Hochladen von Objekten.

Stellen Sie sicher, dass Sie den Code in derselben AWS Region ausführen, in der Sie die Lambda-Funktion erstellt haben. Sie können die AWS Region für Ihre Lambda-Funktion in der Navigationsleiste der Funktionsdetailseite in der Lambda-Konsole anzeigen.

Wenn die AWS Lambda Funktion einen Timeout-Fehler zurückgibt, verlängern Sie den Timeout-Zeitraum für die Lambda-Funktionsfunktion. Weitere Informationen finden Sie unter Funktionstimeout konfigurieren (Konsole).

Weitere Informationen zum Aufrufen einer Lambda-Funktion aus Ihrem Code finden Sie unter Funktionen aufrufen AWS Lambda.

So testen Sie Ihre Lambda-Funktion
  1. Achten Sie darauf, dass Sie die lambda:InvokeFunction-Berechtigung haben. Sie können die folgende Richtlinie verwenden.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "InvokeLambda", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "ARN for lambda function" } ] }

    Sie können die Funktion ARN für Ihre Lambda-Funktion aus der Funktionsübersicht in der Lambda-Konsole abrufen.

    Um Zugriff zu gewähren, fügen Sie Ihren Benutzern, Gruppen oder Rollen Berechtigungen hinzu:

  2. Installieren und konfigurieren Sie AWS SDK für Python. Weitere Informationen finden Sie unter Schritt 4: Richten Sie das ein AWS CLI and AWS SDKs.

  3. Starten Sie das Modell, das Sie in Schritt 7 von Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole) angegeben haben.

  4. Speichern Sie den folgenden Code in eine Datei mit dem Namen client.py.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Test code for running the Amazon Rekognition Custom Labels Lambda function example code. """ import argparse import logging import base64 import json import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def analyze_image(function_name, image): """Analyzes an image with an AWS Lambda function. :param image: The image that you want to analyze. :return The status and classification result for the image analysis. """ lambda_client = boto3.client('lambda') lambda_payload = {} if image.startswith('s3://'): logger.info("Analyzing image from S3 bucket: %s", image) bucket, key = image.replace("s3://", "").split("/", 1) s3_object = { 'Bucket': bucket, 'Name': key } lambda_payload = {"S3Object": s3_object} # Call the lambda function with the image. else: with open(image, 'rb') as image_file: logger.info("Analyzing local image image: %s ", image) image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} response = lambda_client.invoke(FunctionName=function_name, Payload=json.dumps(lambda_payload)) return json.loads(response['Payload'].read().decode()) def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "function", help="The name of the AWS Lambda function that you want " \ "to use to analyze the image.") parser.add_argument( "image", help="The local image that you want to analyze.") def main(): """ Entrypoint for script. """ try: logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") # Get command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() # Get analysis results. result = analyze_image(args.function, args.image) status = result['statusCode'] if status == 200: labels = result['body'] labels = json.loads(labels) print(f"There are {len(labels)} labels in the image.") for custom_label in labels: confidence = int(round(custom_label['Confidence'], 0)) print( f"Label: {custom_label['Name']}: Confidence: {confidence}%") else: print(f"Error: {result['statusCode']}") print(f"Message: {result['body']}") except ClientError as error: logging.error(error) print(error) if __name__ == "__main__": main()
  5. Führen Sie den Code aus. Geben Sie für das Befehlszeilenargument den Namen der Lambda-Funktion und das Bild an, das Sie analysieren möchten. Sie können einen Pfad zu einem lokalen Image oder den S3-Pfad zu einem in einem Amazon-S3-Bucket gespeicherten Bild angeben. Beispielsweise:

    python client.py function_name s3://bucket/path/image.jpg

    Wenn sich das Bild in einem Amazon-S3-Bucket befindet, stellen Sie sicher, dass es sich um denselben Bucket handelt, den Sie in Schritt 15 von Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole) angegeben haben.

    Ist dies erfolgreich, wird eine Liste von Labels ausgegeben, die im Bild gefunden wurden. Wenn keine Labels zurückgegeben werden, sollten Sie den Konfidenzwert, den Sie in Schritt 7 von Schritt 1: Erstellen Sie eine AWS Lambda Funktion (Konsole) festgelegt haben, verringern.

  6. Wenn Sie mit der Lambda-Funktion fertig sind und das Modell nicht von anderen Anwendungen verwendet wird, beenden Sie das Modell. Denken Sie daran, das Modell zu starten, wenn Sie das nächste Mal die Lambda-Funktion verwenden möchten.