72 lines
3.9 KiB
Markdown
72 lines
3.9 KiB
Markdown
Pet Monitor con Raspberry Pi 5 & Hailo-8L (AI HAT)
|
|
Sistema de monitorización inteligente para mascotas utilizando aceleración por hardware NPU (chip Hailo-8L) para visión por computador a 30 FPS y detección de audio local en CPU para ladridos/sonidos anómalos.
|
|
---
|
|
1. Hardware Utilizado
|
|
Placa: Raspberry Pi 5.
|
|
Coprocesador IA: Raspberry Pi AI HAT (Hailo-8L, 13 TOPS).
|
|
Cámara: Módulo de cámara Raspberry Pi (CSI).
|
|
Entrada de audio: Micrófono USB (pendiente de conectar).
|
|
---
|
|
2. Configuración del Sistema y Hardware
|
|
Habilitar PCIe Gen 3
|
|
Para maximizar el ancho de banda con el chip Hailo-8L, se configuró el bus PCIe en `/boot/firmware/config.txt`:
|
|
```ini
|
|
dtparam=pciex1
|
|
dtparam=pciex1_gen=3
|
|
```
|
|
Paquetes del Sistema Instalados
|
|
Se instalaron las utilidades de cámara, controladores del kernel y librerías dinámicas de audio requeridas por el sistema operativo:
|
|
```bash
|
|
sudo apt update && sudo apt full-upgrade -y
|
|
sudo apt install -y hailo-all rpicam-apps libportaudio2 portaudio19-dev libasound2-dev python3-picamera2
|
|
```
|
|
Verificación de hardware
|
|
NPU Hailo: `lspci` muestra el coprocesador Hailo Technologies y `hailortcli fw-control identify` responde con el firmware cargado.
|
|
Cámara: `rpicam-hello --list-cameras` detecta correctamente el sensor CSI.
|
|
---
|
|
3. Entorno de Desarrollo Python (`uv`)
|
|
Se configuró el entorno virtual utilizando `uv` con acceso a los paquetes del sistema (`--system-site-packages`) para reutilizar los bindings compilados de `picamera2` y `hailo_platform` instalados por Debian/Raspberry Pi OS:
|
|
```bash
|
|
cd ~/pet_monitor
|
|
# Creación del entorno con acceso a librerías nativas
|
|
uv venv --system-site-packages
|
|
|
|
# Instalación de librerías en el entorno virtual
|
|
uv pip install sounddevice numpy scipy requests onnxruntime
|
|
```
|
|
> **Nota técnica:** Se seleccionó `onnxruntime` en lugar de `tflite-runtime` para garantizar compatibilidad con versiones modernas de Python en ARM64 sin necesidad de compilar desde fuente.
|
|
---
|
|
4. Estado Actual del Software
|
|
`pet_speed.py`: Script de visión artificial optimizado con aceleración por hardware que:
|
|
- Inicializa `Picamera2` con flujo dual sincronizado por hardware (PiSP):
|
|
- Stream `main` (1280x720) para capturas de alta definición y alertas.
|
|
- Stream `lores` (640x640) escalado por hardware por el ISP directamente al formato esperado por el modelo YOLOv8 (0% sobrecarga en CPU).
|
|
- Utiliza la API nativa de aceleración `picamera2.devices.hailo.Hailo` cargando el modelo optimizado (`/usr/share/hailo-models/yolov8s_h8.hef`).
|
|
- Filtra detecciones del conjunto COCO para gato (id: 15) y perro (id: 16).
|
|
- Calcula el centroide del animal y evalúa el desplazamiento entre fotogramas consecutivos para alertar si la velocidad supera el umbral de carrera (`SPEED_THRESHOLD = 0.30`).
|
|
- Libera limpiamente la cámara y el acelerador Hailo al recibir señal de interrupción (`SIGINT`/`Ctrl+C`).
|
|
|
|
Ejecución:
|
|
```bash
|
|
uv run pet_speed.py
|
|
```
|
|
---
|
|
5. Próximos Pasos (Hoja de Ruta)
|
|
Fase A: Integración de Audio (Ladridos y Sonidos)
|
|
Conectar el micrófono USB.
|
|
Identificar el índice del dispositivo con:
|
|
```bash
|
|
uv run python -m sounddevice
|
|
```
|
|
Descargar el modelo YAMNet en formato ONNX (`yamnet.onnx`) y el diccionario de clases de AudioSet (`yamnet_classes.csv`).
|
|
Desarrollar el listener en un hilo secundario (`threading.Thread`) analizando fragmentos de audio de 0.975 segundos en busca de la clase `Bark`.
|
|
Fase B: Sistema de Alertas y Notificaciones
|
|
Crear un bot en Telegram con `@BotFather` y obtener el `TELEGRAM_BOT_TOKEN` y `CHAT_ID`.
|
|
Programar un despachador asíncrono con control de enfriamiento (cooldown de 30-60 s) para evitar spam.
|
|
Guardar una captura JPEG con la caja delimitadora en el momento de la carrera o ladrido y enviarla a Telegram.
|
|
Fase C: Despliegue Autónomo (Systemd)
|
|
Crear una unidad de servicio `/etc/systemd/system/pet_monitor.service`.
|
|
Habilitar arranque automático al encender la Raspberry Pi:
|
|
```bash
|
|
sudo systemctl enable --now pet_monitor.service
|
|
```
|