Aviso de fim do suporte: em 31 de outubro de 2025, o suporte para o Amazon Lookout for Vision AWS será interrompido. Depois de 31 de outubro de 2025, você não poderá mais acessar o console do Lookout for Vision ou os recursos do Lookout for Vision. Para obter mais informações, visite esta postagem do blog
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Encontrando anomalias com uma função AWS Lambda
AWS Lambda é um serviço de computação que permite executar código sem provisionar ou gerenciar servidores. Por exemplo, você pode analisar imagens enviadas de um aplicativo móvel sem precisar criar um servidor para hospedar o código do aplicativo. As instruções a seguir mostram como criar uma função Lambda em Python que chama. DetectAnomalies A função analisa uma imagem fornecida e retorna uma classificação para a presença de anomalias nessa imagem. As instruções incluem um exemplo de código Python que mostra como chamar a função do Lambda com uma imagem em um bucket do Amazon S3 ou uma imagem fornecida por um computador local.
Tópicos
Etapa 1: criar uma AWS Lambda função (console)
Nesta etapa, você cria uma AWS função vazia e uma função de IAM execução que permite que sua função chame a DetectAnomalies
operação. Ele também concede acesso ao bucket do Amazon S3 que armazena imagens para análise. Você também especifica variáveis de ambiente para o seguinte:
A versão do projeto e modelo do Amazon Lookout for Vision que você deseja que a função do Lambda use.
O limite de confiança que você deseja que o modelo use.
Posteriormente, você adiciona o código-fonte e, opcionalmente, uma camada à função do Lambda.
Para criar uma AWS Lambda função (console)
Faça login no AWS Management Console e abra o AWS Lambda console em https://console.aws.amazon.com/lambda/
. -
Escolha a opção Criar função. Para obter mais informações, consulte Criar uma função do Lambda no console.
-
Escolha as seguintes opções:
-
Escolha Criar do zero.
-
Insira um valor para Nome da função.
-
Em Runtime, escolha Python 3.10.
-
-
Escolha Criar função para criar a função do AWS Lambda .
Em sua página da função, escolha a guia Configuração.
No painel Variáveis de ambiente, escolha Editar.
Adicione as seguintes variáveis de ambiente: Para cada variável, escolha Adicionar variável de ambiente, e insira a chave e o valor da variável.
Chave Valor PROJECT_NAME
O projeto Lookout for Vision que contém o modelo que você deseja usar.
MODEL_VERSION
A versão do mecanismo de banco de dados que você deseja usar.
CONFIDENCE
O valor mínimo (0-100) para a confiança do modelo de que a previsão é anômala. Se a confiança for menor, a classificação é considerada normal.
Escolha Salvar para salvar as variáveis de ambiente.
-
No painel Permissões, em Nome da função, escolha a função de execução para abrir a função no IAM console.
-
Na guia Permissões, escolha Adicionar permissões e Criar política em linha.
Escolha JSONe substitua a política existente pela política a seguir.
{ "Version": "2012-10-17", "Statement": [ { "Action": "lookoutvision:DetectAnomalies", "Resource": "*", "Effect": "Allow", "Sid": "DetectAnomaliesAccess" } ] }
Escolha Próximo.
Em Detalhes da política, insira um nome para a política, como DetectAnomalies-access.
Escolha Criar política.
Se estiver armazenando imagens para análise em um bucket do Amazon S3, repita as etapas 10 a 14.
-
Para a etapa 11, use a política a seguir. Substituir
bucket/folder path
com o bucket do Amazon S3 e o caminho da pasta para as imagens que você deseja analisar.{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
bucket/folder path
/*" } ] } Para a etapa 13, escolha um nome de política diferente, como S3Bucket-access.
-
Etapa 2: (opcional) crie uma camada (console)
Para executar este exemplo, não é preciso executar esta etapa. A DetectAnomalies
operação está incluída no ambiente padrão do Lambda Python como parte do for AWS SDK Python (Boto3). Se outras partes da sua função do Lambda precisarem de atualizações de AWS serviço recentes que não estejam no ambiente padrão do Lambda Python, siga esta etapa para adicionar a versão mais recente do Boto3 SDK como uma camada à sua função.
Primeiro, você cria um arquivo de arquivo.zip que contém o SDK Boto3. Uma camada é criada o arquivo de arquivos.zip é adicionado à camada. Para obter mais informações, consulte Como usar camadas com sua função do Lambda.
Para criar e adicionar uma camada (console)
-
Abra um prompt de comando e execute os comandos a seguir.
pip install boto3 --target python/. zip boto3-layer.zip -r python/
Observe o nome do arquivo zip (boto3-layer.zip). Ele será necessário na etapa 6 deste procedimento.
Abra o AWS Lambda console em https://console.aws.amazon.com/lambda/
. -
No painel de navegação, escolha Camadas.
-
Escolha Criar camada.
-
Insira valores para Nome e Descrição.
-
Escolha Fazer upload de um arquivo .zip e escolha Fazer upload.
-
Na caixa de diálogo, escolha o arquivo de arquivos.zip (boto3-layer.zip) criada na etapa 1 desse procedimento.
-
Para runtimes compatíveis, escolha Python 3.9.
-
Escolha Criar para criar a camada.
-
Escolha o ícone do menu do painel de navegação.
-
Selecione Funções no painel de navegação.
-
Na lista de recursos, escolha a função que você criou em Etapa 1: criar uma AWS Lambda função (console).
-
Escolha a guia Código.
-
Na seção Camadas, escolha Adicionar uma camada.
-
Escolha camadas personalizadas.
-
Em Camadas personalizadas, escolha o nome da camada que você inseriu na etapa 6.
Em Versão, escolha a versão da camada, que deve ser 1.
-
Escolha Adicionar.
Etapa 3: adicione o código em Python (console)
Nesta etapa, você adiciona código Python à função do Lambda usando o editor de código do console do Lambda. O código analisa uma imagem fornecida com DetectAnomalies
e retorna uma classificação (verdadeira se a imagem for anômala, falsa se a imagem for normal). A imagem fornecida pode estar localizada em um bucket do Amazon S3 ou fornecida como bytes de imagem codificados em byte64.
Para adicionar um código em Python (console)
Se não estiver no console do Lambda, faça o seguinte:
Abra o AWS Lambda console em https://console.aws.amazon.com/lambda/
. Abra a função do Lambda que você criou em Etapa 1: criar uma AWS Lambda função (console).
Escolha a guia Código.
-
Em Código-fonte, substitua o código em lambda_function.py pelo seguinte:
# 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
Escolha Implantar para implantar sua função do Lambda.
Etapa 4: teste sua função do Lambda
Nesta etapa, o código em Python é usado em seu computador para passar uma imagem local, ou uma imagem em um bucket do Amazon S3, para sua função do Lambda. As imagens passadas de um computador local devem ter menos de 6.291.456 bytes. Se suas imagens forem maiores, faça o upload das imagens em um bucket do Amazon S3 e chame o script com o caminho do Amazon S3 para a imagem. Para obter mais informações sobre como fazer upload de arquivos para um bucket do Amazon S3, consulte Fazer upload de objetos.
Certifique-se de executar o código na mesma AWS região em que você criou a função Lambda. Você pode visualizar a AWS região da sua função Lambda na barra de navegação da página de detalhes da função no console do Lambda.
Se a AWS Lambda função retornar um erro de tempo limite, estenda o período de tempo limite da função Lambda. Para obter mais informações, consulte Configurando o tempo limite da função (console).
Para obter mais informações sobre como invocar uma função Lambda a partir do seu código, consulte AWS Lambda Invocando funções.
Para testar a função do Lambda
-
Se ainda não tiver feito isso, faça o seguinte:
-
O usuário que está usando o código do cliente deve ter a permissão
lambda:InvokeFunction
. Você pode usar as seguintes permissões.{ "Version": "2012-10-17", "Statement": [ { "Sid": "LambdaPermission", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "
ARN for lambda function
" } ] }Você pode obter a função ARN para sua função Lambda na visão geral da função no console Lambda.
Para conceder acesso, adicione as permissões aos seus usuários, grupos ou perfis:
-
Usuários e grupos em AWS IAM Identity Center:
Crie um conjunto de permissões. Siga as instruções em Criação de um conjunto de permissões no Guia do usuário do AWS IAM Identity Center .
-
Usuários gerenciados IAM por meio de um provedor de identidade:
Crie um perfil para a federação de identidades. Siga as instruções em Criar uma função para um provedor de identidade terceirizado (federação) no Guia IAM do usuário.
-
IAMusuários:
-
Crie um perfil que seu usuário possa assumir. Siga as instruções em Criar uma função para um IAM usuário no Guia do IAM usuário.
-
(Não recomendado) Vincule uma política diretamente a um usuário ou adicione um usuário a um grupo de usuários. Siga as instruções em Adicionar permissões a um usuário (console) no Guia do IAM usuário.
-
-
-
Instale e configure AWS SDK para Python. Para obter mais informações, consulte Etapa 4: configurar o AWS CLI e AWS SDKs.
-
Inicie o modelo que você especificou na etapa 7 de Etapa 1: criar uma AWS Lambda função (console).
-
-
Salve o código a seguir em um arquivo chamado
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()
-
Execute o código. No argumento da linha de comando, forneça o nome da função do Lambda e o caminho para uma imagem local que você deseja analisar. Por exemplo:
python client.py
function_name /bucket/path/image.jpg
Se for bem-sucedida, a saída será uma classificação das anomalias encontradas na imagem. Se uma classificação não for retornada, considere reduzir o valor de confiança que você definiu na etapa 7 de Etapa 1: criar uma AWS Lambda função (console).
-
Se você tiver concluído a função do Lambda e o modelo não for usado por outras aplicações, interrompa o modelo. Inicie o modelo na próxima vez que quiser usar a função do Lambda.