Seminario de Tesis I:

Reconocimiento de Rostros en Tiempo Real y Comunicación usando protocolos IoT

Steve Anthony Luzquiños Agama

26 de enero de 2022

Contenido

  1. Introducción y Objetivos
  2. Conocimientos previos
  3. Estructuración y Método
  4. Resultados
  5. Conclusiones y Trabajo Futuro
  6. 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

  1. Entender el funcionamiento del protocolo MQTT para IoT.
  2. Entender los diferentes métodos de Reconocimiento de Rostros.
  3. Tomar fotos y enviarlas a un modelo de ML de Reconocimiento de Rostros a través del protocolo MQTT.
  4. Implementar un sistema de ML de Reconocimiento de Rostros que nos permita determinar si una persona es conocida o no.
  5. 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]:

  1. 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:
    Paso 1 del proceso de Reconocimiento Facial
    Ejemplo de Identificación de Rostros [8].
  2. 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:
    Paso 2 del proceso de Reconocimiento Facial
    Ejemplo de Análisis de Rostros [8].
  3. 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].
  4. 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:

Ejemplo de Diagrama de Comunicación en IoT usando el protocolo MQTT.
Ejemplo de Diagrama de Comunicación en IoT usando el protocolo 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:

  1. Tener almacenadas un conjunto de imágenes de prueba que nos permitan entrenar un modelo de ML.
  2. 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".
  3. 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.
  4. 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".
  5. Escuchar a los mensajes publicados en el tópico "DoorCloud/photo" y recolectar la foto y el "id" del usuario.
  6. Almacenar la foto en un bucket privado, este a su vez nos retornará una URL pública que podrá ser utilizada más adelante.
  7. Enviar nuestra foto nuestro modelo de ML para que la procese y determine si la foto recibida fue o no identificada.
  8. Sincronizar la respuesta del modelo de ML y de la URL.
  9. 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:

Diagrama de arquitectura del sistema "DoorCloud".
Diagrama de arquitectura del sistema "DoorCloud".

Broker HTTP/MQTT

Despliegue del broker MQTT 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:

Registro en HiveMQ.
Registro en HiveMQ.
Configuración de credenciales de un dispositivo.
Configuración de credenciales de un dispositivo.
Configuración de credenciales de un dispositivo.
Configuración de credenciales de un dispositivo.

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:

Diagrama de Flujo de la función "sendPicture".
Diagrama de Flujo de la función "sendPicture".

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:

Ejemplo de Arquitectura Limpia.
Ejemplo de Arquitectura Limpia [18].

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:

  1. El usuario ya está registrado en nuestra base de datos.
  2. 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.

Diagrama de Flujo del caso de uso de Registro de Usuario.
Diagrama de Flujo del caso de uso de Registro de Usuario.
Diagrama de Flujo del caso de uso de Subida de Fotos.
Diagrama de Flujo del caso de uso de Subida de 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:

Diagrama E/R básico de la tabla "users".
Diagrama E/R básico de la tabla "users".

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:

  1. Registro en Supabase
    Registro en Supabase.
    Registro en Supabase.
  2. Creación de proyecto
    Creación de proyecto en Supabase.
    Creación de proyecto en Supabase.
  3. Creación de la base de datos
    Creación de la base de datos usando el diagrama E/R mostrado anteriormente.
    Creación de la base de datos usando el diagrama E/R mostrado anteriormente.
  4. Creación de bucket
    Creación del "bucket" "photos" en Supabase.
    Creación del "bucket" "photos" en Supabase.
  5. 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:

Registro en Twilio.
Registro en Twilio.

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:

"Templates" de mensajes en Twilio.
"Templates" de mensajes en Twilio.

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:

Diagrama de Flujo del caso de uso Envío de foto por WhatsApp.
Diagrama de Flujo del caso de uso Envío de foto por WhatsApp.

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:

Máquina de estados del Reconocimiento de Facial.
Máquina de estados del Reconocimiento de Facial.

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:

  1. 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.
  2. 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.
  3. 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:

  1. Casos identificados exitosamente: Ce
  2. Casos totales: Ct
  3. 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:

  1. 339 de los 350 casos fueron casos de éxito, es decir, encontraron una coincidencia entre entre los rostros.
  2. 11 de los 350 casos fueron casos de fracaso, es decir, no encontraron una coincidencia entre entre los rostros.
  3. 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.

  1. 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.
  2. Se identificaron diferentes métodos de reconocimiento de rostros y se implementó uno de ellos en el sistema desarrollado.
  3. 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.
  4. Se logró un tiempo de latencia promedio de 2.16 segundos para la detección de rostros utilizando el modelo de ML implementado.
  5. 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.
  6. 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.
  7. Se logró un Coeficiente de Identificación de 0.969.
  8. Se logró notificar a un usuario sobre los resultados del proceso de identificación:
    Resultados de la notificación de usuarios por WhatsApp.
    Resultados de la notificación de usuarios por WhatsApp.

Trabajos Futuros

  1. 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.
  2. 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.
  3. 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.
  4. Detallar la implementación del Servidor HTTP.

Referencias

  1. Twilio. Ene. de 2023. URL: https://www.twilio.com
  2. 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.
  3. Kaspersky. What is facial recognition – definition and explanation. Feb. de 2022. URL: https://www.kaspersky.com/resource-center/definitions/what-isfacial-recognition.
  4. 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.
  5. Arila Guevara Echeverry. “Faces detection in digital images using cascade classifiers”. En: (2008). URL: https://repositorio.utp.edu.co/items/46d284cfc6c6-4a5a-a184-04f6bf63005c.
  6. 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.
  7. 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.
  8. 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.
  9. Dean Bubley. “Iot & realtime communications”. En: IEEE Internet of Things Newsletter (2016).
  10. HiveMQ GmbH. HiveMQ. 2022. URL: https://www.hivemq.com.
  11. mqttjs. MQTT.JS. 2022. URL: https://github.com/mqttjs/MQTT.js.
  12. npm. npm. 2022. URL: https://www.npmjs.com.
  13. Ecma Intenational. Ecma - 262. 2022. URL: https://www.ecma-international. org/publications-and-standards/standards/ecma-262.
  14. Charlie Abeling. chuckfairy/node-webcam: Nodejs Cross Platform Webcam usage. Mayo de 2016. URL: https://github.com/chuckfairy/node-webcam.
  15. Anthony Luzquiños. AnthonyLzq/node-webcam: Node.js Cross Platform Webcam usage. Dic. de 2022. URL: https://github.com/AnthonyLzq/node-webcam.
  16. Supabase Inc. Supabase. 2022. URL: https://supabase.com.
  17. OpenJS Fundation. Node.js About Node.js. 2022. URL: https://nodejs.org.
  18. Robert C Martin. The Clean Code Blog. Ago. de 2012. URL: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html.
  19. The Fastify team. Fastify. 2022. URL: https://www.fastify.io.
  20. Mandic. Vladmandic/human: Human: AI-powered 3D Face Detection amp; Rotation Tracking, face description amp; recognition, body pose tracking, 3D Hand amp; finger tracking, Iris analysis, age amp; gender amp; emotion prediction, gaze tracking, gesture recognitionVladimir. URL: https://github.com/vladmandic/human.
  21. Face detection. URL: https://google.github.io/mediapipe/solutions/face_ detection.html.