Reconocimiento de Rostros en Tiempo Real y Comunicación usando protocolos IoT
Steve Anthony Luzquiños Agama
26 de enero de 2022
Contenido
Introducción y Objetivos
Conocimientos previos
Estructuración y Método
Resultados
Conclusiones y Trabajo Futuro
Referencias
Introducción y Objetivos
Introducción
La seguridad y privacidad son temas cada vez más importantes en nuestra sociedad actual. Con la creciente tecnología de Reconocimiento Facial y el aumento de dispositivos conectados a internet, el desarrollo de sistemas de seguridad y privacidad se ha vuelto esencial. En este contexto, esta Tesis se propone implementar un sistema que combina tecnologías de Reconocimiento Facial y el Internet de las Cosas (IoT) para determinar la identidad de una persona en Tiempo Real a través del protocolo MQTT para luego informarle a un usuario determinado la identidad de la persona en cuestión. Este sistema será denominado de ahora en adelante como "DoorCloud".
"DoorCloud" comparará la imagen capturada en Tiempo Real con una base de datos de rostros conocidas y se notificará el resultado de la comparación mediante la API de Twilio [1] vía WhatsApp. Este sistema puede tener aplicaciones en una variedad de entornos, como edificios de oficinas, instalaciones gubernamentales, y lugares públicos.
Objetivos
Entender el funcionamiento del protocolo MQTT para IoT.
Entender los diferentes métodos de Reconocimiento de Rostros.
Tomar fotos y enviarlas a un modelo de ML de Reconocimiento de Rostros a través del protocolo MQTT.
Implementar un sistema de ML de Reconocimiento de Rostros que nos permita determinar si una persona es conocida o no.
Reportar a un usuario si la persona detectada por el sistema de ML es conocida o no.
Conocimientos previos
Reconocimiento Facial
La tecnología de Reconocimiento Facial es una tecnología biométrica, que se basa en la identificación de los rasgos faciales de una persona [2]. Por lo general, se usa como una forma de seguridad, por ejemplo, para identificar a las personas en una multitud o para verificar la identidad de una persona que intenta acceder a un edificio, cuenta de correo, bancaria, etc.
Comúnmente el proceso de Reconocimiento Facial consta de 4 pasos [3]:
Detección de rostros en una imagen. Esto se puede hacer usando una variedad de métodos, incluidas las cascadas de Haar [4, 5], los patrones binarios locales (LBP) [6] y el aprendizaje profundo [7]. Podemos ver un ejemplo de esto en la siguiente figura:
Análisis de rostros. Esto generalmente consiste en identificar las propiedades geométricas claves del rostro. El objetivo es identificar puntos de referencia que son esenciales para distinguir un rostro [3]. Podemos ver un ejemplo de esto en la siguiente figura:
Conversión de la imagen en data. Este proceso consiste en obtener un conjunto de datos numéricos a partir de los puntos de referencia identificados en el paso anterior. Estos datos numéricos son conocidos, generalmente, como "faceprint" (huella facial). Análogamente a las huellas digitales, las huellas faciales son únicas para cada rostro [3].
Comparación. Finalmente, una vez calculada la huella facial del rostro, esta se compara contra un dataset de huellas faciales previamente registradas para encontrar alguna coincidencia [3].
Comunicación en Tiempo Real
La creciente popularidad de los dispositivos conectados y la tecnología de la Internet de las Cosas (IoT) nos lleva a situaciones en las cuales necesitamos la comunicación en tiempo real entre los humanos y los dispositivos electrónicos. Estas comunicaciones en tiempo real posibilitan una acción inmediata ante una eventualidad, como un sensor que detecta temperaturas excesivas en una máquina, un administrador remoto que necesita hablar con un técnico, o un dron agrícola que informa sobre las condiciones del cultivo. Esto implica desarrollar herramientas y plataformas flexibles para crear servicios y soluciones basadas en la nube y en el lugar [9]. Entre las tecnologías que permiten la comunicación en tiempo real podemos mencionar: WebSockets, SignalR, WebRTC, MQTT, etc. En este proyecto se utilizará MQTT, ya que es un protocolo de mensajería que permite comunicación en tiempo real entre dispositivos y aplicaciones independientes de la plataforma y del lenguaje de programación. Este protocolo es del tipo de publicación/suscripción, lo que significa que los dispositivos se suscriben a un tópico y reciben los mensajes publicados en ese tópico. MQTT es un protocolo de mensajería orientado a la eficiencia, lo que significa que es muy eficiente en términos de ancho de banda y recursos de red. Veamos un ejemplo de un diagrama básico de comunicación MQTT:
Estructuración y Método
Planificación y Diseño del Sistema
El primer paso será definir las características que "DoorCloud" debe tener:
Tener almacenadas un conjunto de imágenes de prueba que nos permitan entrenar un modelo de ML.
Tener almacenados los datos personales de un usuario, para nuestro caso: nombre y número de celular en una base de datos. Así mismo, esta base de datos debe contar con un identificador único que permita identificar a los usuarios; este identificador se llamará "id".
Tomar fotos con una cámara web cada vez que se "toque un timbre"; es decir, accione un mecanismo mecánico; por ejemplo: presionar un botón o se acciona un interruptor.
Enviar esta foto y el "id" del usuario mediante el protocolo MQTT a un "broker" MQTT, usando un tópico determinado; por ejemplo: "DoorCloud/photo".
Escuchar a los mensajes publicados en el tópico "DoorCloud/photo" y recolectar la foto y el "id" del usuario.
Almacenar la foto en un bucket privado, este a su vez nos retornará una URL pública que podrá ser utilizada más adelante.
Enviar nuestra foto nuestro modelo de ML para que la procese y determine si la foto recibida fue o no identificada.
Sincronizar la respuesta del modelo de ML y de la URL.
Enviar la respuesta (persona identificada o no identificada) junto con la foto a nuestro usuario vía WhatsApp utilizando laAPI de Twilio.
Podemos resumir los pasos anteriores utilizando el siguiente diagrama:
Broker HTTP/MQTT
Despliegue del brokerMQTT usando HiveMQ [10]
El segundo paso es crear una cuenta en la consola de HiveMQ y luego configurar nuestro propio broker, veamos el proceso con las siguientes imágenes:
Una vez configurado nuestro broker MQTT, podemos conectarnos a él desde nuestro dispositivo utilizando las credenciales que hemos configurado anteriormente. Para esto haremos uso de la librería Mqtt.js [11].
Client MQTT
Implementación de librería de toma de fotos utilizando una cámara web
En NPM [12] existen en la actualidad 28 librerías las cuales implementan una abstracción de algún software que permite tomar fotos utilizando alguna webcam incorporada (o externa) del sistema. Lamentablemente ninguna de estas es compatible con TS, o se encuentra muy desactualizada, implementando versiones de EcmaScript (ES) [13] muy antiguas. Es por esto que nos vimos en la necesidad de re implementar una de las librerías más populares y estables (cuya última actualización fue hace menos de un año), hacerla compatible con TypeScript (TS) y luego publicarla en NPM para su posterior uso. Además de así contribuir con la comunidad Open Source. Se eligió la librería node-webcam [14] para ser re implementada, ya que es una de las más populares (175 estrellas en GitHub y 1000 descargas semanales en NPM) y estables (última actualización hace 6 meses), al menos comparadas con otras. La re implementación se comenzó realizando un fork en GitHub del proyecto original. Luego se replicaron las funcionalidades principales de la librería, utilizando TS en lugar de JavaScript (JS), además se disponibilizaron las principales funcionalidades que node-webcam utilizaba, y se migró la versión de ES a una más moderna. Luego de finalizar al migración, el nuevo paquete fue publicado bajo el nombre: @anthonylzq/node-webcam [15], siguiendo las reglas de nomenclatura de NPM, para luego ser utilizado en nuestro Cliente MQTT.
Implementación del cliente MQTT
Para simplificar este proceso, asumiremos que tenemos un usuario registrado en una base de datos alojada en Supabase [16]. En esta base de datos tendremos registrado el nombre del usuario y su número telefónico para hacerle llegar las notificaciones. Nuestra Raspberry PI ejecutará un script en Node.js [17] llamado sendPicture el cual utilizara la librería @anthonylzq/node-webcam y tomará una foto en formato png, la transformará en base64 y la enviará a nuestro broker MQTT junto con otra metadata necesaria para el procesamiento de la imagen. Este mensaje será enviado a través del tópico "DoorCloud/photo". Podemos representar el flujo explicado con el siguiente diagrama:
Servidor HTTP/MQTT
Nuestro servidor fue implementado utilizando una versión simplificada de la Arquitectura Limpia por capas. La cual favorece los diferentes principios del desarrollo de software. Podemos ver un ejemplo de arquitectura limpia en la siguiente imagen:
Servidor HTTP usando Fastify [19]
Fastify al ser un framework de Node.js nos ayudará a construir nuestra API, la cual tendrá nos servirá para registrar usuario y también registrar las fotos de los mismos, pero partiremos considerando las siguientes precondiciones:
El usuario ya está registrado en nuestra base de datos.
El usuario ya subió sus fotos en nuestro bucket.
Sin embargo, detallaremos el flujo que hubiera seguido un usuario al registrarse y subir sus fotos.
El detalle de la implementación del Servidor será considerado como trabajo futuro.
Supabase como bucket y base de datos
El siguiente paso registrarnos en Supabase, pero previo a eso definiremos el modelo entidad relación básico para DoorCloud:
Una vez definido el modelo entidad relación, debemos continuar con el registro, crear una base de datos y un bucket dentro de Supabase. Para ello, debemos seguir los siguientes pasos:
Registro en Supabase
Creación de proyecto
Creación de la base de datos
Creación de bucket
Integrar Supabase en el servidor
Implementación del Servidor MQTT utilizando MQTT.js
Para realizar esta implementación necesitamos las credenciales que obtuvimos al momento de crear nuestro cluster de HiveMQ, el usuario y contraseña, además de esto, necesitamos el host y el puerto donde está corriendo nuestro cluster. Con esto podemos instanciar nuestro client MQTT de la siguiente manera:Una vez hecho esto, ya tenemos el cliente de MQTT disponible en nuestro servidor. Ahora podemos definir una ruta, esta será una función que permitirá que nuestro cliente escuche únicamente a untopic y ejecute una función cuando llegue un mensaje en esetopic, podemos un ejemplo de una ruta a continuación:Finalmente, podemos registrar nuestra ruta utilizando nuestro cliente de MQTT de la siguiente manera:
Implementación de la API de Twilio en el Servidor
El primer paso para implementar la API de Twilio en nuestro servidor es crear una cuenta en Twilio, de la siguiente manera:
Una vez hecho esto, podemos crear un proyecto en Twilio y comprar un número de teléfono, esta parte no se detallará, pero una vez completada debemos crear templates de mensajes, tal como se ve en la siguiente figura:
Luego de haber terminado esta parte, debemos instanciar un cliente de Twilio en nuestro servidor, para esto necesitaremos las keys ACCOUNT_SID y AUTH_TOKEN que Twilio nos provee, de la siguiente manera:Una vez creado nuestro cliente, podemos crear una función que nos permita enviar mensajes de WhatsApp, como se puede apreciar en el siguiente ejemplo:Una vez implementada el cliente de Twilio en nuestro servidor ya podemos hacer enviar la foto tomada hasta nuestro usuario final. Este proceso se detalla mediante el siguiente diagrama de flujo:
Modelo de Reconocimiento Facial
Utilizaremos la librería Human [20] para la detección y comparación de rostros, esta librería utiliza un modelo llamado MediaPipe BlazeFace Back variation, el cual es una variante del modelo MediaPipe Face Detection [21]. El proceso de detección y comparación de rostros se detalla mediante la siguiente máquina de estados:
El siguiente código es un ejemplo de cómo podría darse este proceso:
Métricas
Latencia
Definiremos la latencia como el retraso en la comunicación entre 2 sistemas, la mediremos en unidades de tiempo (segundos), y en el presente proyecto utilizaremos 3 tipos de latencias las cuales detallaremos a continuación:
Latencia de Foto. Esta latencia será definida como el tiempo que se demora nuestro cliente IoT en tomar una foto utilizando la librería desarrollada para la presente tesis,@anthonylzq/node-webcam.
Latencia MQTT. Esta latencia será definida como el tiempo que se demora el nuestro servidor IoT en recibir la foto procesada desde el cliente IoT utilizando el protocolo MQTT.
Latencia de Detección. Esta latencia será definida como el tiempo que se demora nuestro modelo de Reconocimiento Facial en detectar una coincidencia o no, entre las fotos previamente almacenadas y la foto recibida.
Coeficiente de Identificación
Los resultados de detección pueden variar por diferentes factores, incluso cuando la foto se trata de la misma persona, calcularemos el coeficiente de identificación como la cantidad de casos identificados exitosamente sobre la cantidad de casos totales. De la siguiente manera:
Casos identificados exitosamente: Ce
Casos totales: Ct
Coeficiente de Identificación: Ci=CeCt
Resultados
Latencia
Como se detalló en la sección anterior, analizaremos 3 métricas de latencia, Latencia de Foto, Latencia MQTT y Latencia de Detección.
Latencia de Foto
A pesar de haber implementado el script para tomar una foto usando la webcam en TS, la Latencia de Foto se mantuvo con valores consistentes, menores en su mayoría a 1.3s, tal como se muestra en la siguiente gráfica.
Latencia MQTT
A pesar de que ambos sistemas están implementados usando TS y se están conectando a través de un Broker MQTT remoto, la Latencia MQTT es también bastante consistente y se mantuvo en promedio a 2.47s, tal como se muestra en la siguiente gráfica.
Latencia de Detección
Nuevamente, a pesar de usar TS para la detección de rostros, la Latencia de Detección se sigue manteniendo consistente y se mantuvo en promedio a 2.16s.
Coeficiente de Identificación
De los 350 datos tomados como referencia para la identificación de rostros, se obtuvieron los siguientes resultados:
339 de los 350 casos fueron casos de éxito, es decir, encontraron una coincidencia entre entre los rostros.
11 de los 350 casos fueron casos de fracaso, es decir, no encontraron una coincidencia entre entre los rostros.
El Coeficiente de Identificación resultante fue: Ci=0.969.
Conclusiones y Trabajo Futuro
Conclusiones
En este capitulo presentamos las conclusiones obtenidas de acuerdo a los objetivos planteados inicialmente.
Se demostró que es posible implementar un sistema de reconocimiento de rostros utilizando el protocolo MQTT para IoT. El cual demora (en promedio) 5.79 segundos en reportar el resultado de identificación de una persona.
Se identificaron diferentes métodos de reconocimiento de rostros y se implementó uno de ellos en el sistema desarrollado.
Se logró un tiempo de latencia promedio de 1.16 segundos para la toma de fotos y de 2.47 segundos para el envío de las mismas a través del protocolo MQTT, lo cual es optimizable mediante un preprocesamiento de las imágenes.
Se logró un tiempo de latencia promedio de 2.16 segundos para la detección de rostros utilizando el modelo de ML implementado.
Se logró una tasa de reporte del 100% en el sistema de reconocimiento de rostros, indicando que todas las personas detectadas fueron correctamente reportadas como conocidas o no conocidas.
Se propone una estrategia de preprocesamiento para reducir la latencia en el envío de las fotos, para reducir la latencia en el envío de las fotos se podría hacer uso de técnicas de compresión de imágenes antes de enviarlas a través del protocolo MQTT. Esto permitiría reducir el tamaño de las imágenes y, por lo tanto, reducir el tiempo necesario para transmitirlas. Otra estrategia podría ser reducir la resolución de las imágenes antes de ser enviadas, ya que esto también ayudaría a reducir el tamaño de las imágenes y por ende el tiempo de envío.
Se logró un Coeficiente de Identificación de 0.969.
Se logró notificar a un usuario sobre los resultados del proceso de identificación:
Trabajos Futuros
Agregar un sistema de seguridad adicional para garantizar la privacidad de los usuarios. Actualmente el sistema no cuenta con ningún tipo de seguridad para la comunicación entre los servicios.
Implementar una estrategia de preprocesamiento de imágenes para reducir la Latencia MQTT. Una de las posibles soluciones sería identificar el rostro de la persona en el micro computador antes de enviar la imagen, lo cual permitiría reducir la latencia MQTT.
Implementar un sistema de reconocimiento de rostros en tiempo real para detectar personas en movimiento. Actualmente el sistema solo detecta rostros en imágenes estáticas, fotos tomadas por el micro computador, para ser precisos.
Detallar la implementación del Servidor HTTP.
Referencias
Twilio. Ene. de 2023. URL: https://www.twilio.com
Lixiang Li et al. “A Review of Face Recognition Technology”. En: IEEE Access 8 (2020), págs. 139110-139120. doi: 10.1109/ACCESS.2020.3011028.
Kaspersky. What is facial recognition – definition and explanation. Feb. de 2022. URL: https://www.kaspersky.com/resource-center/definitions/what-isfacial-recognition.
Hussein Alhamzawi. “Faces and eyes Detection in Digital Images Using Cascade Classifiers”. En: Computer Engineering and Applications Journal 7 (jun. de 2018), págs. 57-66. doi: 10.18495/comengapp.v7i1.222.
Arila Guevara Echeverry. “Faces detection in digital images using cascade classifiers”. En: (2008). URL: https://repositorio.utp.edu.co/items/46d284cfc6c6-4a5a-a184-04f6bf63005c.
T. Ahonen, A. Hadid y M. Pietikainen. “Face Description with Local Binary Patterns: Application to Face Recognition”. En: IEEE Transactions on Pattern Analysis and Machine Intelligence 28.12 (2006), p´ags. 2037-2041. doi: 10.1109/TPAMI. 2006.244.
Florian Schroff, Dmitry Kalenichenko y James Philbin. “FaceNet: A unified embedding for face recognition and clustering”. En: 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (2015). doi: 10.1109/cvpr.2015. 7298682.
Geitgey Adam. Ageitgey/face recognition: The world's simplest facial recognition API for python and the command line. Mar. de 2017. URL: https://github.com/ ageitgey/face_recognition.
Dean Bubley. “Iot & realtime communications”. En: IEEE Internet of Things Newsletter (2016).