Blog de Amazon Web Services (AWS)

Cómo crear una solución de análisis de accidentes automovilísticos sin servidor mediante el reconocimiento de imágenes

Por Andreza Cruz, Solutions Architect
Ana Cunha, Solutions Architect, AWS
Evandro Franco, Solutions Architect, AWS
Hermes Pimentel, Solutions Architect, AWS
Luis Miguel Flores dos Santos, Solutions Architect, AWS
 

 

En los últimos años, con el rápido aumento del uso de aplicaciones de mensajería y el crecimiento de las tecnologías de inteligencia artificial y aprendizaje automático, los chatbots han empezado a tener un importante valor de mercado, especialmente aquellos capaces de mantener una conversación de forma natural e intuitiva y proporcionar al usuario una buena experiencia de usuario. El principal desafío es poder crear un chatbot con estas características. En esta entrada de blog cubriremos un caso de uso específico: el análisis de accidentes automovilísticos.

Los centros de llamadas de las compañías de seguros de automóviles se enfrentan a diario a una gran demanda de solicitudes de análisis de accidentes relacionados con colisiones entre vehículos. En este escenario, a menudo se produce un retraso en la resolución de los problemas. Esta situación se puede solucionar automatizando estas llamadas mediante la evaluación inicial de las imágenes de accidentes automovilísticos mediante el reconocimiento de imágenes.

Demostraremos cómo integrar una solución de chatbot mediante servicios sin servidor de AWS, como AWS Lambda, Amazon API Gateway, Amazon Simple Storage Service (S3), Amazon DynamoDB, Amazon SQS y servicios de aprendizaje automático, como Amazon Lex, para crear bots utilizando lenguaje natural y Amazon Rekognition. Utilizaremos las etiquetas personalizadas de Amazon Rekognition para reconocer imágenes mediante un modelo de aprendizaje automático personalizado para analizar los accidentes automovilísticos.

Descripción general de la solución

El siguiente diagrama de arquitectura muestra la solución sugerida para cubrir el caso de uso propuesto anteriormente, mediante el uso de los servicios sin servidor de AWS para crear una arquitectura escalable, desacoplada y de alta disponibilidad mediante servicios gestionados de aprendizaje automático.

Figura 1. Descripción general de la arquitectura de soluciones

 

El flujo de mensajes comienza con una solicitud de un usuario a través de una ruta configurada en una API HTTP de Amazon API Gateway; a continuación, la solicitud se procesa mediante una función de AWS Lambda.

La función AWS Lambda es responsable de identificar la ruta y validar el json entrante. Al identificar una solicitud de mensaje, la función validará el contenido y creará una solicitud de intención para Amazon LexTras procesar la intención, Amazon Lex devolverá una respuesta a la función Lambda con el texto devuelto al usuario.  Para obtener información sobre cómo crear chatbots con Amazon Lex, consulte: Cómo crear chatbots complejos mediante la vinculación de intenciones a Amazon Lex (Chain Intents).

Cuando se activa la ruta de carga de imágenes, se inicia un flujo asincrónico que almacenará la imagen en Amazon Simple Storage Service (S3) y añadirá un mensaje a una cola estándar de

Amazon SQS que contiene la información de la imagen que se va a procesar.

A continuación, Amazon SQS activará la segunda función de AWS Lambda, que buscará la imagen para procesarla en el bucket de S3 y realizará la inferencia a partir del modelo de aprendizaje automático personalizado que se había entrenado previamente en las etiquetas personalizadas de Amazon Rekognition.

Una vez realizado el análisis de la imagen, el modelo devolverá un objeto json con los resultados del análisis. A continuación, la función Lambda almacenará este resultado en una tabla de Amazon DynamoDB y los resultados estarán disponibles para su consulta a través de una ruta de API HTTP.

Amazon DynamoDB también es responsable de almacenar los registros de transacciones y la información de los usuarios, además de los resultados de los análisis.

 

 

Creación de la solución automatizada

Para comprobar el funcionamiento de la solución final, se creó una plantilla de AWS CloudFormation para aprovisionar la arquitectura de la aplicación. Sin embargo, debe tener un modelo de Rekognition entrenado para poder identificar y realizar los análisis. Consulte cómo crear su plantilla personalizada de Amazon Rekognition en la sección Enlaces.

Para ejecutar la solución, debe acceder al servicio AWS CloudFormation en la consola de AWS y utilizar la plantilla disponible en el repositorio del proyecto.

Siga los requisitos previos contenidos en el archivo README del proyecto.

Después de este paso, en la página de inicio de CloudFormation, haga clic en Crear pila.

A continuación, en Requisito previo: Preparar plantilla, seleccione La plantilla está lista.

En Especificar plantilla, selecciona Cargar un archivo de plantilla.

Utilice el archivo.yaml disponible aquí.

Haga clic en Siguiente

Continúe con el paso 2 y, en Especificar los detalles de la pila, añada los siguientes parámetros:

Nombre de pila: Seguro de coche
Alias de Lexbot: dev
Nombre del bot Lexi: OctankBot
Modelo Rekognition: ARN de tu modelo

Figura 2. Ejemplo de configuración

Después de esta etapa, continúe con las propiedades estándar y, en la fase de revisión, seleccione las siguientes casillas de verificación según la imagen siguiente:

Figura 3. Revisión

 

Espere a que se aprovisione, puede tardar unos minutos.

Proyecto

En la primera etapa de esta entrada de blog, nos centraremos en cómo crear y configurar los servicios, utilizando fragmentos de código para ejemplificar el uso de los recursos y la devolución de métodos.

Rutas de API
Para este proyecto, utilizaremos las tres rutas de API siguientes:

Publicar/enviar mensaje
Publicar/subir imagen
OBTENER /GetResults

Publicar/enviar mensaje

Esta llamada a la API se encargará de interactuar con el chatbot de Lex, utilizar las intenciones y responder al usuario con una respuesta (mensaje).

Publicar/subir imagen

Esta llamada a la API cargará una imagen binaria de base64 en el bucket de S3 creado para este proyecto. Los tipos de contenido aceptados son «image/png», «image/jpg», «image/jpeg».

OBTENER /GetResults

Esta llamada a la API se encargará de obtener los resultados del análisis realizado por el modelo de etiquetas personalizadas de Amazon Rekognition almacenado en una tabla de Amazon DynamoDB. La solicitud devuelve un mensaje al usuario con la etiqueta de la imagen y la tasa de confianza de la predicción o, en caso de una respuesta nula o un error, se le devolverá un mensaje para que rehaga la solicitud.

 

COMO OBJETIVO

AWS Identity & Access Management (IAM) es el servicio que le permite administrar y acceder de forma segura a los servicios y recursos de AWS. Al crear usuarios y grupos, es posible conceder o denegar permisos a los recursos.

Durante este blog, utilizaremos un rol de IAM para definir las políticas y los permisos de los servicios y recursos que se utilizarán durante el proyecto. Esta es una guía que le ayudará a crear un rol de IAM (consola).

Para esta función necesitaremos permiso para los siguientes servicios:

Políticas gestionadas:

Función de ejecución de AWS LambdaDynamoDB

Ejecución de AWS Lambda

Función de ejecución de AWS Lambda SQL Squeue

Solo robots de ejecución de Amazon Lex

AWS Lambdarole

Traduce ReadOnly

Política de funciones de ejecución de ObjectLambda de Amazon S3

Políticas en línea:

Política de API Gateway

Política de CloudWatch Lambda

Política de salida de DynamoDB

Política de reconocimiento y obtención de etiquetas personalizadas

Política de solo escritura de SQS

 

Notas importantes: Se recomienda como buena práctica utilizar el principio de privilegios mínimos en entornos reales de desarrollo, pruebas y producción.

Amazon Rekognition y Amazon Lex

Una de las partes clave de este proyecto es el uso del aprendizaje automático para desarrollar el modelo de reconocimiento de imágenes de accidentes automovilísticos, utilizando Amazon Rekognition Custom Labels y Amazon Lex, para crear una interfaz conversacional con lenguaje natural.

Creación del chatbot en Amazon Lex

Antes de empezar, debe comprobar que se ha creado la función gestionada AWSServiceRoleForLexbots. De lo contrario, créelo y asegúrese de haber recibido permiso para llamar al servicio Amazon Polly y Amazon Comprehend. La siguiente documentación le guiará en este sentido: Cree un rol vinculado a servicios (AWS CLI).

Para crear el chatbot, es necesario crear un json que contenga la información necesaria, como los metadatos, los recursos, las intenciones, los espacios y los enunciados de muestra. Consulte el formato JSON para importar y exportar, que ejemplifica el marco json para exportar e importar tipos de ranuras, intenciones y bots en formato Amazon Lex.

Para usar el json, utilice el menú de la consola de Amazon Lex (Lex V1), haga clic en Bots y, a continuación, en Acciones e importar.

En Cargar archivo, seleccione el archivo comprimido y haga clic en Examinar y hacer clic en Importar.

Notas importantes: En el momento de la publicación de este texto, Amazon Lex V1 admite el idioma español nativo. Amazon Lex V2 también ya ofrece soporte nativo para varios idiomas. Consulte la lista de idiomas admitidos en la versión 2 de idiomas admitidos y en la versión 1 de idiomas admitidos.

 

Amazon Rekognition

En este proyecto, las etiquetas personalizadas de Amazon Rekognition se utilizan para reconocer imágenes mediante la inferencia de un modelo de aprendizaje automático personalizado capacitado para analizar los accidentes automovilísticos.

Usamos un conjunto de datos que contiene aproximadamente 104 imágenes de automóviles con las siguientes etiquetas:

Neumático pinchado (neumático pinchado) donde se utilizaron 48 imágenes.
Front Car Crash, donde utilizamos 56 imágenes de accidentes automovilísticos.

El modelo presentó una puntuación F1, un valor que muestra el rendimiento promedio obtenido con las imágenes entrenadas, de 0,978, lo que indica un buen funcionamiento y rendimiento del modelo. Intente obtener siempre un alto nivel de precisión y exactitud de los resultados utilizando un conjunto de datos de imágenes rico y diverso en sus escenarios de producción reales. Consulte el siguiente documento para conocer las prácticas recomendadas para utilizar el servicio de etiquetas personalizadas de Amazon Rekognition: Pautas y cuotas en las etiquetas personalizadas de Amazon Rekognition.

Figura 4. Resultados de la evaluación del reconocimiento de imágenes

 

Creación de funciones de AWS Lambda

Para esta entrada de blog, se utilizaron dos funciones de AWS Lambda:

carInsuranceBot 
carInsuranceBotImageProcess

Se usó Python 3.9 para ambas funciones

Bot de seguro de automóviles

Figura 5. Descripción general de la función Lambda CarInsuranceBot

La función CarInsuranceBot es responsable de conservar la lógica principal del proyecto. Esta función recibe el activador de Amazon API Gateway y lo redirige a los demás servicios de la arquitectura según la solicitud recibida.  Sus principales responsabilidades son interceptar las solicitudes de SendMessage, UploadImage y GetResults, así como almacenar todas las interacciones con el bot en Amazon DynamoDB con el fin de registrar los registros de transacciones, almacenar información y resultados.

Vea cómo crear una función Lambda con la consola.

El método sendMessage es responsable de identificar la solicitud /sendMessage en la carga.
El método valida y envía el mensaje a Amazon Lex, que identifica la intención y devuelve un mensaje con la respuesta del usuario a la función. Todo el contenido de envíos y devoluciones se registra en una tabla de Amazon DynamoDB.

Cuando la función identifica que el usuario está realizando una carga, activa el método UploadImage.  Este método comprueba el contenido de los encabezados que se utilizan para detectar el tipo del archivo recibido y el cuerpo que contiene el contenido de la imagen en el binario base64. Los tipos de archivos aceptados en el proyecto son: ‘image/png’, ‘image/jpg’, ‘image/jpeg’.

Es necesario decodificar la imagen mediante image = base64.b64decode (body) antes de escribir la imagen en el bucket de S3 mediante S3 () .write_on_s3 (image, file_key). A continuación, se coloca un mensaje en la cola de SQS que activará la segunda función Lambda del proyecto. Tras completar el procesamiento, el registro se escribe en la tabla de Amazon DynamoDB y se devuelve a la API un archivo json con un estado correcto y un token para consultar más a fondo el resultado del análisis de la imagen.

Aún en la función principal de Lambda, el método getResults recibirá el token de la imagen que se consultará. El token image_token se utilizará para consultar el resultado del procesamiento de análisis realizado por Amazon Rekognition Custom Labels. El método read_on_dynamo ejecuta el siguiente código para recuperar el resultado de la tabla:

 

        # obtener un elemento que coincida con el valor de image_token

        respuesta = table.get_item (

            Clave= {

                'image_token': image_token

            }

        )

 

Proceso de imagen del bot de seguro de automóvil

Figura 6. Descripción general de la función Lambda CarInsuranceBotImageProcess

 

La función CarInsuranceBotImageProcesses responsable de recibir el activador de colas de Amazon SQS de la función Lambda CarInsuranceBot, identificar la imagen y utilizar get_predictionpara hacer la inferencia del modelo de aprendizaje automático para analizar la imagen.

El código comenzará identificando los valores del contenido del evento recibido y el prefijo de la imagen que se almacenó en S3, que se utilizará para enviarla a Amazon Rekognition.

El método get_predictionutilizado para invocar las etiquetas personalizadas de Amazon Rekognition se comporta de la siguiente manera:

        def get_prediction(self, s3_prefix):


            image = S3().read_from_s3(s3_prefix)           

            prediction = self.client.detect_custom_labels(Image={'S3Object': {'Bucket': self.S3_BUCKET_NAME, 'Name': s3_prefix}},

                # MinConfidence=min_confidence,

                ProjectVersionArn=self.REKOGNITION_MODEL)



            return prediction

 

El valor de predicción [‘customLabels’] se almacena en la variable values_prediction y, a continuación, se valida su contenido. Si no se identifica ninguna etiqueta en la imagen, el código devolverá un mensaje de error y, si se identifica alguna etiqueta reconocida por el modelo previamente entrenado, se ejecutará el siguiente código:

prediction_name = values_prediction [0] ["Nombre"]

            prediction_confidence = values_prediction [0] ["Confianza"]

                  

            response_message = 'Se detectó: {} con una probabilidad de {}. ¿Confirmar? «.formato (

                prediction_name.lower (), round (prediction_confidence, 2)

            )

Por lo tanto, el nombre de la etiqueta y los valores del porcentaje de confianza obtenidos de la predicción se utilizan para devolverlos al usuario. La respuesta se escribe en la tabla de DynamoDB y estará disponible para su consulta a través de la llamada /GetResults.

 

Configuración de la API HTTP en Amazon API Gateway

Para configurar Amazon API Gateway, seguiremos el siguiente paso a paso:

En la consola de servicio, seleccionaremos la API HTTP y la opción Compilar:

 

En la siguiente ventana, selecciona Integraciones: Lambda, la región y la función Lambda creada anteriormente.

Para el nombre de la API, añada un nombre.

Después de rellenar la información, selecciona Siguiente.

A continuación, en Configurar rutas, añada los métodos descritos anteriormente en Rutas de la API, tal como se muestra en la imagen:

Haz clic en Siguiente.

En las etapas de configuración, deje los valores predeterminados y haga clic en Siguiente.

En la siguiente pantalla, revise la información introducida y haga clic en Crear.

Tras crear la API, anote el valor URL de invocación; esta información se utilizará más adelante para realizar llamadas a las rutas de la API.

Notas importantes: Por motivos de simplicidad, estamos añadiendo todos los métodos en la misma función Lambda.

 

Creación de un bucket en Amazon S3

Utilizaremos Amazon S3 para almacenar las imágenes de accidentes automovilísticos recibidas de los usuarios.

La siguiente guía ilustra cómo crear un bucket en Amazon S3 mediante la consola, el SDK o la CLI de AWS:

Crear un cubo

 

Creación de una cola estándar de SQS

En el menú del servicio Amazon SQS de la consola de AWS, haga clic en Crear cola.

Para crear la cola de SQS, siga las instrucciones paso a paso:

Selecciona Estándar.

Introduzca un nombre.

En Configuración utilizaremos los valores por defecto.

En Política de acceso, seleccione Avanzado e introduzca el siguiente json:

{
  «Versión»: "2008-10-17",
  «Identificador»: «__DEFAULT_POLICY_ID»,
  «Declaración»: [
    {
      «Sid»: «__owner_statement»,
      «Efecto»: «Permitir»,
      «Principal»: {
        «ERA»: «*»
      },
      «Acción»: [
        «SQS: *»
      ],
      «Recurso»:<ARN de recurso>,
      «Condición»: {
      	«Cadena es igual a»: {
      		«AWS: SourceAccount»: <ID de cuenta de usuario>
        },
        «RanLike»: {
          «AWS: SourceEarn»: <ARN de bucket S3>
        }
      }
    }
  ]
}

 

En «Recurso», utilice el ARN de cola creado por el propio servicio.

Para «AWS:SourceAccount», añada el ID de su cuenta.

Y en «ARNLike»: {«aws:sourceARN»}, usa el ARN del bucket de S3 creado en el paso anterior. Para encontrar el valor, seleccione el bucket creado en el menú Amazon S3, seleccione Propiedades y copie el valor del ARN en Descripción general del bucket.

Deje los demás ajustes predeterminados y haga clic en Crear cola.

 

Creación de las tablas

Para este proyecto utilizaremos dos tablas: InsuranceBot e InsuranceResults.

La tabla InsuranceBot se encargará de almacenar todos los mensajes recibidos y enviados al usuario. Esta tabla también servirá como registro para registrar las interacciones entre el usuario del bot.

La tabla InsuranceResults almacenará los resultados recibidos al analizar el modelo.

Para crear las tablas, en la consola de AWS, busque DynamoDB y, en la página principal del servicio, seleccione Crear tabla.

Introduzca el nombre de la tabla y la clave de partición. Deje la clave de clasificación en blanco.

Para la primera tabla, utilice:

Nombre: Bot de seguros
Clave de partición: ts (String)

Para los valores de configuración y etiquetas, déjelo como predeterminado. Haz clic en Crear tabla.

Repita el proceso paso a paso para crear otra tabla.
Para esta segunda tabla, utilice:

Nombre: Resultados del seguro
Clave de partición: image_token (String)

 

Integrar los servicios y probar el proyecto

Tras crear e inicializar todos los servicios necesarios para ejecutar el proyecto, utilizaremos una plataforma para probar las rutas de la API.

El orden de las llamadas es el siguiente:

PUBLICAR https:///SendMessage <invoke-URL>
PUBLICAR
https:///UploadImage <invoke-URL>
OBTENGA https:///GetResults <invoke-URL>

Notas importantes: La URL de invocación se encuentra en los detalles de la API creada anteriormente en el menú del servicio API Gateway.

El siguiente diagrama de secuencia muestra el flujo de mensajes y solicitudes de la aplicación:

Figura 7. Diagrama de secuencia de soluciones

 

Utilice una herramienta de consulta de API para probar las rutas respetando el orden de las llamadas.

Ejemplos:

Inicie la conversación con el chatbot llamando a POST https:///SendMessage<invoke-URL>:

Tras intercambiar mensajes, utilice la <invoke-URL>ruta POST https:///UploadImage para iniciar el flujo de reconocimiento de imágenes:

A continuación, recupere el resultado llamando a la ruta GET https:///GetResults pasando el <invoke-URL>token recibido en el paso anterior:

Si se produce un error en la llamada o información no es válida, la API devolverá un mensaje de error o error interno del servidor.

 

Integración con otras aplicaciones

Es posible integrar la solución de chatbot con otras aplicaciones a través de la API creada, realizando modificaciones en función del servicio utilizado.

En aplicaciones web, móviles o incluso de mensajería, como: Telegram, WhatsApp Business, entre otros.

Un ejemplo de integración de la solución con una aplicación de mensajería es usar Telegram a través de BotFather y la API Bot, que permite la construcción de bots para la aplicación.

BotFather permite crear bots con el comando:

/newbot

Y se inicializó con el comando:

/inicio

Tras su creación, proporciona un token de acceso que se puede utilizar para controlar el bot, integrarlo con las API y realizar solicitudes mediante el webhook de Telegram:

curl --request POST\

 --url https://api.telegram.org/bot <TOKEN>/setWebHook\

 --header 'tipo de contenido: aplicación/json'\

 --data '{"url»: "<YOUR-API-GW-KEY>«}'

 

Es necesario cambiar el valor YOUR-API-GW-KEY por la URL de invocación de Amazon API Gateway y modificar la función Lambda para permitir la integración con la API de Telegram.

Lea más en: Autorizar tu bot

Ejemplo de la interacción:

Figura 8. Iniciar una conversación con el chatbot mediante Telegram

Figura 9. Carga y reconocimiento de imágenes mediante el chatbot

Figura 10. Confirmar y finalizar la interacción con el bot a través de Telegram

Para obtener más información y aprender a integrar los chatbots con otras aplicaciones, la entrada de blog de Ahmad Khan Integra tu bot de Amazon Lex con cualquier servicio de mensajería ejemplifica cómo es posible integrar un bot de Lex con cualquier servicio de mensajería mediante Twilio.

 

Eliminar recursos

Al final de las pruebas con el proyecto, recuerda eliminar el entorno y los servicios utilizados en esta entrada del blog:

Conclusión

Como se ilustra en esta entrada de blog, demostramos en la práctica cómo implementar y probar una solución de chatbot utilizando los servicios de AWS, así como las herramientas de implementación y aprendizaje automático. Con él, es posible probar la integración entre varios servicios y aplicaciones para crear tus propios chatbots y cargas de trabajo de reconocimiento de imágenes para resolver problemas de análisis de accidentes automovilísticos.

 

Enlaces

Si desea crear su propio conjunto de datos, la siguiente serie de vídeos muestra paso a paso cómo crear conjuntos de datos mediante etiquetas personalizadas de Amazon Rekognition:

Referencias

Este artículo fue traducido del Blog de AWS en Portugués


Acerca de los autores

Andreza Cruz es una arquitecta de soluciones que trabaja con TI creando soluciones y ayudando a los clientes en sus viajes a la nube. En los últimos años se ha especializado en inteligencia artificial y aprendizaje automático (AI/ML).

 

 

 

 

Ana Cunha es champion de desarrolladores en Amazon Web Services para Latinoamérica. Su función es ayudar a los desarrolladores y a las comunidades a aprovechar al máximo la nube.

 

 

 

 

Evandro Franco es arquitecto de soluciones para el equipo de startups de Amazon Web Services. En su puesto, ayuda a las empresas emergentes a superar los desafíos empresariales mediante la plataforma AWS. Cuenta con más de 15 años de experiencia en el campo de la tecnología. En su tiempo libre, le gusta correr y pasar tiempo con su familia.

 

 

 

 

Hermes Pimentel es arquitecto de soluciones en AWS. Ayuda a los clientes a utilizar los servicios de AWS para diseñar aplicaciones escalables, seguras y resilientes. Además, se ha especializado en inteligencia artificial y aprendizaje automático (AI/ML). Como pasatiempo, le gusta leer libros, jugar videojuegos y cocinar.

 

 

 

 

Luis Miguel Flores dos Santos es arquitecto de soluciones en AWS. Cuenta con más de 10 años de experiencia en la arquitectura de soluciones locales y en la nube, centrándose en la resiliencia, el rendimiento y la automatización. En la actualidad se especializa en arquitecturas serverless. En su tiempo libre le gusta leer, jugar un buen videojuego y pasar tiempo con familiares y amigos.

 

 

 

 

Revisores

Yan Marim es arquitecto de soluciones en AWS y su principal tema de interés es la inteligencia artificial y el aprendizaje automático. Ayuda a los clientes empresariales en sus procesos de transformación digital mediante la plataforma de AWS.

 

 

 

 

Tiago Simão es arquitecto de soluciones en AWS. Trabaja ayudando a los clientes de Media & Entertainment en su viaje a la nube y se ha especializado en inteligencia artificial y aprendizaje automático (AI/ML).