Analisando imagens com uma AWS Lambda função - Rekognition

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á.

Analisando imagens com uma AWS Lambda função

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. DetectCustomLabels A função analisa uma imagem fornecida e retorna uma lista de rótulos encontrados na imagem. As instruções incluem um exemplo de código em 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.

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 DetectCustomLabels operação. Ele também concede acesso ao bucket do Amazon S3 que armazena imagens para análise. Também é possível especificar variáveis de ambiente para o seguinte:

  • O modelo do Amazon Rekognition Custom Labels que você deseja que sua 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)
  1. Faça login no AWS Management Console e abra o AWS Lambda console em https://console.aws.amazon.com/lambda/.

  2. Escolha a opção Criar função. Para obter mais informações, consulte Criar uma função do Lambda no console.

  3. Escolha as seguintes opções:

    • Escolha Criar do zero.

    • Insira um valor para Nome da função.

    • Em Runtime, escolha Python 3.10.

  4. Escolha Criar função para criar a função do AWS Lambda .

  5. Em sua página da função, escolha a guia Configuração.

  6. No painel Variáveis de ambiente, escolha Editar.

  7. 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

    MODEL_ARN

    O Amazon Resource Name (ARN) do modelo que você deseja que sua função Lambda use. Você pode obter o modelo na guia Usar modelo ARN da página de detalhes do modelo no console Amazon Rekognition Custom Labels.

    CONFIDENCE

    O valor mínimo (de 0 a 100) da confiança do modelo na previsão de um rótulo. A função do Lambda não retorna rótulos com valores de confiança inferiores a esse valor.

  8. Escolha Salvar para salvar as variáveis de ambiente.

  9. No painel Permissões, em Nome da função, escolha a função de execução para abrir a função no IAM console.

  10. Na guia Permissões, escolha Adicionar permissões e Criar política em linha.

  11. Escolha JSONe substitua a política existente pela política a seguir.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. Escolha Próximo.

  13. Em Detalhes da política, insira um nome para a política, como DetectCustomLabels-access.

  14. Escolha Criar política.

  15. Se estiver armazenando imagens para análise em um bucket do Amazon S3, repita as etapas 10 a 14.

    1. 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/*" } ] }
    2. 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 DetectCustomLabels 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)
  1. Abra um prompt de comando e execute os comandos a seguir.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. Observe o nome do arquivo zip (boto3-layer.zip). Ele será necessário na etapa 6 deste procedimento.

  3. Abra o AWS Lambda console em https://console.aws.amazon.com/lambda/.

  4. No painel de navegação, escolha Camadas.

  5. Escolha Criar camada.

  6. Insira valores para Nome e Descrição.

  7. Escolha Fazer upload de um arquivo .zip e escolha Fazer upload.

  8. Na caixa de diálogo, escolha o arquivo de arquivos.zip (boto3-layer.zip) criada na etapa 1 desse procedimento.

  9. Para runtimes compatíveis, escolha Python 3.9.

  10. Escolha Criar para criar a camada.

  11. Escolha o ícone do menu do painel de navegação.

  12. Selecione Funções no painel de navegação.

  13. Na lista de recursos, escolha a função que você criou em Etapa 1: criar uma AWS Lambda função (console).

  14. Escolha a guia Código.

  15. Na seção Camadas, escolha Adicionar uma camada.

  16. Escolha camadas personalizadas.

  17. Em Camadas personalizadas, escolha o nome da camada que você inseriu na etapa 6.

  18. Em Versão, escolha a versão da camada, que deve ser 1.

  19. Escolha Adicionar.

Etapa 3: adicione o código em Python (console)

Nesta etapa, o código em Python é adicionado à sua função do Lambda usando o editor de código do console do Lambda. O código analisa uma imagem fornecida com DetectCustomLabels e retorna uma lista de rótulos encontrados na imagem. 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)
  1. Se não estiver no console do Lambda, faça o seguinte:

    1. Abra o AWS Lambda console em https://console.aws.amazon.com/lambda/.

    2. Abra a função do Lambda que você criou em Etapa 1: criar uma AWS Lambda função (console).

  2. Escolha a guia Código.

  3. 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 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. 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
  1. Certifique-se de que você tem a permissão lambda:InvokeFunction. É possível usar a política a seguir.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "InvokeLambda", "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:

  2. Instale e configure AWS SDK para Python. Para obter mais informações, consulte Etapa 4: configurar os AWS SDKs AWS CLI e.

  3. Inicie o modelo que você especificou na etapa 7 de Etapa 1: criar uma AWS Lambda função (console).

  4. 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 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. Execute o código. Para o argumento da linha de comando, forneça o nome da função do Lambda e a imagem que você deseja analisar. É possível fornecer um caminho para uma imagem local ou o caminho do S3 para uma imagem armazenada em um bucket do Amazon S3. Por exemplo:

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

    Se a imagem estiver em um bucket do Amazon S3, certifique-se de que seja o mesmo bucket que você especificou na etapa 15 de Etapa 1: criar uma AWS Lambda função (console).

    Se for bem-sucedida, a saída será uma lista de rótulos encontrados na imagem. Se nenhum rótulo for retornado, considere reduzir o valor de confiança que você definiu na etapa 7 do Etapa 1: criar uma AWS Lambda função (console).

  6. 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.