Individuazione di anomalie con unAWS Lambdafunzione - Amazon Lookout per Vision

Avviso di fine del supporto: il 31 ottobre 2025 AWS interromperà il supporto per Amazon Lookout for Vision. Dopo il 31 ottobre 2025, non potrai più accedere alla console Lookout for Vision o alle risorse Lookout for Vision. Per ulteriori informazioni, consulta questo post del blog.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Individuazione di anomalie con unAWS Lambdafunzione

AWS Lambda è un servizio di elaborazione che consente di eseguire del codice senza la necessità di effettuare il provisioning o la gestione dei server. Ad esempio, è possibile analizzare le immagini inviate da un'applicazione mobile senza dover creare un server per ospitare il codice dell'applicazione. Le seguenti istruzioni mostrano come creare una funzione Lambda in Python che chiamaDetectAnomalies. La funzione analizza un'immagine fornita e restituisce una classificazione per la presenza di anomalie in quell'immagine. Le istruzioni includono un esempio di codice Python che mostra come chiamare la funzione Lambda con un'immagine in un bucket Amazon S3 o un'immagine fornita da un computer locale.

Fase 1: Creare unAWS Lambdafunzione (console)

In questo passaggio, crei un vuotoAWSfunzione e un ruolo di esecuzione IAM che consente alla funzione di chiamare ilDetectAnomaliesoperazione. Consente inoltre l'accesso al bucket Amazon S3 che archivia le immagini per l'analisi. È inoltre possibile specificare le variabili di ambiente per quanto segue:

  • Il progetto Amazon Lookout for Vision e la versione del modello da utilizzare con la funzione Lambda.

  • Il limite di confidenza che si desidera che il modello utilizzi.

Successivamente aggiungi il codice sorgente e facoltativamente un livello alla funzione Lambda.

Per creare unAWS Lambdafunzione (console)
  1. Accedere alla AWS Management Console e aprire la console di AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

  2. Scegli Create function (Crea funzione). Per ulteriori informazioni, vedereCrea una funzione Lambda con la console.

  3. Scegliete le seguenti opzioni.

    • Scegli Author from scratch (Crea da zero).

    • Inserisci un valore perNome della funzione.

    • PerRuntimesceglierePython 3.10.

  4. ScegliCrea funzioneper creare ilAWS Lambdafunzione.

  5. Nella pagina delle funzioni, scegli ilConfigurazionescheda.

  6. SulVariabili d'ambienteriquadro, scegliModifica.

  7. Aggiungere le seguenti variabili di ambiente. Per ogni variabile scegliAggiungi variabile di ambientequindi inserisci la chiave e il valore della variabile.

    Key (Chiave) Value (Valore)

    NOME_PROGETTO

    Il progetto Lookout for Vision che contiene il modello che desideri utilizzare.

    VERSIONE_MODELLO

    La versione del modello che si desidera utilizzare.

    FIDUCIA

    Il valore minimo (0-100) per la certezza del modello che la previsione è anomala. Se la confidenza è inferiore, la classificazione è considerata normale.

  8. ScegliSalvaper salvare le variabili di ambiente.

  9. SulAutorizzazionipannello, sottoNome del ruolo, scegli il ruolo di esecuzione per aprire il ruolo nella console IAM.

  10. NelAutorizzazionischeda, scegliAggiungi autorizzazionie poiCrea una politica in linea.

  11. ScegliJSONe sostituisci la politica esistente con la seguente politica.

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

  13. NelDettagli della politica, inserisci un nome per la politica, ad esempioDetectAnomalies-accesso.

  14. Scegli Create Policy (Crea policy).

  15. Se stai archiviando immagini per l'analisi in un bucket Amazon S3, ripeti i passaggi da 10 a 14.

    1. Per il passaggio 11, utilizza la seguente politica. Sostituiscipercorso del bucket/cartellacon il percorso del bucket e della cartella Amazon S3 verso le immagini che desideri analizzare.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/folder path/*" } ] }
    2. Per il passaggio 13, scegli un nome diverso per la politica, ad esempioAccesso al bucket S3.

Fase 2: (Facoltativo) Crea un livello (console)

Per eseguire questo esempio, non è necessario eseguire questo passaggio. LaDetectAnomaliesl'operazione è inclusa nell'ambiente Lambda Python predefinito come parte diAWSSDK per Python (Boto3). Se altre parti della tua funzione Lambda richiedono una versione recenteAWSper gli aggiornamenti dei servizi che non si trovano nell'ambiente predefinito di Lambda Python, esegui questo passaggio per aggiungere l'ultima versione di Boto3 SDK come livello alla tua funzione.

Innanzitutto, crei un archivio di file.zip che contiene l'SDK Boto3. Si crea quindi un layer e si aggiunge l'archivio di file.zip al layer. Per ulteriori informazioni, vedereUtilizzo dei livelli con la funzione Lambda.

Per creare e aggiungere un livello (console)
  1. Apri un prompt dei comandi e inserisci i seguenti comandi.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. Nota il nome del file zip (boto3-layer.zip). Ne hai bisogno nella fase 6 di questa procedura.

  3. Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

  4. Nel riquadro di navigazione scegli Layers (Livelli).

  5. Scegli Create layer (Crea livello).

  6. Immetti i valori per Nome (Nome) e Description (Descrizione).

  7. ScegliCarica un file.zipe scegliCarica.

  8. Nella finestra di dialogo, scegliete l'archivio con estensione zip (boto3-layer.zip) creato nel passaggio 1 di questa procedura.

  9. Per tempi di esecuzione compatibili, scegliPython 3.9.

  10. ScegliCreaper creare il livello.

  11. Scegli l'icona del menu del pannello di navigazione.

  12. Nel riquadro di navigazione, seleziona Funzioni.

  13. Nell'elenco delle risorse, scegli la funzione che hai creato inFase 1: Creare unAWS Lambdafunzione (console).

  14. Scegli la scheda Codice.

  15. NelStratisezione, scegliAggiungi un livello.

  16. ScegliLivelli personalizzati.

  17. NelLivelli personalizzati, scegli il nome del livello che hai inserito nel passaggio 6.

  18. NelVersionescegli la versione del livello, che dovrebbe essere 1.

  19. Scegli Add (Aggiungi).

Passaggio 3: aggiungi codice Python (console)

In questo passaggio, aggiungi codice Python alla tua funzione Lambda utilizzando l'editor di codice della console Lambda. Il codice analizza un'immagine fornita conDetectAnomaliese restituisce una classificazione (true se l'immagine è anomala, false se l'immagine è normale). L'immagine fornita può essere posizionata in un bucket Amazon S3 o fornita come byte di immagine codificati in byte64.

Per aggiungere codice Python (console)
  1. Se non utilizzi la console Lambda, procedi come segue:

    1. Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

    2. Apri la funzione Lambda che hai creato inFase 1: Creare unAWS Lambdafunzione (console).

  2. Scegli la scheda Codice.

  3. NelCodice sorgente, sostituisci il codice inlambda_function.pycon quanto segue:

    # 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. ScegliDistribuisciper implementare la tua funzione Lambda.

Fase 4: Prova la funzione Lambda

In questo passaggio, usi il codice Python sul tuo computer per passare un'immagine locale o un'immagine in un bucket Amazon S3 alla tua funzione Lambda. Le immagini trasmesse da un computer locale devono avere una dimensione inferiore a 6291456 byte. Se le tue immagini sono più grandi, carica le immagini in un bucket Amazon S3 e richiama lo script con il percorso Amazon S3 dell'immagine. Per informazioni sul caricamento di file di immagini in un bucket Amazon S3, consultaCaricamento di oggetti.

Assicurati di eseguire il codice nello stessoAWSRegione in cui è stata creata la funzione Lambda. È possibile visualizzareAWSRegione per la funzione Lambda nella barra di navigazione della pagina dei dettagli della funzione inConsolle Lambda.

Se ilAWS Lambdala funzione restituisce un errore di timeout, prolunga il periodo di timeout per la funzione Lambda. Per ulteriori informazioni, vedereConfigurazione del timeout della funzione (console).

Per ulteriori informazioni su come richiamare una funzione Lambda dal tuo codice, vediInvocandoAWS LambdaFunzioni.

Per provare la funzione Lambda
  1. Se non l'hai già fatto, procedi come segue:

    1. Assicurati che l'utente che utilizza il codice client abbialambda:InvokeFunctionpermesso. Puoi usare le seguenti autorizzazioni.

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

      È possibile ottenere l'ARN per la funzione della funzione Lambda dalla panoramica delle funzioni nelConsolle Lambda.

      Per fornire l'accesso, aggiungi autorizzazioni ai tuoi utenti, gruppi o ruoli:

      • Utenti e gruppi in AWS IAM Identity Center:

        Crea un set di autorizzazioni. Segui le istruzioni riportate nella pagina Create a permission set (Creazione di un set di autorizzazioni) nella Guida per l'utente di AWS IAM Identity Center.

      • Utenti gestiti in IAM tramite un provider di identità:

        Crea un ruolo per la federazione delle identità. Segui le istruzioni riportate nella pagina Creating a role for a third-party identity provider (federation) (Creazione di un ruolo per un provider di identità di terze parti [federazione]) nella Guida per l'utente di IAM.

      • Utenti IAM:

        • Crea un ruolo che l'utente possa assumere. Per istruzioni, consulta la pagina Creating a role for an IAM user (Creazione di un ruolo per un utente IAM) nella Guida per l'utente di IAM.

        • (Non consigliato) Collega una policy direttamente a un utente o aggiungi un utente a un gruppo di utenti. Segui le istruzioni riportate nella pagina Aggiunta di autorizzazioni a un utente (console) nella Guida per l'utente di IAM.

    2. Installa e configuraAWSSDK per Python. Per ulteriori informazioni, consulta Fase 4: Configurare il AWS CLI e AWS SDKs.

    3. Avvia il modelloche hai specificato nel passaggio 7 diFase 1: Creare unAWS Lambdafunzione (console).

  2. Salva il seguente codice in un file denominatoclient.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. Eseguire il codice. Come argomento della riga di comando, fornisci il nome della funzione Lambda e il percorso di un'immagine locale che desideri analizzare. Ad esempio:

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

    In caso di successo, l'output è una classificazione per le anomalie rilevate nell'immagine. Se non viene restituita una classificazione, valuta la possibilità di ridurre il valore di confidenza impostato nel passaggio 7 diFase 1: Creare unAWS Lambdafunzione (console).

  4. Se hai finito con la funzione Lambda e il modello non è utilizzato da altre applicazioni,ferma il modello. Ricordati diavvia il modellola prossima volta che vuoi usare la funzione Lambda.