Détecter des anomalies à l'aide d'unAWS Lambdafonction - Amazon Lookout for Vision

Avis de fin de support : le 31 octobre 2025, le support d'Amazon Lookout for Vision AWS sera interrompu. Après le 31 octobre 2025, vous ne pourrez plus accéder à la console Lookout for Vision ni aux ressources Lookout for Vision. Pour plus d'informations, consultez ce billet de blog.

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.

Détecter des anomalies à l'aide d'unAWS Lambdafonction

AWS Lambda est un service informatique qui vous permet d'exécuter un code sans demander la mise en service ou la gestion des serveurs. Par exemple, vous pouvez analyser des images envoyées 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 appelleDetectAnomalies. La fonction analyse une image fournie et renvoie une classification pour détecter la présence d'anomalies dans cette image. Les instructions incluent un exemple de code Python montrant comment appeler la fonction Lambda avec une image contenue dans un compartiment Amazon S3 ou une image fournie depuis un ordinateur local.

Étape 1 : Création d'unAWS Lambdafonction (console)

Au cours de cette étape, vous créez un videAWSfonction et un rôle d'exécution IAM qui permet à votre fonction d'appelerDetectAnomaliesopération. Il permet également d'accéder au compartiment Amazon S3 qui stocke les images à des fins d'analyse. Vous devez également spécifier des variables d'environnement pour les éléments suivants :

  • Le projet Amazon Lookout for Vision et la version du modèle que vous souhaitez que votre fonction Lambda utilise.

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

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

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

  2. Sélectionnez Créer une fonction. Pour plus d'informations, voirCréation d'une fonction Lambda avec la console.

  3. Choisissez les options suivantes.

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

    • Entrez une valeur pourNom de la fonction.

    • PourTemps d'exécutionchoisirPython 3.10.

  4. ChoisissezCréer une fonctionpour créer leAWS Lambdafonction.

  5. Sur la page des fonctions, choisissezConfigurationonglet.

  6. Sur leVariables d'environnementvolet, choisissezModifier.

  7. Ajoutez les variables d'environnement suivantes. Pour chaque variable, choisissezAjouter une variable d'environnementpuis entrez la clé et la valeur de la variable.

    Clé Valeur

    NOM_PROJET

    Le projet Lookout for Vision qui contient le modèle que vous souhaitez utiliser.

    VERSION_MODÈLE

    La version du modèle que vous souhaitez utiliser.

    CONFIANCE

    La valeur minimale (0-100) de la confiance du modèle quant au caractère anormal de la prédiction. Si le niveau de confiance est inférieur, la classification est considérée comme normale.

  8. ChoisissezEnregistrerpour enregistrer les variables d'environnement.

  9. Sur leAutorisationsvolet, En dessousNom du rôle, choisissez le rôle d'exécution pour ouvrir le rôle dans la console IAM.

  10. Dans leAutorisationsonglet, choisissezAjouter des autorisationspuisCréer une politique en ligne.

  11. ChoisissezJASONet remplacez la politique existante par la politique suivante.

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

  13. DansDétails de la politique, entrez un nom pour la politique, tel queDetectAnomalies-accès.

  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, appliquez la politique suivante. Remplacerchemin d'accès au bucket ou au dossieravec 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 queAccès au compartiment S3.

Étape 2 : (Facultatif) Création d'une couche (console)

Pour exécuter cet exemple, vous n'avez pas besoin de suivre cette étape. LeDetectAnomaliesl'opération est incluse dans l'environnement Lambda Python par défaut dans le cadre deAWSSDK pour Python (Boto3). Si d'autres parties de votre fonction Lambda doivent être récentesAWSmises à jour de service qui ne figurent pas dans l'environnement Lambda Python par défaut, procédez comme suit pour ajouter la dernière version du SDK Boto3 en tant que couche à votre fonction.

Tout d'abord, vous créez une archive de fichiers .zip qui contient le SDK Boto3. Vous créez ensuite une couche et ajoutez l'archive de fichiers .zip à la couche. Pour plus d'informations, voirUtilisation de couches avec votre fonction Lambda.

Pour créer et ajouter une couche (console)
  1. Ouvrez une invite de commandes 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 console AWS Lambda à l'adresse https://console.aws.amazon.com/lambda/.

  4. Choisissez Layers dans le volet de navigation.

  5. Sélectionnez Créer un calque.

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

  7. ChoisissezCharger un fichier .zipet choisissezUploader.

  8. Dans la boîte de dialogue, choisissez 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, choisissezPython 3.9.

  10. ChoisissezCréezpour 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'unAWS Lambdafonction (console).

  14. Cliquez sur l'onglet Code.

  15. Dans leCouchessection, choisissezAjouter une couche.

  16. ChoisissezCouches personnalisées.

  17. DansCouches personnalisées, choisissez le nom de la couche que vous avez saisi à l'étape 6.

  18. DansVersionchoisissez la version de la couche, qui doit être 1.

  19. Choisissez Add (Ajouter).

Étape 3 : Ajouter du code Python (console)

Au cours de cette étape, vous allez ajouter du code Python à votre fonction Lambda à l'aide de l'éditeur de code de la console Lambda. Le code analyse une image fournie avecDetectAnomalieset renvoie une classification (vrai si l'image est anormale, faux si l'image est normale). L'image fournie peut se trouver dans un compartiment Amazon S3 ou être fournie sous forme d'octets d'image codés en octet 64.

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

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

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

  2. Cliquez sur l'onglet Code.

  3. DansSource du code, remplacez le code danslambda_function.pyavec les éléments suivants :

    # 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 Amazon Lookout for Vision model. """ import base64 import imghdr from os import environ from io import BytesIO import logging import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) # Get the model and confidence. project_name = environ['PROJECT_NAME'] model_version = environ['MODEL_VERSION'] min_confidence = int(environ.get('CONFIDENCE', 50)) lookoutvision_client = boto3.client('lookoutvision') 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: file_name = "" # Determine image source. if 'image' in event: # Decode the encoded image image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image_type = get_image_type(img_b64decoded) image = BytesIO(img_b64decoded) file_name = event['filename'] elif 'S3Object' in event: bucket = boto3.resource('s3').Bucket(event['S3Object']['Bucket']) image_object = bucket.Object(event['S3Object']['Name']) image = image_object.get().get('Body').read() image_type = get_image_type(image) file_name = f"s3://{event['S3Object']['Bucket']}/{event['S3Object']['Name']}" else: raise ValueError( 'Invalid image source. Only base 64 encoded image bytes or images in S3 buckets are supported.') # Analyze the image. response = lookoutvision_client.detect_anomalies( ProjectName=project_name, ContentType=image_type, Body=image, ModelVersion=model_version) reject = reject_on_classification( response['DetectAnomalyResult'], confidence_limit=float(environ['CONFIDENCE'])/100) status = "anomalous" if reject else "normal" lambda_response = { "statusCode": 200, "body": { "Reject": reject, "RejectMessage": f"Image {file_name} is {status}." } } except ClientError as err: error_message = f"Couldn't analyze {file_name}. " + \ err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": err.response['Error']['Code'], "ErrorMessage": error_message, "Image": file_name } } 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), "Image": event['filename'] } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response def get_image_type(image): """ Gets the format of the image. Raises an error if the type is not PNG or JPEG. :param image: The image that you want to check. :return The type of the image. """ image_type = imghdr.what(None, image) if image_type == "jpeg": content_type = "image/jpeg" elif image_type == "png": content_type = "image/png" else: logger.info("Invalid image type") raise ValueError( "Invalid file format. Supply a jpeg or png format file.") return content_type def reject_on_classification(prediction, confidence_limit): """ Returns True if the anomaly confidence is greater than or equal to the supplied confidence limit. :param image: The name of the image file that was analyzed. :param prediction: The DetectAnomalyResult object returned from DetectAnomalies :param confidence_limit: The minimum acceptable confidence. Float value between 0 and 1. :return: True if the error condition indicates an anomaly, otherwise False. """ reject = False if prediction['IsAnomalous'] and prediction['Confidence'] >= confidence_limit: reject = True reject_info = (f"Rejected: Anomaly confidence ({prediction['Confidence']:.2%}) is greater" f" than limit ({confidence_limit:.2%})") logger.info("%s", reject_info) if not reject: logger.info("No anomalies found.") return reject
  4. ChoisissezDéployerpour déployer votre fonction Lambda.

Étape 4 : essayez votre fonction Lambda

Au cours de cette étape, vous utilisez du code Python sur votre ordinateur pour transmettre une image locale, ou une image d'un bucket Amazon S3, à votre fonction Lambda. Les images transmises depuis un ordinateur local doivent être inférieures à 6291456 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 de fichiers image vers un compartiment Amazon S3, consultezChargement d'objets.

Assurez-vous d'exécuter le code dans le mêmeAWSRégion dans laquelle vous avez créé la fonction Lambda. Vous pouvez consulter leAWSRégion de votre fonction Lambda dans la barre de navigation de la page de détails de la fonction dansConsole Lambda.

Si leAWS LambdaLa fonction renvoie une erreur de délai d'expiration, prolonge le délai d'expiration pour la fonction Lambda. Pour plus d'informations, voirConfiguration du délai d'expiration de la fonction (console).

Pour plus d'informations sur l'appel d'une fonction Lambda à partir de votre code, voirInvoquantAWS LambdaFonctions.

Pour essayer votre fonction Lambda
  1. Si ce n'est pas déjà fait, procédez comme suit :

    1. Assurez-vous que l'utilisateur qui utilise le code client possèdelambda:InvokeFunctionautorisation. Vous pouvez utiliser les autorisations suivantes.

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

      Vous pouvez obtenir l'ARN de votre fonction Lambda à partir de la vue d'ensemble des fonctions dansConsole Lambda.

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

    2. Installation et configurationAWSSDK pour Python. Pour plus d'informations, veuillez consulter Étape 4 : Configurez le AWS CLI and AWS SDKs.

    3. Démarrez le modèleque vous avez spécifié à l'étape 7 deÉtape 1 : Création d'unAWS Lambdafonction (console).

  2. 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: Shows how to call the anomaly detection AWS Lambda function. """ from botocore.exceptions import ClientError import argparse import logging import base64 import json import boto3 from os import environ 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, "filename": image} 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() # Analyze image and display results. result = analyze_image(args.function, args.image) status = result['statusCode'] if status == 200: classification = result['body'] print(f"classification: {classification['Reject']}") print(f"Message: {classification['RejectMessage']}") else: print(f"Error: {result['statusCode']}") print(f"Message: {result['body']}") except ClientError as error: logging.error(error) print(error) if __name__ == "__main__": main()
  3. Exécutez le code. Pour l'argument de ligne de commande, indiquez le nom de la fonction Lambda et le chemin d'accès à l'image locale que vous souhaitez analyser. Par exemple :

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

    En cas de succès, le résultat est une classification des anomalies détectées dans l'image. Si aucune classification n'est renvoyée, envisagez de réduire la valeur de confiance que vous avez définie à l'étape 7 deÉtape 1 : Création d'unAWS Lambdafonction (console).

  4. Si vous avez terminé d'utiliser la fonction Lambda et que le modèle n'est pas utilisé par d'autres applications,arrêter le modèle. N'oubliez pas dedémarrer le modèlela prochaine fois que vous voudrez utiliser la fonction Lambda.