Blog

Frigate sin Coral: detección de objetos en la GPU Intel con OpenVINO

Ejecutamos Frigate 0.18 con 1, 4 y 8 cámaras en un servidor en la nube con una Intel UHD 770 compartida: con OpenVINO y la decodificación de vídeo en la GPU, 8 cámaras con mucho movimiento usaron 1 vCPU en lugar de 3,9, y Frigate revisó un 57 % más de objetos por segundo. Cómo conectar tus cámaras de forma segura y cuánto cuesta frente a un Coral.

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.

Un cruce de calles visto por Frigate, con un recuadro alrededor de cada persona y cada coche encontrados por el detector OpenVINO en la GPU
Lo que ve el detector: cada recuadro es una persona o un coche encontrado por OpenVINO en la GPU, con su puntuación. Imagen obtenida de la API de Frigate (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

ElementoValor
ServidorDebian 13, Linux 7.3, Intel UHD 770 (GPU compartida), 4 vCPU, 12 GB de RAM
Frigate0.18.2 (imagen Docker oficial ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri
Detectortype: openvino, device: GPU o device: CPU, modelo SSDLite MobileNet v2 300×300 incluido en la imagen
Decodificaciónhwaccel_args: preset-vaapi (GPU) o sin aceleración por hardware (CPU)
Cámaras1, 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ídeoclips en bucle de cruces con mucho tránsito, de Wikimedia Commons (licencias en los pies de foto)
Ajustes de Frigatedetección a 1280×720 y 5 fps por cámara, objetos: persona, coche, bicicleta, moto, autobús, camión, sin grabación
Mediciones60 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

Gráfico de barras: CPU del servidor usada por Frigate con 1, 4 y 8 cámaras, todo en la GPU frente a todo en la CPU
CPU de todo el servidor, en vCPU sobre 4. Con la decodificación y la detección en la GPU (verde), 8 cámaras usan alrededor de 1 vCPU. Solo con la CPU (naranja), el servidor se llena a partir de 4 cámaras.
CámarasTodo en la GPUDetector en GPU, decodificación en CPUDetector en CPU, decodificación en GPUTodo en la CPU
10,57 vCPU (14 %)0,40 vCPU (10 %)2,80 vCPU (70 %)2,16 vCPU (54 %)
40,90 vCPU (23 %)1,23 vCPU (31 %)3,83 vCPU (96 %)3,84 vCPU (96 %)
81,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?

Gráfico de barras: objetos revisados por segundo por el detector de Frigate con 1, 4 y 8 cámaras, todo en la GPU frente a todo en la CPU
Zonas de imagen revisadas por el detector cada segundo, sumando todas las cámaras. Con 8 cámaras, la GPU hace 168 por segundo; la CPU, 107 ocupando todo el servidor.
CámarasObjetos revisados / sFotogramas analizados / recibidosTiempo de inferencia
1Todo en la GPU53,75,0 / 5,06,7 ms
1Todo en la CPU56,85,0 / 5,18,3 ms
4Todo en la GPU114,611,7 / 20,18,5 ms
4Detector en GPU, decodificación en CPU173,417,8 / 20,15,6 ms
4Todo en la CPU127,513,3 / 20,27,2 ms
8Todo en la GPU167,925,1 / 40,35,8 ms
8Todo en la CPU106,817,8 / 40,49,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.

Página Sistema de Frigate: velocidad de inferencia del detector 5,73 ms, CPU del detector 27,5 %, uso de GPU 82 %, decodificador de GPU 10,5 %
La página Sistema de Frigate con 4 cámaras en la GPU: 5,7 ms por inferencia, el proceso del detector usa el 27,5 % de un núcleo y el decodificador de la GPU alrededor del 10 %.
La vista en directo de Frigate con cuatro cámaras de calle, cada una con iconos de persona y coche para los objetos que está rastreando
La vista en directo con 4 cámaras. Los iconos de las esquinas muestran lo que rastrea cada cámara (personas, coches). Vídeos: RG72, Wikimedia Commons, CC BY-SA 4.0.

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».

  • 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 casaServidor en la nube con GPU
Costecompra ú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ño14,99 € al mes sin IVA (iGPU Start) o 29,99 € (iGPU Power)
En 3 añosunos 300 a 400 € con la electricidadde 540 € (Start) a 1.080 € (Power) sin IVA
Subidaninguna, el vídeo se queda en casade 1 a 4 Mbit/s por cámara, todo el tiempo
Copia fuera del lugarno: un ladrón puede llevarse el grabadorsí: las grabaciones están lejos de las cámaras
Varios sitiosun equipo por sitio, o una VPN entre ellosun solo Frigate para todos los sitios
Mantenimientotu hardware, tu disco, tus cortes de luznosotros 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.