Dog Park

Inspiración

Quería saber con qué funciones listas para usar contaba AWS DeepLens. La mayoría de los usuarios nuevos de DeepLens tendrá poca experiencia en aprendizaje automático o aprendizaje profundo. Amazon SageMaker es una herramienta eficiente, pero se demora un poco en alcanzar un buen ritmo de trabajo. Por ese motivo, quería saber qué se podía hacer con las aplicaciones de muestra. Descubrí que se puede hacer bastante.

Qué hace

Dog Park ejecuta un modelo "hotdog o no hotdog" y registra las probabilidades para las coincidencias más altos. A continuación, examina la coincidencia más alta para verificar si es un perro. Esto se realiza mediante la búsqueda de coincidencias en el subconjunto de 1000 categorías de perros. Si el resultado es positivo, verifica la probabilidad. Si es mayor a un cierto umbral (definido de manera arbitraria en 0,5), entonces asegura que ha encontrado un perro. Luego, busca en la próxima coincidencia de categoría y determina si es un perro. De ser así, graba la imagen de tamaño completo (no el fotograma más pequeño sobre el cual se realiza el reconocimiento) en un bucket de S3 y escribe la URL de la imagen y las dos probabilidades de raza principales en un tema de MQTT. Es posible monitorear los resultados en la consola de AWS IoT. Una segunda función de Lambda (escrita en Node.js) llamada DogParkNotifier recibe el mensaje del tema y extrae los campos correspondientes con una instrucción SQL. Se les da formato a los campos para restringir la probabilidad a un número entero y se los envía al usuario con SNS. A continuación, el envío se puede realizar por email o mensaje de texto SMS. Es necesario realizar un paso adicional (crear un tema y verificar el email) para configurar el recorrido del email.

El resultado más visual es el envío de un mensaje de texto SMS al teléfono, donde se presenta la imagen del perro junto con los resultados de probabilidad. Es bastante sorprendente recibir un resultado tan solo unos segundos después de apuntar la cámara de DeepLens a un perro.

Lo que me pareció interesante es que las probabilidades cambian con cada fotograma. Como es muy raro que los perros se queden quietos, las probabilidades de reconocimiento cambian, algunas hasta un 10 %, en función de los movimientos del animal.

A las personas les interesa formar parte de un experimento tecnológico. Estaban muy interesados en saber qué decía Deep Lens sobre sus perros.

Autor: Dan Brennan

Cómo se desarrolló

Empezamos con la aplicación de muestra que utiliza el modelo "hotdog o no hotdog". Descubrí que podía reconocer una amplia variedad de razas de perros y consideré que sería un caso de uso excelente para los principiantes. El código que creé se puede reutilizar con facilidad. El usuario debe tener una cuenta de AWS, crear un bucket de S3 en la misma región en la que se implementarán las funciones de Lambda, definir el rol de IAM en el bucket de S3 e incluir un rol de IAM en la función de Lambda que cuente con los privilegios necesarios. Tiene marcadores de posición para [YOUR_BUCKET_NAME]. También se debe obtener acceso a la aplicación de muestra con el modelo "Hot Dog o no Hot Dog" de DeepLens.

La función de Lambda DogParkNotifier es la segunda parte de la aplicación. En esta sección, es posible usar el número telefónico o la dirección de email del usuario para enviar notificaciones de SNS. 

Desafíos

Creé más de 100 compilaciones para llegar a esta versión de demostración. Sinceramente, me llevó más de 100 horas durante cuatro semanas. Fue una curva de aprendizaje enorme. Me llevó un poco de tiempo acostumbrarme a la depuración de código de Lambda en Python. El dispositivo DeepLens se registró rápidamente. Las instrucciones eran buenas. Simultáneamente, aprendía sobre Node.js para DogParkNotifier. Además, por supuesto que se me presentó el error de actualización automática de sistema operativo, que provocó que la conexión de wifi fallase. Sin embargo, el equipo de AWS para DeepLens me proporcionó una solución rápidamente.

Uno de los desafíos era determinar de qué manera se le suministraría energía a DeepLens para poder usarlo al aire libre. Probé con una batería de CC, como la que se usa para cargar los celulares, pero el amperaje de salida era de 3,2 A y DeepLens necesita 4,0 A. El sistema intentaría cargarse, pero fallaría después de transcurridos algunos segundos. Encontré otras baterías CC en el mercado con una salida de 4,8 A, pero tenía miedo de quemar el DeepLens. Entonces opté por la opción más segura, el suministro de energía de CA. La ventaja es que almacena mucha energía y logra que DeepLens funcione durante al menos 10 horas. La desventaja es su gran tamaño. El costo fue de 79 USD, un poco más de lo que hubiera gastado en una batería de CC.

Después de unos cientos de mensajes, mi proveedor de telefonía (Verizon) bloqueó los mensajes de texto entrantes que provenían de Dog Park. No pude restablecer ese valor y no hay documentación de Verizon en relación con este límite. AWS intentó transmitir los mensajes e informó un error total por parte de la compañía telefónica en relación con la entrega. La solución fue entregar el mensaje por email.

Hubo factores climáticos que afectaron la cantidad de pruebas que pude realizar. El clima estaba muy frío en Nueva Jersey y nadie salía a pasear sus perros. Luego, hubo varios días de lluvia constante a pocos días de que finalizara el certamen. Sin embargo, pudimos salir al parque dos veces y los resultados fueron sorprendentemente precisos.

Otro problema fue la conectividad a Internet. DeepLens necesita conexión a Internet para enviar imágenes a S3 y completar el tema MQTT. Mi teléfono funcionó como punto de acceso wifi y como receptor de los mensajes de texto. Lo que descubrí fue que la conexión con punto de acceso wifi se cerraba cuando no había demanda y DeepLens no hacía intentos para volver a conectarse. La solución fue doble. Traje un iPad y lo configuré para que utilizase el punto de acceso wifi. Por algún motivo, el iPad conserva activa la conexión con el punto de acceso wifi en mi teléfono y eso permite que DeepLens permanezca conectado. En segundo lugar, quité las conexiones inalámbricas opcionales del sistema Ubuntu de DeepLens. Tenía una conexión inalámbrica de alta velocidad para las tareas de desarrollo y una para el punto de acceso wifi destinada al uso remoto. Cuando el punto de acceso wifi quedaba fuera de alcance, el dispositivo intentaba reconectarse a la red wifi de alta velocidad, lo que por supuesto no podía hacer en el parque para perros. Y así quedaba, jamás volvía al punto de acceso wifi. Por ese motivo, quité las demás conexiones wifi de la lista antes de salir de casa para ir al parque.

Tuve un problema misterioso: las funciones de Lambda se implementaban en DeepLens, pero la luz de la cámara no se encendía. El archivo de registro de Python del dispositivo no mostraba ningún error. El equipo de AWS (durante una de las #officehours (horas de atención al público)) me sugirió realizar runa prueba:

Escribir lo siguiente en el tipo de sistema de DeepLens: aws_cam@Deepcam:~$ git clone https://github.com/boto/boto3.git aws_cam@Deepcam:~$ cd boto3 aws_cam@Deepcam:~$ sudo cp -r boto3 /usr/local/lib/python2.7/dist-packages aws_cam@Deepcam:~$ sudo pip install awscli –force-reinstall –upgrade

Funcionó. El truco lo hizo la reinstalación de la CLI de AWS.

Logros de los que estoy orgulloso

Estoy orgulloso de que funcione. Aprendí muchísimo sobre Lambda, DeepLens, Python, IAM, temas y todos los innumerables problemas que evitan que un proyecto sea exitoso. Había calculado que el proyecto me llevaría aproximadamente 10 horas. Me llevó 100. Me quedé hasta más de la una de la mañana la mayoría de los días.
Por eso me siento orgulloso de haberlo terminado. Utiliza la muestra con el modelo "hotdog" y la convierte en algo que es interesante, algo fuera de lo común. Recurre al aprendizaje profundo y despierta la curiosidad de las personas. Los lleva a preguntar cómo funciona.

Lo que aprendí

Aprendí que no soy muy bueno para calcular cuánto tiempo llevará un proyecto. Aprendí mucho sobre los servicios de AWS. Aprendí el lado práctico de unificar todo. Aprendí a aumentar gradualmente el ritmo de trabajo. Ya no me preguntaba dónde debía ir una función de Lambda al momento de implementarla. Encontré la ubicación de los mensajes de registro de Python en DeepLens.

El futuro de Dog Park

Dog Park necesita usar una batería de CC más pequeña. Tengo que lograr que el umbral se pueda programar a partir de una aplicación Apple IOS para que se pueda ajustar en exteriores. Tengo que tomar medidas en relación con la seguridad. Dejé el dispositivo demasiado expuesto durante las pruebas.
Tengo más ideas relacionadas con el reconocimiento de aves en comederos, pero eso implicará ajustar el modelo y entrenarlo con una variedad de imágenes de aves. Obviamente, Amazon SageMaker será clave para que eso suceda.

Desarrollado con

lambda
deeplens
python
node.js
s3
amazon-sns

Probar