Creación de una función de Lambda de Amazon Rekognition - Amazon 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.

Creación de una función de Lambda de Amazon Rekognition

En este tutorial, se muestra cómo obtener los resultados de una operación de análisis de vídeo para la detección de etiquetas mediante una función de Lambda en Java.

Puede utilizar las funciones de Lambda con las operaciones de Amazon Rekognition Video. Por ejemplo, el siguiente diagrama muestra un sitio web que utiliza una función de Lambda para comenzar automáticamente el análisis de un vídeo cuando este se carga en un bucket de Amazon S3. Cuando se activa la función Lambda, llama StartLabelDetectionpara empezar a detectar etiquetas en el vídeo cargado. Para obtener información sobre cómo utilizar Lambda para procesar notificaciones de eventos desde un bucket de Amazon S3, consulte Uso de AWS Lambda con eventos de Amazon S3.

Una segunda función de Lambda se activa cuando se envía el estado de realización del análisis al tema de Amazon SNS registrado. La segunda función Lambda llama GetLabelDetectionpara obtener los resultados del análisis. A continuación, los resultados se almacenan en una base de datos como paso previo antes de mostrarlos en una página web. Esta segunda función lambda es el objetivo de este tutorial.

Diagrama que muestra un flujo de trabajo de procesamiento de vídeo para Amazon Rekognition Video, desde la carga de un vídeo hasta el almacenamiento de los resultados en Amazon DynamoDB para mostrarlos en un sitio web.

En este tutorial, la función de Lambda se activa cuando Amazon Rekognition Video envía el estado de realización del análisis de vídeo al tema de Amazon SNS registrado. A continuación, recopila los resultados del análisis de vídeo mediante una llamada. GetLabelDetection Con fines de demostración, este tutorial escribe los resultados de la detección de etiquetas en un CloudWatch registro. La función de Lambda de la aplicación debería almacenar los resultados del análisis para su uso posterior. Por ejemplo, puede utilizar Amazon DynamoDB para guardar los resultados del análisis. Para obtener más información, consulte el tema relacionado con el uso de DynamoDB.

Los siguientes procedimientos le muestran cómo:

  • Crear el tema de Amazon SNS y configurar los permisos.

  • Cree la función Lambda mediante el tema Amazon SNS AWS Management Console y suscríbala al tema.

  • Configurar la función de Lambda mediante la AWS Management Console.

  • Agregue código de muestra a un AWS Toolkit for Eclipse proyecto y cárguelo en la función Lambda.

  • Probar la función de Lambda mediante la AWS CLI.

nota

Utilice la misma AWS región en todo el tutorial.

Requisitos previos

En este tutorial, se supone que está familiarizado con AWS Toolkit for Eclipse. Para obtener más información, consulte AWS Toolkit for Eclipse.

Creación del tema de SNS

El estado de realización de una operación de análisis de vídeo de Amazon Rekognition Video se envía a un tema de Amazon SNS. Este procedimiento crea el tema de Amazon SNS y el rol de servicio de IAM que otorga a Amazon Rekognition Video acceso a los temas de Amazon SNS. Para obtener más información, consulte Cómo llamar a las operaciones de Amazon Rekognition Video.

Para crear un tema de Amazon SNS
  1. Si no lo ha hecho aún, cree un rol de servicio de IAM para otorgar a Amazon Rekognition Video acceso a sus temas de Amazon SNS. Anote el nombre de recurso de Amazon (ARN). Para obtener más información, consulte Otorgar acceso a varios temas de Amazon SNS.

  2. Cree un tema de Amazon SNS mediante la consola de Amazon SNS. Sólo tiene que especificar el nombre del tema. Añada al nombre del tema un prefijo. AmazonRekognition Apunte el ARN del tema.

Creación de la función de Lambda

Utilice la función de Lambda para crear la función de AWS Management Console. A continuación, deberá usar un proyecto de AWS Toolkit for Eclipse para subir el paquete de la función de Lambda en AWS Lambda. También es posible crear la función de Lambda con AWS Toolkit for Eclipse. Para obtener más información, consulte Tutorial: Cómo crear, cargar e invocar una función de AWS Lambda.

Para crear la función de Lambda
  1. Inicie sesión en la consola de administración de AWS y abra la consola de AWS Lambda en https://console.aws.amazon.com/lambda/.

  2. Elija Crear función.

  3. Elija Crear desde cero.

  4. En Nombre de función, introduzca un nombre para la función.

  5. En Tiempo de ejecución, elija Java 8.

  6. Elija Seleccionar o crear un rol de ejecución.

  7. En Rol de ejecución, elija Crear un nuevo rol con permisos básicos de Lambda.

  8. Observe el nombre del nuevo rol que se muestra en la parte inferior de la sección Información básica.

  9. Elija Crear función.

Configuración de la función de Lambda

Una vez que haya creado la función de Lambda, puede configurarla para que la active el tema de Amazon SNS que se crea en Creación del tema de SNS. También deberá ajustar los requisitos de memoria y el periodo de tiempo de espera para la función de Lambda.

Para configurar la función de Lambda
  1. En Código de función, escriba com.amazonaws.lambda.demo.JobCompletionHandler para Controlador.

  2. En Configuración básica, elija Editar. Se muestra el cuadro de diálogo Editar configuración básica.

    1. Elija 1024 para Memoria.

    2. Elija 10 segundos para Tiempo de espera.

    3. Seleccione Guardar.

  3. En Diseñador, elija + Agregar desencadenador. Se muestra el cuadro de diálogo Agregar desencadenador.

  4. En Configuración de desencadenador elija SNS.

    En Tema de SNS, elija el tema de Amazon SNS que creó en Creación del tema de SNS.

  5. Elija Activar disparador.

  6. Para añadir el disparador, elija Añadir.

  7. Elija Guardar para guardar la función de Lambda actualizada.

Configuración del rol de IAM para Lambda

Para llamar a Amazon Rekognition Video operations, debe añadir la política gestionada de AmazonRekognitionFullAccessAWS a la función Lambda de IAM. Las operaciones de inicio, por ejemplo StartLabelDetection, también requieren permisos de pase para el rol de servicio de IAM que Amazon Rekognition Video utiliza para acceder al tema de Amazon SNS.

Para configurar el rol
  1. Inicie sesión en la consola de IAM AWS Management Console y ábrala en https://console.aws.amazon.com/iam/.

  2. Seleccione Roles en el panel de navegación.

  3. En la lista, elija el nombre del rol de ejecución que ha creado en Creación de la función de Lambda.

  4. Elija la pestaña Permisos.

  5. Seleccione Asociar políticas.

  6. Elija una AmazonRekognitionFullAccessde las políticas de la lista.

  7. Elija Asociar política.

  8. Nuevamente, elija el rol de ejecución.

  9. Elija Agregar política insertada.

  10. Seleccione la pestaña JSON.

  11. Reemplace la política existente por la siguiente política. Reemplace servicerole por el rol de servicio de IAM; que ha creado en Creación del tema de SNS.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "mysid", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:servicerole" } ] }
  12. Elija Revisar política.

  13. En Nombre*, escriba un nombre para la política.

  14. Elija Crear política.

Crear el proyecto AWS Toolkit for Eclipse Lambda

Cuando se activa la función Lambda, el código siguiente obtiene el estado de finalización del tema Amazon SNS y GetLabelDetectionllama para obtener los resultados del análisis. Se graba en un registro un recuento de las etiquetas detectadas y una lista de las etiquetas detectadas. CloudWatch La función de Lambda debería almacenar los resultados del análisis de vídeo para su uso posterior.

Para crear el proyecto AWS Toolkit for Eclipse Lambda
  1. Cree un proyecto AWS Toolkit for EclipseAWS Lambda.

    • En Nombre del proyecto, escriba un nombre de proyecto de su elección.

    • Para el nombre de la clase:, introduzca JobCompletionHandler.

    • En Tipo de entrada, elija Evento de SNS.

    • Deje el resto de los campos sin modificar.

  2. En el explorador de proyectos de Eclipse, abra el método de controlador de Lambda generado (JobCompletionHandler.java) y sustituya el contenido por lo siguiente:

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) package com.amazonaws.lambda.demo; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SNSEvent; import java.util.List; import com.amazonaws.regions.Regions; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.GetLabelDetectionRequest; import com.amazonaws.services.rekognition.model.GetLabelDetectionResult; import com.amazonaws.services.rekognition.model.LabelDetection; import com.amazonaws.services.rekognition.model.LabelDetectionSortBy; import com.amazonaws.services.rekognition.model.VideoMetadata; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JobCompletionHandler implements RequestHandler<SNSEvent, String> { @Override public String handleRequest(SNSEvent event, Context context) { String message = event.getRecords().get(0).getSNS().getMessage(); LambdaLogger logger = context.getLogger(); // Parse SNS event for analysis results. Log results try { ObjectMapper operationResultMapper = new ObjectMapper(); JsonNode jsonResultTree = operationResultMapper.readTree(message); logger.log("Rekognition Video Operation:========================="); logger.log("Job id: " + jsonResultTree.get("JobId")); logger.log("Status : " + jsonResultTree.get("Status")); logger.log("Job tag : " + jsonResultTree.get("JobTag")); logger.log("Operation : " + jsonResultTree.get("API")); if (jsonResultTree.get("API").asText().equals("StartLabelDetection")) { if (jsonResultTree.get("Status").asText().equals("SUCCEEDED")){ GetResultsLabels(jsonResultTree.get("JobId").asText(), context); } else{ String errorMessage = "Video analysis failed for job " + jsonResultTree.get("JobId") + "State " + jsonResultTree.get("Status"); throw new Exception(errorMessage); } } else logger.log("Operation not StartLabelDetection"); } catch (Exception e) { logger.log("Error: " + e.getMessage()); throw new RuntimeException (e); } return message; } void GetResultsLabels(String startJobId, Context context) throws Exception { LambdaLogger logger = context.getLogger(); AmazonRekognition rek = AmazonRekognitionClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); int maxResults = 1000; String paginationToken = null; GetLabelDetectionResult labelDetectionResult = null; String labels = ""; Integer labelsCount = 0; String label = ""; String currentLabel = ""; //Get label detection results and log them. do { GetLabelDetectionRequest labelDetectionRequest = new GetLabelDetectionRequest().withJobId(startJobId) .withSortBy(LabelDetectionSortBy.NAME).withMaxResults(maxResults).withNextToken(paginationToken); labelDetectionResult = rek.getLabelDetection(labelDetectionRequest); paginationToken = labelDetectionResult.getNextToken(); VideoMetadata videoMetaData = labelDetectionResult.getVideoMetadata(); // Add labels to log List<LabelDetection> detectedLabels = labelDetectionResult.getLabels(); for (LabelDetection detectedLabel : detectedLabels) { label = detectedLabel.getLabel().getName(); if (label.equals(currentLabel)) { continue; } labels = labels + label + " / "; currentLabel = label; labelsCount++; } } while (labelDetectionResult != null && labelDetectionResult.getNextToken() != null); logger.log("Total number of labels : " + labelsCount); logger.log("labels : " + labels); } }
  3. Los espacios de nombres de Rekognition no se resuelven. Para corregirlo:

    • Detenga el ratón sobre la parte subrayada de la línea import com.amazonaws.services.rekognition.AmazonRekognition;.

    • Elija Corregir configuración del proyecto....

    • Elija la versión más reciente del archivo de Amazon Rekognition.

    • Elija Aceptar para añadir el archivo al proyecto.

  4. Guarde el archivo.

  5. Haga clic con el botón derecho en la ventana de código de Eclipse, elija AWS Lambda y, a continuación, elija Cargar función a AWS Lambda.

  6. En la página Seleccionar función de Lambda de destino, elija la región de AWS que desea utilizar.

  7. Elija Elegir una función de Lambda existente y seleccione la función de Lambda que ha creado en Creación de la función de Lambda.

  8. Elija Siguiente. Se muestra el cuadro de diálogo Configuración de función.

  9. En Rol de IAM, elija el rol de IAM que creó en Creación de la función de Lambda.

  10. Elija Finalizar y la función de Lambda se subirá en AWS.

Probar la función de Lambda

Utilice el siguiente AWS CLI comando para probar la función Lambda iniciando el análisis de detección de etiquetas de un vídeo. Una vez finalizado el análisis, la función de Lambda se activa. Compruebe que el análisis se ha realizado correctamente comprobando los CloudWatch registros.

Para probar la función de Lambda
  1. Cargue un archivo de vídeo con formato MOV o MPEG-4 en el bucket de S3. Para realizar pruebas, cargue un vídeo con una duración inferior a 30 segundos.

    Para ver las instrucciones, consulte Carga de objetos en Amazon S3 en la Guía del usuario de Amazon Simple Storage Service.

  2. Ejecute el siguiente AWS CLI comando para empezar a detectar etiquetas en un vídeo.

    aws rekognition start-label-detection --video "S3Object={Bucket="bucketname",Name="videofile"}" \ --notification-channel "SNSTopicArn=TopicARN,RoleArn=RoleARN" \ --region Region

    Actualice los siguientes valores:

    • Cambie bucketname y videofile en el nombre de bucket de Amazon S3 y nombre de archivo del vídeo donde desea detectar etiquetas.

    • Reemplace TopicARN por el ARN del tema de Amazon SNS que ha creado en Creación del tema de SNS.

    • Reemplace RoleARN por el ARN del rol de IAM que ha creado en Creación del tema de SNS.

    • Cambie Region a la AWS región que esté utilizando.

  3. Anote el valor de JobId en la respuesta. La respuesta tiene un aspecto similar a la del siguiente ejemplo JSON.

    { "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn" }
  4. Abra la consola https://console.aws.amazon.com/cloudwatch/.

  5. Cuando finalice el análisis, aparecerá una entrada de log para la función de Lambda en el Grupo de registro.

  6. Elija la función de Lambda para ver los flujos de registro.

  7. Elija el flujo de logs más reciente para ver las entradas de log realizadas por la función de Lambda. Si la operación se realizó correctamente, tendrá un aspecto similar al siguiente resultado, que muestra los detalles de la operación de reconocimiento de vídeo, incluido el identificador del trabajo, el tipo de operación StartLabelDetection "» y una lista de categorías de etiquetas detectadas, como Botella, Ropa, Multitud y Comida:

    Salida de registro que muestra los detalles de una operación de reconocimiento de vídeo.

    El valor de ID de trabajo debería coincidir con el valor de JobId que anotó en el paso 3.