Cree una aplicación de cámara de seguimiento de animales/objetos con TensorFlow.js

Presentamos PetCam: un rastreador de mascotas no invasivo con tecnología de aprendizaje automático que se ejecuta en un teléfono inteligente antiguo. Este proyecto es una colaboración entre mí y jason mayes, a quien se le ocurrió la idea. Además, una historia graciosa, eh… mi colega Markku Lepistö construyó (casi) EXACTAMENTE EL MISMO PROYECTO al mismo tiempo en su propio programa de YouTube, Level Up, que puedes ver aquí. Usamos teléfonos inteligentes viejos. el usa un junta de desarrollo de coral. Elige tu propia aventura.

Cuando era joven y vivía en casa en Nueva Jersey, mis padres eran muy estrictos conmigo acerca de recordar cerrar el garaje por la noche. Porque si no cerraba el garaje, pasaría algo así:

Cree una aplicacion de camara de seguimiento de animalesobjetos con

Luego, a la mañana siguiente, salíamos por la puerta principal, nos golpeaba un fuerte olor a pañales sucios y veíamos una bolsa de basura rota y vaciada por todo el camino de entrada. Claramente alguien tuvo una noche salvaje.

A los osos les encanta comer basura. A los mapaches les encanta comer basura. Incluso los zorros se atreverán con la basura si se lo pones fácil. Considerándolo todo, probablemente debería haber mejorado en recordar cerrar el garaje. Pero también hubiera sido bueno haber pirateado una pequeña aplicación de aprendizaje automático en la plataforma de la cámara Nest de mi padre, de modo que cada vez que detectara un oso sacando nuestra basura, reproduciría un sonido de bocina de aire fuerte y amenazador que asustar al bandido de vuelta al bosque.

Lo que yo quería entonces era PetCam, el proyecto que os traigo hoy: an aplicación que alerta cuando su perro, gato, pájaro, pollo (más animales pendientes) salta sobre su cama, sofá, silla, computadora portátil y más.

Cuando Fluffy salta en tu sofá (el «evento de interés»), PetCam te envía una alerta a través de Slack y guarda una instantánea en una aplicación de «diario» en la nube.

PetCam se puede ejecutar en un teléfono inteligente y procesa todo el video localmente (es decir, la transmisión de video nunca sale de su dispositivo). Pero si desea guardar una imagen de un evento de interés (es decir, tomar y guardar una foto de Fluffy en el sofá), puede configurar PetCam para enviar una foto de ese momento a la nube.

Aquí está la descripción general.

Arquitectura

Este proyecto se divide en tres partes principales:

1. Interfaz de detección de mascotas

Este es el bit que usa su cámara y un modelo de aprendizaje automático TensorFlow.js para analizar el comportamiento de sus mascotas. Está integrado en Javascript simple y se ejecuta en el navegador, y puede probarlo usted mismo ahora mismo aquí.

Aplicación de interfaz de seguimiento de mascotas

Utiliza un modelo de aprendizaje automático TensorFlow.js que analiza los datos de la cámara (o cámara web) de su teléfono en el navegador, sin enviar nunca los datos a la nube (esto es lo que lo hace «preservar la privacidad»). Sin embargo, para guardar estos eventos en un registro (es decir, «gato en el sofá»), enviamos fotos y cadenas de eventos a Firestore para que luego podamos ver los eventos en un diario (más sobre eso a continuación).

2. Frontend del «Diario» de mascotas

La segunda aplicación de interfaz de «diario» que le permite ver un registro de todas las actividades que detectó su PetCam. Básicamente, carga los datos guardados en Firestore en una bonita interfaz de usuario:

1673876667 604 Cree una aplicacion de camara de seguimiento de animalesobjetos con

3. Backend de Firebase (+API de Slack)

El «backend» sin servidor hace dos cosas: almacena un registro de eventos y fotos y también activa las notificaciones de Slack. Entonces, cuando tu mascota hace algo bueno, recibes un ping de Slack al respecto:

1673876668 10 Cree una aplicacion de camara de seguimiento de animalesobjetos con

Todo esto es impulsado por base de fuegoel conjunto de herramientas ligero de Google para crear backends sin servidor, además de la API de Slack.

3a. Modelo de detección de pollos de AutoML Vision

De acuerdo, esta parte es realmente «agradable de tener». Para PetCam 1.0, usaremos un modelo de aprendizaje automático preconstruido (Coco SSD) que analiza muchos animales de manera predeterminada. Pero no reconoce tan bien a los pollitos (mis nuevas y únicas mascotas). Entonces, en esta tercera parte, crearemos un modelo personalizado de detección de pollos de TensorFlow usando Google Cloud AutoML:

1673876668 387 Cree una aplicacion de camara de seguimiento de animalesobjetos con

Uf, este proyecto es una especie de chonker, ¿no? Dos interfaces diferentes, ¿no es eso un poco más? Como siempre, puede encontrar todo el código para crear esta aplicación usted mismo. aquí en el repositorio Making with ML. O, si solo se trata de la interfaz de seguimiento de mascotas, puede encontrar el código y una demostración en vivo en el enlace de falla.

Ahora, dado que este proyecto es tan grande y mi capacidad de atención es tan pequeña, no los voy a aburrir con todas las pequeñas minucias de cómo Jason y yo configuramos la autenticación e instalamos TensorFlow e implementamos una función de nube y blahdy-blah. Puedes resolver la mayoría de esas cosas por ti mismo leyendo el códigoleer el LÉAMEviendo nuestro video de YouTube [TODO]o (por favor no me asesinen) por googleando.

En cambio, solo quiero cubrir cada componente a 5000 pies y centrarme principalmente en los obstáculos complicados e inesperados que Jason y yo tuvimos que resolver cuando construimos esta cosa, para que no tenga que resolverlos usted mismo y para que podamos sentirnos inteligentes. .

¡Ahora, a las minas de código!

Seguimiento de mascotas (o personas, automóviles o paquetes de Amazon)

¿Alguna vez has intentado hacer detección de objetos en su cámara web, en el navegador, usando Javascript?

Cree una aplicacion de camara de seguimiento de animalesobjetos con

Imagen de MTheiler de Wikipedia

Resulta que es muy fácil. ¡Demasiado fácil, si me preguntas! Pronto sus gatos crearán aplicaciones web para rastrear usted.

Puede configurar esto en unas pocas líneas de código:

Lo primero que hace este código es cargar un propósito general pre-entrenado COCO-SD Modelo TensorFlow.js de visión artificial. COCO-SSD reconoce 80 tipos de objetosincluyendo pero no limitado a: jirafa, corbata, copa de vino, brócoli, secador de pelo.

Usar el modelo es tan simple como llamar a `model.detect(video)`, donde `video` es un puntero a la transmisión de su cámara web. (Eso es `video id=”webcam” reproducción automática> ` en la tierra HTML). Tiene más sentido cuando miras el código. aquí en falla.

Para analizar una secuencia de video en lugar de un solo cuadro, ejecute `model.detect` en un bucle. ¡Voila! Tiene detección de objetos en tiempo real.

Cómo calcular las intersecciones/distancias del cuadro delimitador

Jason y yo diseñamos esta aplicación para que cuando dos objetos que te importan se crucen, un perro y un tazón de agua, un gato y tu computadora portátil, tú y tu refrigerador, la aplicación active un evento, es decir, «HUMANO EN LA REFRIGERACIÓN». Luego guardamos ese evento en un Firestore backend para que podamos ver un registro de todos los eventos pasados ​​en el futuro y activar una notificación de Slack (más información sobre el backend en un momento). Por intersección, me refiero a cuando dos cuadros delimitadores alrededor de los objetos detectados se cruzan:

1673876668 493 Cree una aplicacion de camara de seguimiento de animalesobjetos con

En esta imagen, mi adorable pollito Millie está “cruzando” con su plato de agua y, por lo tanto, concluyo que probablemente esté bebiendo.

Jason también creó una interfaz agradable que lo ayuda a seleccionar los dos objetos que desea rastrear:

1673876669 994 Cree una aplicacion de camara de seguimiento de animalesobjetos con

¿Cómo se calcula qué tan cerca están dos cuadros delimitadores entre sí? Para este proyecto, queríamos saber no solo si dos cuadros delimitadores («bboxes») se cruzan o no, sino también, si no es así, ¿a qué distancia están? Aquí está el código:

Devuelve 0 si las dos cajas se cruzan, o la distancia entre ellas si no lo hacen.

Saber cuándo enviar alertas

Una vez que descubrí el código de intersección de cajas, ¡me sentí genial! Pero luego, Jason y yo descubrimos un problema menos sexy pero mucho más preocupante que no sabíamos cómo resolver: ¿cómo saber cuándo guardar un evento y enviar una alerta al usuario?

Recuerde que para realizar la detección y el seguimiento de objetos en tiempo real, ejecutamos un código para analizar la imagen de nuestra cámara web y detectar una intersección varias veces por segundo, en un bucle. Entonces, si su corgi Rufus simplemente se está relajando en el sofá, calcularemos que el cuadro delimitador «perro» se cruza con el cuadro delimitador «sofá» varias veces por segundo. Obviamente, solo queremos contar esto como un «evento» la primera vez que sucede, cuando Rufus salta sobre el sofá, pero no después. Luego, si Rufus se va y regresa más tarde, podemos activar el evento nuevamente. Entonces, tal vez hagamos una variable que realice un seguimiento de si hemos enviado una notificación al usuario y la restablezca cuando Rufus se levante del sofá.

Excepto que es más complicado que eso, porque ¿qué pasa si Rufus está flotando frente al sofá o corriendo alrededor de él, por lo que nuestro código lo detecta como «en» y «fuera» del sofá muchas veces en los mismos segundos? ¿Te gusta este doggo con los zoomies?

vía GIPHY

No queremos enviar spam a nuestro usuario con notificaciones de eventos que no son realmente «únicos». Necesitamos hacer algún tipo de «antirrebote», limitando la frecuencia con la que podemos enviar alertas. Parece simple, ¿verdad? ¿Deberíamos agregar un período de enfriamiento para no enviar a los usuarios demasiadas notificaciones demasiado pronto? Esto es, de hecho, lo que Jason y yo hicimos, y en el código parece esto.

// Min number of seconds before we send another alert.
const MIN_ALERT_COOLDOWN_TIME = 60;

if (sendAlerts) 

¡Excepto que un período de enfriamiento no es suficiente! porque y si tienes dos perros, o muchos perros, corriendo dentro y fuera del sofá? Porque si Rufus salta y luego Milo salta justo detrás de él, esos son dos eventos únicos y queremos alertar al usuario sobre ambos. De repente tienes que saber cual los perros se mueven y realizan un seguimiento de su estado y usted tiene un peludo problema de «seguimiento de múltiples objetos», que suena como la tesis doctoral de alguien, y está! (En realidad, obtienes esta función de forma gratuita a través de la API de inteligencia de vídeo de Google Cloudpero estamos atrapados aquí en la tierra de TensorFlow.js y es difícil).

Esta comprensión realmente me hizo sudar, y por un tiempo, Jason y yo pensamos que estábamos jodidos. Pero luego terminamos haciendo lo que uno siempre hace cuando está fuera de su profundidad técnica: resolver un problema no tan bueno pero mucho, mucho más simple. Nuestro compromiso fue el siguiente: nos conformaríamos con alertar a los usuarios cuando la cantidad de perros en el sofá aumentó, pero no cuando el número de perros subía y bajaba, así:

vía GIPHY

Para implementar esto, mantuvimos un contador de cuántos animales había en el marco. Si aumentaba el número de animales, enviábamos una notificación e incrementamos el contador. Sin embargo, nunca disminuimos el contador a menos que la cantidad de animales en el cuadro llegara a cero (en ese momento, hicimos un restablecimiento completo). Suena un poco raro, pero echa un vistazo al código aquí:

Es un poco poco intuitivo configurar un sistema de alerta como este, pero tómese un segundo para convencerse de que realmente le brinda el comportamiento que usted, como usuario, probablemente desee. Estos son algunos casos diferentes en los que nuestro algoritmo activa o no activa una alerta:

Guión ¿Enviar alerta?
1 perro -> 2 perros
2 perros -> 3 perros
3 perros -> 2 perros No
2 perros -> 1 perro -> 2 perros No
2 perros -> 1 perro -> 0 perros -> 1 perro Sí (para el último perro que salta en el sofá)

Uf. ¡Pasemos a cosas más simples!

Creación de una aplicación Pet Diary/Viewer

Hasta ahora, todo lo que hemos hablado se ejecuta completamente en su navegador. Esto es bueno, porque no salen datos de su teléfono o computadora, por lo que puede sentirse bien desde una perspectiva de privacidad. Sin embargo, cuando ocurren eventos de interés, queremos poder recordarlos y volver a visitarlos más tarde. Para eso, usaremos Firebase Firestoreuna base de datos simple y liviana en la nube que puede leer fácilmente desde nuestra escritura en el navegador.

He usado Firestore en tantos proyectos y he hablado de ello tantas veces en Dale sobre IA que no entraré en detalles aquí. Cuando la aplicación PetCam frontend detecta un evento (a través del algoritmo anterior), escribe algunos datos del evento en Firestore. Así es como se ve mi base de datos de Firestore:

1673876669 68 Cree una aplicacion de camara de seguimiento de animalesobjetos con

Debido a que es fácil escribir y leer desde Firestore, la creación de una aplicación de visor de «diario» frontend en torno a los datos guardados en Firestore fue bastante sencilla. Lo construí usando React, y puedes encontrar el código aquí. Así es como se veía la aplicación del visor:

1673876667 604 Cree una aplicacion de camara de seguimiento de animalesobjetos con



Fuente del artículo

Deja un comentario