Analizar imágenes con una función AWS Lambda - Rekognition

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Analizar imágenes con una función AWS Lambda

AWS Lambda es un servicio informático que le permite ejecutar código sin aprovisionar ni administrar servidores. Por ejemplo, puede analizar las imágenes enviadas desde una aplicación móvil sin tener que crear un servidor para alojar el código de la aplicación. Las siguientes instrucciones muestran cómo crear una función Lambda en Python que llame. DetectCustomLabels La función analiza una imagen facilitada y devuelve una lista con las etiquetas que se encuentran en la imagen. Las instrucciones incluyen un ejemplo de código Python que indica cómo llamar a la función de Lambda con la imagen de un bucket de Amazon S3 o una imagen sacada de un ordenador local.

Paso 1: Crear una AWS Lambda función (consola)

En este paso, se crea una AWS función vacía y un rol de IAM ejecución que permite a la función llamar a la DetectCustomLabels operación. También da acceso al bucket de Amazon S3 que almacena imágenes para su análisis. También puede indicar variables de entorno para lo siguiente:

  • El modelo de Etiquetas personalizadas de Amazon Rekognition para el que desea usar la función de Lambda.

  • El límite de confianza que desea que utilice el modelo.

Más adelante, añada el código fuente y, si lo desea, una capa a la función de Lambda.

Para crear una AWS Lambda función (consola)
  1. Inicie sesión en AWS Management Console y abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/.

  2. Seleccione Crear función. Para obtener más información, consulte Crear una función de Lambda con la consola.

  3. Elija las siguientes opciones.

    • Elija Crear desde cero.

    • Introduzca un valor en Nombre de función.

    • En Tiempo de ejecución, elija Python 3.10.

  4. Elija Crear función para crear la función AWS Lambda .

  5. En la página de la función, seleccione la pestaña Configuración.

  6. En el panel Variables de entorno, elija Editar.

  7. Añada las siguientes variables de entorno. En cada variable, elija Añadir variable de entorno y luego introduzca la clave y el valor de la variable.

    Clave Valor

    MODEL_ARN

    El nombre del recurso de Amazon (ARN) del modelo que desea que utilice la función Lambda. Puede obtener el modelo en la pestaña Use ARN Model de la página de detalles del modelo en la consola de etiquetas personalizadas de Amazon Rekognition.

    CONFIDENCE

    El valor mínimo (0-100) de confianza del modelo en la predicción de una etiqueta. La función de Lambda no devuelve etiquetas con valores de confianza inferiores a este valor.

  8. Elija Guardar para guardar las variables de entorno.

  9. En el panel Permisos, en Nombre del rol, elija el rol de ejecución para abrir el rol en la consola. IAM

  10. En la pestaña Permisos, elija Agregar permisos y después Crear política insertada.

  11. Elija JSONy sustituya la política existente por la siguiente política.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. Elija Next (Siguiente).

  13. En Detalles de la política, ingresa un nombre para la política, como DetectCustomLabels-access.

  14. Elija Crear política.

  15. Si va a almacenar imágenes para analizarlas en un bucket de Amazon S3, repita los pasos del 10 al 14.

    1. En el paso 11, utilice la siguiente política. Reemplazar bucket/folder path con la ruta del depósito y la carpeta de Amazon S3 a las imágenes que desee analizar.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/folder path/*" } ] }
    2. En el paso 13, elija un nombre de política diferente, como S3Bucket-access.

Paso 2: (opcional) Crear una capa (consola)

Para ejecutar este ejemplo, no es necesario realizar este paso. La DetectCustomLabels operación se incluye en el entorno Lambda Python predeterminado como parte de para AWS SDK Python (Boto3). Si otras partes de la función Lambda necesitan actualizaciones de AWS servicio recientes que no estén en el entorno Lambda Python predeterminado, realice este paso para añadir la última SDK versión de Boto3 como capa a la función.

En primer lugar, debe crear un archivo.zip que contenga el Boto3. SDK A continuación, cree una capa y añada el archivo de zip a la capa. Para obtener más información, consulte Uso de capas con la función de Lambda.

Cómo crear y añadir una capa (consola)
  1. Abra el símbolo del sistema y escriba el comando siguiente.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. Apunte el nombre del archivo zip (boto3-layer.zip). Lo necesitará más tarde en el paso 6 de este mismo procedimiento.

  3. Abre la consola en AWS Lambda . https://console.aws.amazon.com/lambda/

  4. En el panel de navegación, elija Capas.

  5. Elija Crear capa.

  6. Introduzca los valores correspondientes en Nombre y Descripción.

  7. Elija Cargar archivo .zip y luego Cargar.

  8. En el cuadro de diálogo, elija el archivo .zip (boto3-layer.zip) que creó en el paso 1 de este procedimiento.

  9. Con tiempos de ejecución compatibles, elija Python 3.9.

  10. Elija Crear para crear la capa.

  11. Elija el icono del menú del panel de navegación.

  12. Seleccione Funciones en el panel de navegación.

  13. En la lista de recursos, elija la función que haya creado en Paso 1: Crear una AWS Lambda función (consola).

  14. Elija la pestaña Código.

  15. En la sección Capas, elija Agregar una capa.

  16. Elija Capas personalizadas.

  17. En Capas personalizadas, elija el nombre de la capa que escogió en el paso 6.

  18. En Versión, elija la versión de la capa, que debe ser 1.

  19. Elija Agregar.

Paso 3: Añadir código de Python (consola)

En este paso, agregue código Python a la función de Lambda mediante el editor de código de la consola de Lambda. El código analiza una imagen facilitada con DetectCustomLabels y devuelve una lista con las etiquetas que se encuentran en la imagen. La imagen facilitada puede estar ubicada en un bucket de Amazon S3 o incluirse como bytes de imagen codificados en byte64.

Cómo añadir código Python (consola)
  1. Si no se encuentra en la consola de Lambda, haga lo siguiente:

    1. Abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/.

    2. Abra la función de Lambda que creó en Paso 1: Crear una AWS Lambda función (consola).

  2. Elija la pestaña Código.

  3. En Código fuente, sustituya el código en lambda_function.py por lo siguiente:

    # 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. Elija Implementar para implementar la función de Lambda.

Paso 4: Probar la función de Lambda

En este paso, utilice el código Python de su equipo para pasar una imagen local, o la imagen de un bucket de Amazon S3, a la función de Lambda. Las imágenes transferidas desde un equipo local deben tener un tamaño inferior a 6 291 456 bytes. Si las imágenes son más grandes, cárguelas en un bucket de Amazon S3 y llame al script con la ruta de Amazon S3 de la imagen. Para obtener más información sobre cómo cargar archivos en un bucket de Amazon S3, consulte Cargar objetos.

Asegúrese de ejecutar el código en la misma AWS región en la que creó la función Lambda. Puede ver la AWS región de la función Lambda en la barra de navegación de la página de detalles de la función en la consola Lambda.

Si la AWS Lambda función devuelve un error de tiempo de espera, amplíe el período de tiempo de espera de la función Lambda. Para obtener más información, consulte Configuración del tiempo de espera de la función (consola).

Para obtener más información sobre cómo invocar una función Lambda desde el código, consulte AWS Lambda Invocar funciones.

Cómo probar la función de Lambda
  1. Asegúrese de que tiene el permiso lambda:InvokeFunction. Puede utilizar la siguiente política.

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

    Puede obtener la función ARN para su función Lambda en la descripción general de la función en la consola de Lambda.

    Para dar acceso, agregue permisos a los usuarios, grupos o roles:

  2. Instalar y configurar AWS SDK para Python. Para obtener más información, consulte Paso 4: Configure los SDK y AWS CLIAWS.

  3. Inicie el modelo que eligió en el paso 7 de Paso 1: Crear una AWS Lambda función (consola).

  4. Guarde el siguiente código en un archivo denominado 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. Ejecute el código. En el argumento de la línea de comandos, indique el nombre de la función de Lambda y la imagen que desee analizar. Puede poner la ruta de una imagen local o la ruta S3 de una imagen almacenada en un bucket de Amazon S3. Por ejemplo:

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

    Si la imagen está en un bucket de Amazon S3, asegúrese de que es el mismo bucket que indicó en el paso 15 de Paso 1: Crear una AWS Lambda función (consola).

    Si se ejecuta correctamente, le saldrá una lista de etiquetas que se encuentran en la imagen. Si no devuelve ninguna etiqueta, considere la posibilidad de reducir el valor de confianza que eligió en el paso 7 de Paso 1: Crear una AWS Lambda función (consola).

  6. Si ha terminado con la función de Lambda y otras aplicaciones no utilizan el modelo, detenga el modelo. Recuerde iniciar el modelo la próxima vez que desee utilizar la función de Lambda.