Blog de Amazon Web Services (AWS)

Ciudades Inteligentes

Por Marcos Boaglio, Senior Solutions Architect, SOLAPS/LCC WWPS

 

 

Introducción

El avance tecnológico de los últimos años en términos de sensores, cámaras y comunicaciones habilita la recopilación de datos sobre diferentes variables y aspectos de una ciudad. Desde emisiones de carbono, tráfico vehicular, transporte público, utilización de estacionamientos o flujo de peatones. Lo que la convierte en ciudad inteligente es la capacidad de accionar sobre esos datos para predecir o influenciar ciertos comportamientos con el objetivo de mejorar el bienestar de sus ciudadanos. Desde el punto de vista técnico, el desafío pasa por administrar ese flujo de datos proveniente de dichos sensores, almacenándolos eficientemente y procesándolos inteligentemente con técnicas de aprendizaje automático y/o profundo para detectar patrones y poder actuar en consecuencia.

Pensemos en el trafico vehicular. Poder medir la cantidad de vehículos que recorren ciertas arterias de la ciudad. Analizar su comportamiento nos da una herramienta para prevenir accidentes y tomar mejores decisiones en termino de inversiones. Con las herramientas que mostraremos en este blog post podremos detectar patentes o matrículas de vehículos, junto con comportamientos de tráfico como giros indebidos o circulación por determinados lugares, para luego disparar alertas o generar tableros de control estadístico.

En este primer blog post vamos a recorrer el caso de uso de cámaras inteligentes entrenadas en la nube de AWS para detectar comportamientos en lo que llamamos “el borde”. Vamos a describir el procedimiento sobre un ejemplo de detección de patentes o matrículas de vehículos de Argentina y Mercosur, que puede ser extendido a otros casos de uso. En el segundo blog post compartiremos la información detallada de configuración de los servicios junto con el código Python para realizar la implementación.

 

Cámaras Inteligentes

Llamaremos cámara inteligente a un equipo capaz de capturar imágenes y que, además, tiene poder de computo que le permite procesar dichas imágenes en tiempo real. Es posible armarlo conectando equipos de borde, como una PC industrial o un dispositivo con GPU, a una cámara tradicional. Existen también, cámaras que incorporan ambas funcionalidades. En este caso utilizaremos un equipo de borde NVIDIA Jetson Nano de 4GB (con GPU), junto con una cámara Arducam B0179 conectados a Internet.

Para la implementación, dividimos el caso de uso en dos etapas:

  • Etapa 1: Entrenamiento de modelos de detección de objetos en la nube utilizando aprendizaje profundo
  • Etapa 2: Despliegue de modelos e inferencia en el borde

Para la etapa 1 utilizaremos Amazon GroundTruth para etiquetar el conjunto de datos, junto con Amazon Sagemaker para entrenar los modelos. Luego, en la siguiente etapa, utilizaremos AWS IoT Greengrass que nos permite realizar despliegues de los modelos junto con el código de inferencia. En ambas etapas utilizaremos Amazon S3 para administrar el almacenamiento de los conjuntos de datos utilizados.

 

Etapa 1: Entrenamiento de modelos de detección de objetos en la nube

Como hemos comentado anteriormente, durante esta etapa vamos a entrenar un modelo de detección de patentes utilizando un conjunto de datos (dataset) con imágenes de patentes de Argentina y del Mercosur. Dicho dataset está compuesto por diferentes imágenes de patentes en distintas situaciones: fotos en primer plano, en vehículos, fotos de frente pero tomadas desde ángulos diferentes, y fotos de tránsito.

Para que el dataset pueda ser utilizado para entrenar un modelo de detección de objetos, es necesario etiquetar cada imagen, especificando un cuadro delimitador ( “bounding box” o “BB” en inglés ) de cada patente. Dicho cuadro especifica en que parte de cada imagen se encuentra la patente que necesitamos detectar.

En este caso, vamos a trabajar sobre un dataset de mas de 1000 imágenes provenientes de diferentes fuentes. Etiquetar cada una de ellas con un proceso manual sería un proceso tedioso que consumiría tiempo y recursos. Es por ello que vamos a utilizar Amazon Ground Truth junto con Amazon Mechanical Turk para la tarea.

Amazon Ground Truth es una herramienta que nos permite gestionar el etiquetado de un dataset, delegando las tareas manuales a fuerzas de trabajo (o “Workforces”). Provee una interfaz de usuario configurable de forma tal de presentar a cada trabajador una imagen del dataset con instrucciones preestablecidas de como debe ser etiquetada. Dichas fuerzas de trabajo pueden ser de tres tipos: Privadas, Proveedores o Mechanical Turk. Las fuerzas de trabajo privadas son aquellas que gestionamos directamente, por ejemplo, si contamos con un equipo de personas para realizar las tareas y solo necesitamos orquestar el proceso. Las provistas por proveedores especializados son necesarias para casos donde necesitamos cierto conocimiento y no tenemos un equipo de especialistas disponible en forma directa, por ejemplo, si estuviéramos etiquetando imágenes médicas y necesitamos un equipo de profesionales de la medicina para entender las imágenes y realizar el etiquetado. Y finalmente Amazon Mechanical Turk. La fuerza de trabajo de Amazon Mechanical Turk es un recurso global compuesto por trabajadores disponibles las 24 horas del día, los 7 días de la semana. Por lo general, utilizando esta fuerza, se obtiene el resultado más rápido en el proceso. En nuestra prueba de concepto hemos etiquetado alrededor de 1000 imágenes en menos de 24 horas.

Una vez que lanzamos el proceso de etiquetado con Mechanical Turk, el proceso va asignando imágenes a cada trabajador y, en paralelo, va entrenando un modelo de detección que acelera el proceso completo. Esto se produce porque, a medida que el modelo se va poniendo mas preciso, va sugiriendo BBs (“bounding boxes”) a los trabajadores, que solamente deben verificar y confirmar. Por otro lado, cuando el proceso considera que el modelo tiene suficiente precisión, etiqueta el resto del dataset en forma automática sin recurrir a mas trabajadores.

Al finalizar todo el proceso no solo se obtiene el dataset etiquetado, sino también un modelo entrenado y listo para poner en producción (si quisiéramos). En nuestro caso no lo vamos a utilizar ya que necesitamos un modelo optimizado para la plataforma de borde (mas abajo vemos los detalles).

Con el dataset etiquetado, vamos a crear un modelo de detección de objetos basado en YOLO (o “You Only Look Once”). YOLO es un algoritmo de detección de objetos descrito en un paper de Joseph Redmon et al. «You Only Look Once: Unified, Real-Time Object Detection, «. Es una red neuronal convolucional (o CNN) inteligente que permite realizar una detección de objetos en tiempo real. El algoritmo aplica una red neuronal a una imagen completa, luego divide la imagen en regiones y predice cuadros delimitadores y probabilidades para cada región. Estos cuadros delimitadores están ponderados por las probabilidades predichas. Lo escribiremos en Python, utilizando el framework Tensorflow, y lo vamos a entrenar utilizando Amazon Sagemaker.

Amazon Sagemaker es un servicio gestionado que brinda a los desarrolladores y científicos de datos la capacidad de construir, entrenar e implementar modelos de aprendizaje automático rápidamente. SageMaker elimina el trabajo pesado de cada paso del proceso de aprendizaje automático para facilitar el desarrollo de modelos. Nos va a permitir orquestar el entrenamiento del modelo levantando las instancias con GPU que necesitemos, copiando en ellas el dataset que etiquetamos con Amazon GroundTruth, instalándoles un container con el algoritmo que creamos utilizando Python/Tensorflow, para finalmente dejarnos el modelo entrenado y optimizado en un bucket Amazon S3. Dichas instancias se levantan sólo durante el entrenamiento, haciendo eficiente el uso de infraestructura.

Todo ello lo orquestaremos desde una notebook Jupyter que tendrá el código necesario para obtener dicho modelo optimizado para el GPU del equipo de borde NVIDIA Jetson Nano. Para esta última etapa de optimización, la notebook incluirá los servicios de Amazon Sagemaker Neo.

Amazon SageMaker Neo les permite a los desarrolladores entrenar modelos de aprendizaje automático una única vez y ejecutarlos en cualquier lugar en la nube y en el borde. Optimiza modelos para ejecutarlos hasta el doble de rápido, con menos de un décimo de la cantidad de memoria, sin perder la precisión.

En la figura 1 podemos ver el proceso resumido partiendo desde el dataset hasta el modelo final.

Figura 1: Etapa 1 – Entrenamiento del modelo en la nube

 

Etapa 2: Despliegue y administración de modelos en el borde

Una vez que el proceso de entrenamiento en la nube haya finalizado, tendremos un modelo para detección de patentes optimizado y listo para usar.

El paso siguiente es definir la lógica que vamos a implementar en el dispositivo de borde para detectar y accionar en consecuencia. En este caso hemos definido que el equipo de borde ejecute una inferencia con el modelo por cada cuadro de video que recibe, localice la patente en la imagen, ejecute una función de OCR (de OpenCV) y reporte vía MQTT un texto con la patente detectada.

Para ello vamos a desarrollar funciones AWS Lambda escritas en Python. Las funciones AWS Lambda permiten ejecutar código en la nube sin aprovisionar ni administrar servidores. Simplifican y dan velocidad a los proyectos, permitiendo a los desarrolladores enfocar su tiempo en resolver el caso de uso y no en la infraestructura subyacente.

En este caso, vamos a trasladar el cómputo desde la nube hacia los equipos de borde. De esta forma, aprovechamos el poder de cómputo de la nube para realizar los entrenamientos de los modelos (pasando de días a minutos) y el desarrollo del código de inferencia, para luego aprovechar el cómputo en el borde minimizando la latencia de inferencia y el uso de ancho de banda de la red de dispositivos.

Para esta segunda etapa del proceso utilizaremos AWS Greengrass, que nos va a permitir distribuir y administrar las funciones y los modelos de inferencia que desarrollamos en la nube.

AWS IoT Greengrass extiende AWS a dispositivos de borde de manera sencilla, de modo que puedan actuar a nivel local en función de los datos que generan, al mismo tiempo que utilizan la nube para tareas de administración, análisis y almacenamiento duradero. Con AWS IoT Greengrass, los dispositivos conectados pueden ejecutar funciones de AWS Lambda, contenedores Docker o ambos, ejecutar predicciones basadas en modelos de aprendizaje automático, mantener los datos de dispositivos sincronizados y comunicarse con otros dispositivos de manera segura, incluso sin estar conectados a Internet.

Una vez hecho el despliegue de las funciones y los modelos al borde, la función se ejecutará en cada unidad de cómputo en forma permanente (en un bucle), detectando patentes y enviando el texto reconocido vía MQTT hacia la nube. AWS IoT Core es el servicio gestionado encargado de recibir dichos mensajes y actuar en consecuencia. Para ello puede ser configurado definiendo reglas capaces de reenviar los mensajes hacia otros servicios de AWS como bases de datos, servicios de alertas, etc.

Las reglas dan a los dispositivos la capacidad de interactuar con los servicios de AWS. Las reglas se analizan y las acciones se realizan según el flujo de tópicos de MQTT. Las reglas se pueden usar para soportar tareas como estas: Enriquecer o filtrar los datos recibidos de un dispositivo, insertarlos en bases de datos como Amazon DynamoDB, guardarlos como un archivo en Amazon S3, enviar una notificación de inserción a usuarios que utilizan Amazon SNS, publicar los mensajes en una cola de Amazon SQS, invocar una función Lambda para procesarlos, enviarlos a Amazon Elasticsearch, capturar métricas o disparar alarmas de CloudWatch, enviar los mensajes a un canal de AWS IoT Analytics, iniciar la ejecución de una máquina de estado Step Functions, o enviar datos de mensajes a una aplicación o servicio web.

En este caso vamos a definir una regla en AWS IoT Core para envíe los mensajes MQTT con las patentes detectadas a Amazon Kinesis Data Firehose que va a agrupar los mensajes y los va a almacenar en Amazon S3, para que finalmente puedan ser consultados y agregados desde Amazon QuickSight utilizando Amazon Athena.

Amazon Kinesis Data Firehose ofrece la manera más sencilla para cargar datos de streaming de manera confiable en data lakes, almacenes de datos como Amazon S3 y servicios de análisis. Amazon Athena es un servicio de consultas interactivo que facilita el análisis de datos en Amazon S3 con SQL estándar. Amazon QuickSight permite crear y publicar dashboards interactivos fácilmente, permitiendo acceder desde cualquier dispositivo, integrarlos en las aplicaciones, portales y sitios web.

En la figura 2 podemos ver el proceso de despliegue de las funciones AWS Lambda junto con los modelos para inferencia. También podemos ver como la función publica en un tópico MQTT cada inferencia con la patente, que luego es procesada por el servicio AWS IoT Core, reenviando el dato a Amazon Kinesis Data Firehose para agruparlo, luego a Amazon S3 para ser consultado vía Amazon QuickSight utilizando Amazon Athena.  Amazon QuickSight mostrará un dashboard inteligente con las patentes detectadas en el tiempo.

 

Figura 2: Etapa 2 – Despliegue de modelos en el borde

 

La arquitectura es fácil de extender a otros casos de uso. Agregando nuevos modelos de detección de objetos, códigos de inferencia para los equipos de borde, y nuevas métricas en el dashboard es posible escalar el sistema para que detecte comportamientos no deseados en una implementación distribuida.

 

Conclusión

Las ciudades inteligentes son una realidad. Las tecnologías que las hacen posibles existen y son el fruto del desarrollo de años. Solo necesitamos combinarlas para desarrollar soluciones que permitan hacer realidad cada caso de uso.

En este blog post hemos repasado el caso de uso de cámaras inteligentes que detectan comportamientos en el borde, utilizando modelos de detección entrenados en la nube de AWS. Entrenar el modelo en la nube de AWS permite explotar el máximo poder de cómputo necesario, minimizando el tiempo para producir el resultado y ahorrando costos. La inferencia ejecutada y gestionada en el borde permite distribuir el procesamiento eficientemente, disminuyendo el uso de ancho de banda de la red de datos que conecta los equipos de borde.

En el próximo blog post profundizaremos en los detalles de la solución técnica que hace todo esto posible, y veremos un ejemplo de como extender estas funcionalidades a diferentes casos de uso.

 

 


Sobre el autor

Marcos es Arquitecto Senior de Soluciones de AWS para el sector público en Argentina. En ese rol, es responsable de guiar y proveer ayuda a las organizaciones en su estrategia hacia la nube, proporcionando orientación sobre cómo abordar problemas de alto riesgo. Marcos también es el responsable por proyectos basados machine learning e IoT para el sector público en el Cono Sur. Tiene más de 25 años de experiencia con tecnología, incluyendo el desarrollo de soluciones cloud, machine learning, desarrollo de software e infraestructura de datacenter.