Doorman

Inspiración

En mi compañía hay muchas personas que trabajan tanto en sus hogares como en las oficinas (varias sucursales). Algunas veces, resulta difícil saber si alguien está activo o disponible o no, o dónde se encuentra físicamente. También ocurre que las personas suelen olvidarse de cambiar su estado a "activo". También debemos tener en cuenta las diferentes regiones y los husos horarios.

También usamos el mensaje de estado personal de Slack para informar dónde nos encontramos (trabajando desde casa, en la oficina y, en este último caso, desde qué sucursal).

Aquí es donde introducimos a DeepLens. ¿No sería genial que, siempre que llegases a la oficina, se te reconociera y marcara como "activo" en Slack, y que el estado se actualizara con el nombre de la sucursal en la que te encuentras?

Qué hace

  • Detecta cuando una persona ingresa a una de las sucursales.
  • Intenta detectar a la persona.
  • Si logra identificarla, dirá un mensaje de bienvenida en Slack "Welcome @svdgraaf!" (Bienvenido/a, @svdgraaf).
  • Si no logra hacerlo, preguntará en Slack "Who is this?" (¿Quién es?) y se podrá seleccionar el usuario correspondiente.
  • Si no se desea reconocer a la persona (por ej., clientes o individuos que no sean usuarios de Slack), se selecciona "ignore" (ignorar) y la imagen se elimina de S3.
  • A continuación, la información se almacena en la API de Rekognition.
    La próxima vez, identificará a la persona como tal y lo registrará en el canal de Slack.

Qué no hace aún:

  • Marcar una persona como activa en Slack
  • Definir el estado de una persona en Slack
  • Hablar en voz alta con Polly, no se logró que el servicio funcionase en el dispositivo

Cómo se desarrolló

Creé el proyecto con la modalidad sin servidor, que facilita en gran medida la implementación de las funciones de Lambda. Intenté crear un modelo propio, pero no lo logré (y me preocupaban los costos de entrenamiento de las instancias EC2). Finalmente, usé el modelo "deeplens-object-detection", no un modelo personalizado, y revisé en busca de objetos "person".

Cómo funciona: El dispositivo DeepLens detecta que entran objetos. Si detecta una persona, toma una instantánea de dicha parte y la sube a S3. Esta acción activa una función "guess" que intenta identificar a la persona. Si es una persona conocida, llama a la API de Slack. Si es una persona desconocida, también llama a la API de Slack. Dentro del canal, las personas pueden entrenar la persona desconocida con un usuario específico y se llamara a API Gateway para entrenar la imagen.

El diagrama de la arquitectura se encuentra en el carrusel de imágenes de la parte superior.

Desafíos

Greengrass: un par de veces recibí errores de Greengrass, lo que significaba que no estaba implementando ni ejecutando mi función de Lambda.

DeepLens: mi dispositivo DeepLens un día funcionaba y otro día no. La característica de actualización automática de Ubuntu es genial, hasta que deja de funcionar. Además: me llevó un poco de tiempo descubrir que es posible ejecutar varias funciones de Lambda al mismo tiempo en Deeplens. ¡Me voló la cabeza!
 
Registro: es muy difícil depurar las funciones de Lambda en el dispositivo cuando no funcionan. Finalmente, encontré una manera de publicar los registros en CloudWatch, que es genial, pero no estaba muy bien documentado.

Problemas de privacidad (horarios y control): un/a colega pidió si era posible excluirlo/a de la prueba. Entiendo las implicaciones. Si bien (afortunadamente) era tan solo una prueba de concepto y un proyecto divertido, se generaron conversaciones y debates interesantes acerca de los asuntos de privacidad relacionados con este tipo de tecnología. Finalmente, configuramos un temporizador para que la detección se realizase solo entre las 8:00 h y las 10:00 h.

API de Slack
(el tiempo de espera es muy breve): aprendí a la fuerza que se debe responder en la API de Slack en un par de milisegundos para que funcione. A los fines de lograr que todo funcionase correctamente, terminé realizando otra llamada de manera asincrónica.

Polly: logré la generación de los archivos mp3 y puedo reproducirlos localmente sin problemas. Lo que aún no averigüé es cómo reproducirlos en DeepLens.

Logros de los que estoy orgulloso

¡Funciona! Es genial ver cómo todas las funciones de Lambda se activan unas a otras y cumplen sus objetivos, sin necesidad de ejecutar servidores. ¡Es impresionante! 

Lo que aprendí

  • Greengrass
  • API de Slack
  • OpenCV
  • Polly

Pasos siguientes

Lograr una carga asíncrona en S3: actualmente, la carga en S3 se bloquea, que no estaría mal, ya que no cargará millones de imágenes de la misma persona. Sin embargo, se bloquea la transmisión temporalmente. Me imagino grabar los archivos en una carpeta local (tmp) en alguna parte y hacer que otra función de Lambda los cargue, o aún mejor: detectar rostros directamente en el dispositivo.

Evitar que se realicen activaciones varias veces: cuando una persona camina delante de la cámara lentamente o retrocede en menos de un minuto, se realizan varias publicaciones en Slack. Quiero agregar una característica para que se almacene el último horario y día en el que una persona se detectó en Dynamo y, cuando se observe a esa persona nuevamente dentro de un plazo X, no realizar una publicación en Slack.

Realizar la detección de rostros en el dispositivo: sería genial si contara con el tiempo suficiente para lograr que esto funcionase directamente en el dispositivo.

Lograr que la aplicación Slack sea pública: actualmente, es necesario configurar una aplicación Slack "dev" para que la integración funcione. Sería muy bueno si pudiese publicar mi aplicación y tan solo apuntar la aplicación correcta.

Incorporar Amazon Polly: estuve trabajando con la API de Polly y logré que funcionase la generación de los mp3, pero aún no encontré la manera de reproducirlos en DeepLens. Tengo algunos voluntarios disponibles.

Marcar una persona como "activa": actualmente, no se permite marcar una persona como "activa" mediante la API de Slack si no se cuenta con un permiso explícito del usuario. Como no quise incomodar a mis compañeros de trabajo, esta característica aún no se agregó.

Marcar el estado de una persona: al igual que la característica anterior, los usuarios finales deben aprobarla de manera individual. Sería genial si pudiésemos incluir la sucursal en el estado.

Desarrollado con

python
deeplens
rekognition
modalidad sin servidor
polly