Analyse d'images à l'aide d'une AWS Lambda fonction - Rekognition

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Analyse d'images à l'aide d'une AWS Lambda fonction

AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs. Par exemple, vous pouvez analyser les images soumises depuis une application mobile sans avoir à créer un serveur pour héberger le code de l’application. Les instructions suivantes montrent comment créer une fonction Lambda en Python qui appelle. DetectCustomLabels La fonction analyse une image fournie et renvoie une liste des étiquettes trouvées dans l’image. Les instructions incluent un exemple de code Python montrant comment appeler la fonction Lambda avec une image dans un compartiment Amazon S3 ou une image fournie depuis un ordinateur local.

Étape 1 : Création d'une AWS Lambda fonction (console)

Au cours de cette étape, vous créez une AWS fonction vide et un rôle IAM d'exécution qui permet à votre fonction d'appeler l'DetectCustomLabelsopération. Il donne également accès au compartiment Amazon S3 qui stocke des images à des fins d’analyse. Vous spécifiez également des variables d’environnement pour les éléments suivants :

  • Le modèle Étiquettes personnalisées Amazon Rekognition que vous souhaitez que votre fonction Lambda utilise.

  • La limite de confiance que vous souhaitez que le modèle utilise.

Vous ajoutez ensuite le code source et éventuellement une couche à la fonction Lambda.

Pour créer une AWS Lambda fonction (console)
  1. Connectez-vous à la AWS Lambda console AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/lambda/.

  2. Sélectionnez Create function (Créer une fonction). Pour plus d’informations, consultez Créer une fonction Lambda à l’aide de la console.

  3. Choisissez les options suivantes.

    • Choisissez Créer à partir de zéro.

    • Entrez une valeur pour Nom de la fonction.

    • Pour Environnement d’exécution, choisissez Python 3.10.

  4. Choisissez Créer une fonction pour créer la fonction AWS Lambda .

  5. Sur la page de la fonction, choisissez l’onglet Configuration.

  6. Dans le volet Variables d’environnement, choisissez Modifier.

  7. Ajoutez les variables d’environnement suivantes. Pour chaque variable, choisissez Ajouter des variables d’environnement, puis entrez la clé et la valeur de la variable.

    Clé Valeur

    MODEL_ARN

    Le nom de ressource Amazon (ARN) du modèle que vous souhaitez que votre fonction Lambda utilise. Vous pouvez obtenir le modèle ARN depuis l'onglet Utiliser le modèle de la page de détails du modèle dans la console Amazon Rekognition Custom Labels.

    CONFIDENCE

    La valeur maximum (0 à 100) de la confiance du modèle dans la prédiction d’une étiquette. La fonction Lambda ne renvoie pas d’étiquettes dont les valeurs de confiance sont inférieures à cette valeur.

  8. Choisissez Enregistrer pour enregistrer les variables d’environnement.

  9. Dans le volet Autorisations, sous Nom du rôle, choisissez le rôle d'exécution pour ouvrir le rôle dans la IAM console.

  10. Dans l’onglet Autorisations, choisissez Ajouter des autorisations, puis Créer une politique en ligne.

  11. Choisissez JSONet remplacez la politique existante par la politique suivante.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. Choisissez Suivant.

  13. Dans Détails de la politique, entrez le nom de la politique, tel que DetectCustomLabels-access.

  14. Choisissez Create Policy (Créer une politique).

  15. Si vous stockez des images à des fins d’analyse dans un compartiment Amazon S3, répétez les étapes 10 à 14.

    1. Pour l’étape 11, utilisez la politique suivante. Remplacez bucket/folder path avec le chemin du compartiment et du dossier Amazon S3 vers les images que vous souhaitez analyser.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/folder path/*" } ] }
    2. Pour l’étape 13, choisissez un autre nom de politique, tel que S3Bucket-access.

Étape 2 : (Facultatif) Créer une couche (console)

Pour exécuter cet exemple, vous n’avez pas besoin de suivre cette étape. L'DetectCustomLabelsopération est incluse dans l'environnement Lambda Python par défaut dans le cadre de for AWS SDK Python (Boto3). Si d'autres parties de votre fonction Lambda nécessitent des mises à jour de AWS service récentes qui ne figurent pas dans l'environnement Lambda Python par défaut, procédez comme suit pour ajouter la dernière SDK version de Boto3 en tant que couche à votre fonction.

Tout d'abord, vous créez une archive de fichier .zip contenant le SDK Boto3. Ensuite, vous créez une couche et ajoutez l’archive du fichier .zip à la couche. Pour plus d’informations, consultez Utilisation de couches avec votre fonction Lambda.

Pour créer et ajouter une couche (console)
  1. Ouvrez une invite de commande et entrez les commandes suivantes.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. Notez le nom du fichier zip (boto3-layer.zip). Vous en aurez besoin à l’étape 6 de cette procédure.

  3. Ouvrez la AWS Lambda console à l'adresse https://console.aws.amazon.com/lambda/.

  4. Choisissez Layers dans le volet de navigation.

  5. Choisissez Créer un calque.

  6. Saisissez un Name (Nom) et une Description pour la règle.

  7. Choisissez Charger un fichier .zip, puis Charger.

  8. Dans la boîte de dialogue, sélectionnez l’archive de fichiers .zip (boto3-layer.zip) que vous avez créée à l’étape 1 de cette procédure.

  9. Pour des environnements d’exécution compatibles, choisissez Python 3.9.

  10. Choisissez Créer pour créer la couche.

  11. Choisissez l’icône du menu du volet de navigation.

  12. Dans le volet de navigation, choisissez Fonctions.

  13. Dans la liste des ressources, choisissez la fonction que vous avez créée dans Étape 1 : Création d'une AWS Lambda fonction (console).

  14. Cliquez sur l’onglet Code.

  15. Dans la zone Couches, choisissez Ajouter une couche.

  16. Choisissez Couches personnalisées.

  17. Dans Couches personnalisées, choisissez le nom de couche que vous avez saisi à l’étape 6.

  18. Dans Version, choisissez la version de la couche, qui doit être 1.

  19. Choisissez Ajouter.

Étape 3 : Ajouter le code Python (console)

Au cours de cette étape, vous ajoutez le code Python à votre fonction Lambda à l’aide de l’éditeur de code de la console Lambda. Le code analyse une image fournie avec DetectCustomLabels et renvoie une liste des étiquettes trouvées dans l’image. L’image fournie peut être située dans un compartiment Amazon S3 ou fournie sous forme d’octets d’image codés en byte64.

Pour ajouter le code Python (console)
  1. Si vous n’êtes pas dans la console Lambda, procédez comme suit :

    1. Ouvrez la AWS Lambda console à l'adresse https://console.aws.amazon.com/lambda/.

    2. Ouvrez la fonction Lambda que vous avez créée dans Étape 1 : Création d'une AWS Lambda fonction (console).

  2. Cliquez sur l’onglet Code.

  3. Dans Source du code, remplacez le code dans lambda_function.py par le code suivant :

    # 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. Choisissez Déployer pour déployer votre fonction Lambda.

Étape 4 : Essayer votre fonction Lambda

Au cours de cette étape, vous exécutez du code Python sur votre ordinateur pour transmettre une image locale ou une image d’un compartiment Amazon S3 à votre fonction Lambda. Les images transmises par un ordinateur local doivent avoir une taille inférieure à 6 291 456 octets. Si vos images sont plus grandes, chargez-les dans un compartiment Amazon S3 et appelez le script avec le chemin Amazon S3 vers l’image. Pour plus d’informations sur le chargement des fichiers image dans un compartiment Amazon S3, consultez Chargement d’objets.

Assurez-vous d'exécuter le code dans la même AWS région que celle dans laquelle vous avez créé la fonction Lambda. Vous pouvez consulter la AWS région de votre fonction Lambda dans la barre de navigation de la page de détails de la fonction de la console Lambda.

Si la AWS Lambda fonction renvoie une erreur de temporisation, prolongez le délai d'expiration de la fonction Lambda. Pour plus d'informations, voir Configuration du délai d'expiration de la fonction (console).

Pour plus d'informations sur l'appel d'une fonction Lambda à partir de votre code, consultez AWS Lambda Invoking Functions.

Pour essayer votre fonction Lambda
  1. Veillez à disposer de l’autorisations lambda:InvokeFunction. Vous pouvez utiliser la politique suivante.

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

    Vous pouvez obtenir le code correspondant ARN à votre fonction Lambda dans la vue d'ensemble des fonctions dans la console Lambda.

    Pour activer l’accès, ajoutez des autorisations à vos utilisateurs, groupes ou rôles :

  2. Installez et configurez AWS SDK pour Python. Pour de plus amples informations, veuillez consulter Étape 4 : Configuration des AWS SDK AWS CLI et.

  3. Démarrez le modèle que vous avez spécifié à l’étape 7 de l’Étape 1 : Création d'une AWS Lambda fonction (console).

  4. Enregistrez le code suivant dans un fichier nommé 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. Exécutez le code. Pour l’argument de ligne de commande, indiquez le nom de la fonction Lambda et l’image que vous souhaitez analyser. Vous pouvez fournir un chemin vers une image locale ou le chemin S3 vers une image stockée dans un compartiment Amazon S3. Par exemple :

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

    Si l’image se trouve dans un compartiment Amazon S3, assurez-vous qu’il s’agit du même compartiment que celui que vous avez spécifié à l’étape 15 de l’Étape 1 : Création d'une AWS Lambda fonction (console).

    En cas de réussite, le résultat est une liste d’étiquettes présentes dans l’image. Si aucune étiquette n’est renvoyée, pensez à réduire la valeur de confiance que vous avez définie à l’étape 7 de l’Étape 1 : Création d'une AWS Lambda fonction (console).

  6. Si vous avez terminé avec la fonction Lambda et que le modèle n’est pas utilisé par d’autres applications, arrêtez le modèle. N’oubliez pas de démarrer le modèle la prochaine fois que vous utiliserez la fonction Lambda.