Vigilancia casera con IA local: un móvil reciclado, un Mac y Docker

Un móvil antiguo como cámara, detección de movimiento con OpenCV e
interpretación de la escena con un modelo de visión local (Ollama). Todo en tu red,
sin servicios en la nube. Alertas a Telegram.

Se acercan las vacaciones y dejar el piso sin ningún tipo de vigilancia me hacía poca gracia, así que tocaba darle una vuelta al tema, ya que la solución de pasar por caja y comprar cámaras de seguridad de momento no era viable.

¿Qué necesitamos?

Una cámara

La cámara … a ver, tengo unos móviles viejos por ahi que tienen cámara, así que ya tengo candidatos.

La idea es usar la cámara del móvil, y que cada X segundos mande una foto a algún sitio que sea capaz de interpretarla, o detectar que ha habido cambios con respecto a la toma anterior.

2 Androids y 1 iPhone, asi que puedo optar por crear apps nativas y luego ver cómo meterlas en ellos, ya que no las voy a publicar en la apps store, pero en modo desarrollador podría instalarlas, pero la verdad es que para una funcionalidad tán básica me da bastante pereza, así que mejor montar una web PWA que nos permita activar la cámara, y mandar cada X segundos una captura a un endpoint.

Esto nos valdrá independientemente del sistema operativo del móvil, como de la versión de él, ya que al ser móviles viejos son versiones ya obsoletas.

El cerebro

Vale, ya vemos lo que hay en el entorno, ahora toca analizarlo. Lo primero que se me ocurre es crear diferencia entre imágenes, así podré ver el porcentaje de cambio entre ambas y deducir que sobre cierto porcentaje lo vamos a considerar «intruso»

Para la detección del movimiento usaremos la librería de visión por computador OpenCV, así no tenemos que irnos a bajo nivel a hacer restas de imágenes y demás.

Aunque me gustaría meterle algo de IA, porque hoy en día si no le metes IA a todo no eres nadie … 😖 … y sobre todo por ver si puede detectar por ejemplo que es un perro y entonces no alertar, ya que será nuestro Lobo dando una vuelta por casa.

Para la capa de IA usaremos Ollama con el modelo MoonDream diseñado para detectar elementos.

Pero con la IA hemos topado y nos hemos encontrado con 2 problemas:

  • El primero es menor, pero es inglés a full, así que nada de pasarle el prompt en español, porque pilla poco, pero bueno, un mal menor.
  • El segundo ya es mayor, y es la latencia de respuesta, que debido a que mi equipo no tiene una gran GPU ni capacidades, y además se agrava un poco al querer montarlo en un docker, ya que quería hacer el repo lo más dockerizado para que cualquiera pueda montar su sistema en casa.

De momento tiraremos así, y lo que vamos a hacer es poner la IA opcional y que el sistema pueda funcionar sin ella, aunque tengamos algún que otro falso positivo.

Así tendremos dos sistemas de alertas, uno para cuando se detecte movimiento, y otro para cuando la IA detecte lo que hay en la imagen cuando se ha detectado movimiento. Pero para no turrarnos a alertas, le pondremos un calmdown de 60 segundos, para que no se repitan alertas en menos de 60 segundos.

Todo esto montados tras una FastAPI en Python, nos permitirá tener un endpoint al que la web que se abre en los móviles puedan enviar la imagen para procesarla.

Vale, ¿y dónde lo montamos? fácil, para eso está mi Mac mini del 2018 (creo) que ya está muerto de risa debajo de la TV, que poco más que de backup o navegador es lo que hace hoy en día.

Un Mac Mini intel, de 10 Gigas, el cual ya no puedo actualizar por lo que tuve que buscar mejora, ya que como desarrollador de Apps hay que ir probando todo lo nuevo que nos ofrecen desde Apple.

Pero Antonio, ¿y como ponemos esto visible en internet para que el navegador web de los móviles puedan llamarla? De ninguna manera 😎

Eso es lo mejor, que como estamos en casa, los dispositivos se comunicarán entre ellos dentro de la misma red wifi, por lo que usaremos las IPs para reconocerse, asi que en nuestro navegador pondremos algo como: https://192.168.0.54:8000 (si …0.54 es la de nuestro Mac mini)

El resultado

Ya tenemos las cámaras, el cerebro, ¿y como queda esto ya montado?

Desde los móviles, da igual iphone que android es tan sencillo como abrir un navegador web y abrir la url https://192.168.0.54:8000

Cuando iniciamos el proceso, se activa la cámara y podemos fijar una escena de referencia, es decir la imagen de cuando todo está en calma y sobre la que revisaremos el posible movimiento.

Uno de los pequeños inconvenientes de este sistema de página web, es que para que el sistema pueda acceder a la cámara tiene que estar abierto, y claro la pantalla emitiría luz, y en ocasiones no queremos que se vea, que sea una cámara oculta, por lo que una posible mejora sería que cuando esté grabando, el navgeador conste de una simple pantalla negra, pero de momento para esta prueba lo dejamos así, así podremos ver lo que está pasando, ya que incluye incluso un sencillo log.

Las capturas se quedan guardadas en el mac mini, pero si nos vamos de vacaciones, dejamos el Mac Mini en casa, los móviles-cámaras en casa y todo en local, ¿cómo nos enteramos de que alguien ha entrado?

Notificaciones

La idea inicial era mandar un email, pero un email …. no sé tu, pero yo no suelo ser tan reactivo a la llegada de emails nuevos, así que había que buscar otra alternativa.

Y pensando me acordé de los chatBots de Telegram (si no has creado nunca ninguno, en el post «Creando un chatbot en Telegram …» te explico cómo crearlo), así que lo mandaremos a un Bot en Telegram.

Así si se detecta movimiento por ejemplo como el depravado de la derecha 👉🏻

nos llegará a Telegram una notificación.

En este caso podemos ver los 2 tipos de notificaciones implementadas, la primera que proviene de OpenCV, al que le hemos puesto un margen de cambio del 5%, y la segunda, la de la IA, que interpreta lo que hay en la imagen y nos manda la descripción, pero hemos tenidos que hacer ambas en paralelo e independientes para poder anular la IA y poder gestionar el delay del modelo local.

¿Mejor con IA o sin ella?

Aunque desde el primer minuto mi idea era IA, IA e IA, conforme iba avanzando el proyecto me di cuenta que con la librería OpenCV es más que suficiente para detectar movimiento, y que la IA lo que aporta es una «interpretación» de la imagen, es decir es capaz de decirnos si hay un gato, o incluso podemos añadir alabras claves para evitar que nos avise, por ejemplo si indicamos «gato» o «perro» al detectarlo no nos avisaría.

En contraprestación el modelo local tiene una latencia bastante alta, alrededor de unos 30 segundos, un mayor consumo de nuestro Mac Mini (que como la idea es usar un equipo viejo, lo mismo no es lo más apropiado).

Así que mi veredicto es … 🥁: estas vacaciones se queda sin IA, lo dejamos con el sistema de OpenCV.

Descarga el proyecto

El proyecto lo tienes disponible en GitHub, está todo dockerizado para que puedes descargarlo y desplegarlo en tu Mac Mini o equipo que vaya a hacer de cerebro (te vale Windows, don’t worry, la magia de docker)