Frigate sin Coral: detección de objetos en la GPU Intel con OpenVINO
Frigate es el grabador de vídeo (NVR) de código abierto que encanta a los usuarios de Home Assistant: vigila tus cámaras y distingue a una persona de un coche, un gato o una sombra. Durante años el consejo fue «cómprate un Google Coral» para ejecutar su detector de objetos. Hoy Frigate también ejecuta su detector con OpenVINO en una GPU Intel, y puede decodificar el vídeo en esa misma GPU con VA-API.
Así que nos hicimos una pregunta sencilla: en un servidor en la nube con una GPU Intel compartida, ¿qué aporta realmente la GPU a Frigate? Ejecutamos las mismas cámaras en el mismo servidor, primero con el trabajo en la GPU y luego solo en la CPU, con 1, 4 y 8 cámaras.
latest.jpg?bbox=1). Vídeo: RG72, Wikimedia Commons, CC BY-SA 4.0.Resultados de un vistazo
- La GPU libera la CPU. Con la decodificación y la detección en la GPU, Frigate usó 0,57 vCPU para 1 cámara, 0,90 para 4 y 1,04 para 8. Con todo en la CPU usó 2,16 vCPU para 1 cámara, y los 4 vCPU del servidor estaban llenos (96 a 97 %) a partir de 4 cámaras.
- Más detección cuando hay mucho movimiento. Con 8 cámaras con mucho movimiento, el detector en la GPU revisó 168 objetos por segundo frente a 107 en la CPU (+57 %), y Frigate analizó el 62 % de los fotogramas frente al 44 %.
- El tiempo de detección por fotograma es parecido. OpenVINO tardó unos 5,6 a 6,7 ms por inferencia en la GPU y 7,2 a 10,8 ms en la CPU en la mayoría de las pruebas. La verdadera ganancia no es la velocidad, sino que la CPU queda libre.
- La decodificación de vídeo en la GPU costó alrededor del 1,7 % de un núcleo por cámara 1080p, frente a alrededor del 12 % cuando decodifica la CPU. Ocho flujos 1080p usaron más o menos una cuarta parte del motor de vídeo de la GPU.
- No hace falta un Coral. Un solo servidor en la nube con GPU manejó 8 cámaras de calle con mucho movimiento y aún le sobraban 3 vCPU.
Configuración de la prueba
| Elemento | Valor |
|---|---|
| Servidor | Debian 13, Linux 7.3, Intel UHD 770 (GPU compartida), 4 vCPU, 12 GB de RAM |
| Frigate | 0.18.2 (imagen Docker oficial ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri |
| Detector | type: openvino, device: GPU o device: CPU, modelo SSDLite MobileNet v2 300×300 incluido en la imagen |
| Decodificación | hwaccel_args: preset-vaapi (GPU) o sin aceleración por hardware (CPU) |
| Cámaras | 1, 4 u 8 flujos RTSP, H.264 1920×1080 a 25 fps, 4 Mbit/s cada uno, servidos por MediaMTX en el mismo servidor |
| Vídeo | clips en bucle de cruces con mucho tránsito, de Wikimedia Commons (licencias en los pies de foto) |
| Ajustes de Frigate | detección a 1280×720 y 5 fps por cámara, objetos: persona, coche, bicicleta, moto, autobús, camión, sin grabación |
| Mediciones | 60 s de calentamiento y luego 90 s; CPU de todo el servidor desde /proc/stat, /api/stats de Frigate cada 5 s, motores de la GPU desde el kernel (DRM fdinfo) |
Las cifras de CPU están en vCPU (1,00 = un núcleo completo de los 4). Los «objetos revisados por segundo» son el
detection_fps de Frigate: cuántas zonas de imagen pasaron por el detector cada segundo, sumando todas las cámaras.
Nuestros clips son un caso difícil: cruces urbanos con gente y coches moviéndose todo el tiempo, así que Frigate pasa el detector por 10 a 20 zonas por fotograma. Un camino de entrada o la puerta de una tienda, quietos la mayor parte del tiempo, necesitan mucha menos detección.
1. CPU del servidor: la diferencia principal
| Cámaras | Todo en la GPU | Detector en GPU, decodificación en CPU | Detector en CPU, decodificación en GPU | Todo en la CPU |
|---|---|---|---|---|
| 1 | 0,57 vCPU (14 %) | 0,40 vCPU (10 %) | 2,80 vCPU (70 %) | 2,16 vCPU (54 %) |
| 4 | 0,90 vCPU (23 %) | 1,23 vCPU (31 %) | 3,83 vCPU (96 %) | 3,84 vCPU (96 %) |
| 8 | 1,04 vCPU (26 %) | 1,68 vCPU (42 %) | 3,85 vCPU (96 %) | 3,89 vCPU (97 %) |
Lo que llena la CPU es el detector. Cuando OpenVINO se ejecuta en la CPU, solo el proceso del detector de Frigate usó de 2,4 a 3,1 núcleos; en la GPU usó de 0,1 a 0,3 núcleos. La decodificación de vídeo va en segundo lugar: cada flujo 1080p costaba alrededor del 12 % de un núcleo cuando lo decodificaba la CPU y el 1,7 % con VA-API. Con una sola cámara, la diferencia entre decodificar en GPU o en CPU queda dentro del ruido de medida; a partir de 4 cámaras, VA-API ahorra una parte visible de la CPU.
2. ¿Cuánta detección puede hacer el servidor?
| Cámaras | Objetos revisados / s | Fotogramas analizados / recibidos | Tiempo de inferencia | |
|---|---|---|---|---|
| 1 | Todo en la GPU | 53,7 | 5,0 / 5,0 | 6,7 ms |
| 1 | Todo en la CPU | 56,8 | 5,0 / 5,1 | 8,3 ms |
| 4 | Todo en la GPU | 114,6 | 11,7 / 20,1 | 8,5 ms |
| 4 | Detector en GPU, decodificación en CPU | 173,4 | 17,8 / 20,1 | 5,6 ms |
| 4 | Todo en la CPU | 127,5 | 13,3 / 20,2 | 7,2 ms |
| 8 | Todo en la GPU | 167,9 | 25,1 / 40,3 | 5,8 ms |
| 8 | Todo en la CPU | 106,8 | 17,8 / 40,4 | 9,1 ms |
Con una cámara, los dos modos procesan todos los fotogramas. Con 4 y 8 cámaras con mucho movimiento, el único detector de Frigate se convierte en el límite: cuando está lleno, Frigate se salta fotogramas (sigue rastreando los objetos, pero los mira con menos frecuencia). En la GPU, el detector llegó a un máximo de unos 165 a 175 objetos por segundo; en la CPU alcanzó de 107 a 136 ocupando todo el servidor.
Seamos honestos con un resultado: la prueba «4 cámaras, todo en la GPU» salió más lenta (8,5 ms por inferencia, 115 objetos por segundo) que la prueba con decodificación en la CPU (5,6 ms, 173 por segundo). La GPU se comparte con otros servidores y el tiempo de inferencia en la GPU varió entre 5,6 y 11,6 ms a lo largo de nuestras pruebas, así que toma las cifras de rendimiento como órdenes de magnitud, no como límites exactos. Las cifras de CPU no cambian esa conclusión: en la CPU, el servidor siempre está lleno.
3. Conectar tus cámaras a un Frigate en la nube
Frigate en la nube necesita leer el flujo RTSP de cada cámara en casa o en la oficina. Hay tres formas de hacerlo, y solo la primera debería ser tu opción por defecto.
Recomendado: una VPN (Tailscale o WireGuard), sin abrir nada
Instala Tailscale (o WireGuard a secas) en un pequeño dispositivo siempre encendido en la misma red que las cámaras: una Raspberry Pi, un NAS o un router compatible con WireGuard. Ese dispositivo se convierte en un subnet router: permite que el servidor en la nube llegue a la red local a través de un túnel cifrado. Frigate usa entonces las direcciones locales de las cámaras, como si estuviera en tu casa, y no se abre ningún puerto en tu router.
# en la Raspberry Pi / NAS de casa (aquí la red de las cámaras es 192.168.1.0/24)
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf && sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale up --advertise-routes=192.168.1.0/24
# aprueba la ruta en la consola de administración de Tailscale y luego, en el servidor en la nube:
sudo tailscale up --accept-routes
# Frigate, en el servidor en la nube: la cámara conserva su dirección local
cameras:
entrance:
ffmpeg:
inputs:
- path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
roles: [detect, record]
El vídeo va cifrado de extremo a extremo, la cámara nunca queda expuesta a Internet y puedes abrir la página web de Frigate desde el móvil a través de la misma tailnet. Explicamos Tailscale con más detalle en Juega en tu servidor en la nube desde cualquier lugar con Moonlight y Tailscale.
Posible: redirección de puertos en el router, con límites estrictos
También puedes redirigir un puerto de tu router a la cámara y darle a Frigate una dirección como
rtsp://user:password@<your-public-ip>:8554/stream1. Funciona, pero conoce los riesgos:
- El RTSP no suele ir cifrado. El vídeo, y con algunas cámaras la contraseña, cruzan Internet en claro.
- El firmware de las cámaras baratas es un objetivo clásico de las botnets. Una cámara expuesta se escanea en cuestión de horas.
Si eliges este camino, estas precauciones son obligatorias:
- En el router, permite el puerto redirigido solo desde la dirección IP del servidor. Nuestros servidores tienen una dirección IP fija, y eso es lo que hace aceptable esta opción. Si tu router no puede filtrar por dirección de origen, usa la VPN.
- Una contraseña fuerte y exclusiva de la cámara, nunca la de fábrica.
- RTSPS (RTSP sobre TLS) si la cámara lo admite.
- Firmware actualizado.
Nunca: una cámara abierta a todo Internet
Una cámara accesible para cualquiera, con o sin contraseña, es la forma en que los vídeos privados acaban en webs públicas y las cámaras acaban en botnets. No lo hagas, ni siquiera «solo para probar».
Lo que cuesta en ancho de banda y en lo legal
- Ancho de banda de subida: cada cámara envía su flujo todo el tiempo, normalmente de 1 a 4 Mbit/s en 1080p H.264. Nuestros flujos de prueba eran de 4 Mbit/s cada uno, así que 8 necesitarían 32 Mbit/s de subida. La fibra lo aguanta; una línea ADSL lenta, no. Si vas justo de subida, usa el segundo flujo de baja resolución de la cámara para la detección y guarda la grabación en calidad completa en la tarjeta SD de la cámara.
- Datos personales: el vídeo de personas es un dato personal. Para una empresa que graba a su personal o a sus clientes se aplica el RGPD (carteles informativos, conservación limitada, contrato con el proveedor de alojamiento). Nuestros servidores están en la UE.
4. ¿Coral y mini PC, o un servidor al mes?
| Coral + mini PC en casa | Servidor en la nube con GPU | |
|---|---|---|
| Coste | compra única: un mini PC por unos 150 a 250 €, un Coral USB por unos 60 a 80 €, un disco, más unos 10 W de electricidad todo el año | 14,99 € al mes sin IVA (iGPU Start) o 29,99 € (iGPU Power) |
| En 3 años | unos 300 a 400 € con la electricidad | de 540 € (Start) a 1.080 € (Power) sin IVA |
| Subida | ninguna, el vídeo se queda en casa | de 1 a 4 Mbit/s por cámara, todo el tiempo |
| Copia fuera del lugar | no: un ladrón puede llevarse el grabador | sí: las grabaciones están lejos de las cámaras |
| Varios sitios | un equipo por sitio, o una VPN entre ellos | un solo Frigate para todos los sitios |
| Mantenimiento | tu hardware, tu disco, tus cortes de luz | nosotros mantenemos el servidor en marcha; tú gestionas Frigate |
Los precios del Coral y del mini PC son precios habituales en el momento de escribir esto; compruébalos antes de comprar. Un mini PC Intel reciente (N100 y similares) también puede ejecutar OpenVINO en su propia GPU, sin Coral.
El hardware en casa te conviene si ya tienes un servidor en casa, tu subida es lenta o quieres que el vídeo nunca salga de casa. Un servidor en la nube te conviene si no tienes servidor en casa (o tienes una Raspberry Pi o un NAS demasiado débiles para la detección), quieres las grabaciones guardadas lejos de las cámaras, gestionas varios sitios (tiendas, oficinas, casa de vacaciones) o quieres acceder a Frigate y Home Assistant desde cualquier lugar sin abrir tu red doméstica.
5. ¿Qué plan elegir?
Con la decodificación y la detección en la GPU, Frigate usó alrededor de 1 vCPU para 8 cámaras con mucho movimiento.
- iGPU Start (2 vCPU, 8 GB de RAM, Perf 1, 14,99 € al mes sin IVA): una casa o una tienda pequeña con de 1 a 4 cámaras, con Home Assistant al lado.
- iGPU Power (4 vCPU, 14 GB de RAM, Perf 2 = el doble de GPU que Start, 29,99 €): de 4 a 8 cámaras, escenas con mucho movimiento, grabación en el servidor o varios sitios. Es el tamaño que probamos.
- iGPU Pro (6 vCPU, 14 GB, Perf 3, 44,99 €): más cámaras, o Frigate junto con otros trabajos de GPU (Immich, transcodificación) en el mismo servidor.
Sin la GPU, los mismos 4 vCPU estaban llenos a partir de 4 cámaras: necesitarías un servidor mucho más grande para hacer el mismo trabajo en la CPU.
6. Ponerlo en marcha en un servidor Linux GPU
¿Lo quieres listo para usar? Pídelo por correo al hacer el pedido (contact@linuxgpu.eu): podemos entregarte el servidor con Frigate ya instalado, con OpenVINO y VA-API en la GPU, y Tailscale listo para conectarse a tus cámaras.
Para hacerlo tú mismo en Debian 13 con Docker:
docker run -d --name frigate --restart unless-stopped --shm-size=512m \
--device /dev/dri \
-v /srv/frigate/config:/config -v /srv/frigate/media:/media/frigate \
--tmpfs /tmp/cache:size=1g -p 8971:8971 \
ghcr.io/blakeblackshear/frigate:stable
# /srv/frigate/config/config.yml
mqtt:
enabled: false # o el broker MQTT de tu Home Assistant
ffmpeg:
hwaccel_args: preset-vaapi # decodificar en la GPU
detectors:
ov:
type: openvino
device: GPU # detectar en la GPU
model:
width: 300
height: 300
input_tensor: nhwc
input_pixel_format: bgr
path: /openvino-model/ssdlite_mobilenet_v2.xml
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
cameras:
entrance:
ffmpeg:
inputs:
- path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
roles: [detect]
detect:
enabled: true
width: 1280
height: 720
fps: 5
Obtén la contraseña de administrador con docker logs frigate 2>&1 | grep -i password y abre
https://<server>:8971 (mejor: solo a través de Tailscale). En la página Sistema, el detector debería mostrar un
tiempo de inferencia de unos pocos milisegundos y la GPU debería aparecer en la lista.
Para Frigate junto a Immich en el mismo servidor, con archivos Docker Compose, lee Self-host Immich and Frigate with OpenVINO on a GPU VPS (en inglés).
Pruébalo
Ver los planes: iGPU Start cuesta 14,99 € e iGPU Power 29,99 € al mes sin IVA.