Blog

Frigate sem Coral: deteção de objetos na GPU Intel com OpenVINO

Corremos o Frigate 0.18 com 1, 4 e 8 câmaras num servidor na nuvem com uma Intel UHD 770 partilhada: com o OpenVINO e a descodificação de vídeo na GPU, 8 câmaras com muito movimento usaram 1 vCPU em vez de 3,9, e o Frigate verificou mais 57% de objetos por segundo. Como ligar as suas câmaras em segurança e quanto custa face a um Coral.

Frigate sem Coral: deteção de objetos na GPU Intel com OpenVINO

O Frigate é o gravador de vídeo (NVR) de código aberto de que os utilizadores do Home Assistant tanto gostam: vigia as suas câmaras e distingue uma pessoa de um carro, de um gato ou de uma sombra. Durante anos, o conselho era “compre um Google Coral” para correr o detetor de objetos. Hoje, o Frigate também corre o detetor com o OpenVINO numa GPU Intel e consegue descodificar o vídeo nessa mesma GPU com VA-API.

Por isso fizemos uma pergunta simples: num servidor na nuvem com uma GPU Intel partilhada, o que traz realmente a GPU ao Frigate? Corremos as mesmas câmaras no mesmo servidor, primeiro com o trabalho na GPU e depois só no CPU, com 1, 4 e 8 câmaras.

Um cruzamento visto pelo Frigate, com uma caixa à volta de cada pessoa e de cada carro encontrados pelo detetor OpenVINO na GPU
O que o detetor vê: cada caixa é uma pessoa ou um carro encontrado pelo OpenVINO na GPU, com a respetiva pontuação. Imagem obtida da API do Frigate (latest.jpg?bbox=1). Vídeo: RG72, Wikimedia Commons, CC BY-SA 4.0.

Resultados em resumo

  • A GPU liberta o CPU. Com a descodificação e a deteção na GPU, o Frigate usou 0,57 vCPU para 1 câmara, 0,90 para 4 e 1,04 para 8. Com tudo no CPU usou 2,16 vCPU para 1 câmara, e os 4 vCPU do servidor ficaram cheios (96 a 97%) a partir de 4 câmaras.
  • Mais deteção quando há muito movimento. Com 8 câmaras com muito movimento, o detetor na GPU verificou 168 objetos por segundo contra 107 no CPU (+57%), e o Frigate analisou 62% das imagens contra 44%.
  • O tempo de deteção por imagem é parecido. O OpenVINO demorou cerca de 5,6 a 6,7 ms por inferência na GPU e 7,2 a 10,8 ms no CPU na maioria dos ensaios. O verdadeiro ganho não é a velocidade, é o CPU ficar livre.
  • A descodificação de vídeo na GPU custou cerca de 1,7% de um núcleo por câmara 1080p, contra cerca de 12% quando é o CPU a descodificar. Oito fluxos 1080p usaram cerca de um quarto do motor de vídeo da GPU.
  • Não é preciso Coral. Um único servidor na nuvem com GPU aguentou 8 câmaras de rua com muito movimento e ainda sobraram 3 vCPU.

Configuração do teste

ElementoValor
ServidorDebian 13, Linux 7.3, Intel UHD 770 (GPU partilhada), 4 vCPU, 12 GB de RAM
Frigate0.18.2 (imagem Docker oficial ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri
Detetortype: openvino, device: GPU ou device: CPU, modelo SSDLite MobileNet v2 300×300 incluído na imagem
Descodificaçãohwaccel_args: preset-vaapi (GPU) ou sem aceleração por hardware (CPU)
Câmaras1, 4 ou 8 fluxos RTSP, H.264 1920×1080 a 25 fps, 4 Mbit/s cada, servidos pelo MediaMTX no mesmo servidor
Vídeoclips em ciclo de cruzamentos movimentados, da Wikimedia Commons (licenças nas legendas)
Definições do Frigatedeteção a 1280×720 e 5 fps por câmara, objetos: pessoa, carro, bicicleta, mota, autocarro, camião, sem gravação
Medições60 s de aquecimento e depois 90 s; CPU de todo o servidor a partir de /proc/stat, /api/stats do Frigate a cada 5 s, motores da GPU a partir do kernel (DRM fdinfo)

Os valores de CPU estão em vCPU (1,00 = um núcleo inteiro dos 4). “Objetos verificados por segundo” é o detection_fps do Frigate: quantas zonas de imagem passaram pelo detetor por segundo, somando todas as câmaras.

Os nossos clips são um caso difícil: cruzamentos na cidade com pessoas e carros sempre em movimento, pelo que o Frigate corre o detetor em 10 a 20 zonas por imagem. Uma entrada de garagem ou a porta de uma loja, paradas na maior parte do tempo, precisam de muito menos deteção.

1. CPU do servidor: a principal diferença

Gráfico de barras: CPU do servidor usado pelo Frigate com 1, 4 e 8 câmaras, tudo na GPU contra tudo no CPU
CPU de todo o servidor, em vCPU de 4. Com a descodificação e a deteção na GPU (verde), 8 câmaras usam cerca de 1 vCPU. Só com o CPU (laranja), o servidor fica cheio a partir de 4 câmaras.
CâmarasTudo na GPUDetetor na GPU, descodificação no CPUDetetor no CPU, descodificação na GPUTudo no 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%)

É o detetor que enche o CPU. Quando o OpenVINO corre no CPU, só o processo do detetor do Frigate usou 2,4 a 3,1 núcleos; na GPU usou 0,1 a 0,3 de um núcleo. A descodificação de vídeo vem em segundo lugar: cada fluxo 1080p custava cerca de 12% de um núcleo quando era o CPU a descodificá-lo, e 1,7% com VA-API. Com uma só câmara, a diferença entre descodificar na GPU ou no CPU fica dentro do ruído de medição; a partir de 4 câmaras, o VA-API poupa uma parte visível do CPU.

2. Quanta deteção consegue o servidor fazer?

Gráfico de barras: objetos verificados por segundo pelo detetor do Frigate com 1, 4 e 8 câmaras, tudo na GPU contra tudo no CPU
Zonas de imagem verificadas pelo detetor por segundo, somando todas as câmaras. Com 8 câmaras, a GPU faz 168 por segundo; o CPU faz 107 ocupando todo o servidor.
CâmarasObjetos verificados / sImagens analisadas / recebidasTempo de inferência
1Tudo na GPU53,75,0 / 5,06,7 ms
1Tudo no CPU56,85,0 / 5,18,3 ms
4Tudo na GPU114,611,7 / 20,18,5 ms
4Detetor na GPU, descodificação no CPU173,417,8 / 20,15,6 ms
4Tudo no CPU127,513,3 / 20,27,2 ms
8Tudo na GPU167,925,1 / 40,35,8 ms
8Tudo no CPU106,817,8 / 40,49,1 ms

Com uma câmara, os dois modos acompanham todas as imagens. Com 4 e 8 câmaras com muito movimento, o detetor único do Frigate passa a ser o limite: quando está cheio, o Frigate salta imagens (continua a seguir os objetos, mas olha para eles com menos frequência). Na GPU, o detetor chegou a um máximo de cerca de 165 a 175 objetos por segundo; no CPU chegou a 107 a 136, ocupando todo o servidor.

Sejamos honestos quanto a um resultado: o ensaio “4 câmaras, tudo na GPU” saiu mais lento (8,5 ms por inferência, 115 objetos por segundo) do que o ensaio com descodificação no CPU (5,6 ms, 173 por segundo). A GPU é partilhada com outros servidores e o tempo de inferência na GPU variou entre 5,6 e 11,6 ms ao longo dos nossos ensaios, por isso leia os valores de débito como ordens de grandeza e não como limites exatos. Os valores de CPU não mudam esta conclusão: no CPU, o servidor está sempre cheio.

Página Sistema do Frigate: velocidade de inferência do detetor 5,73 ms, CPU do detetor 27,5%, utilização da GPU 82%, descodificador da GPU 10,5%
A página Sistema do próprio Frigate com 4 câmaras na GPU: 5,7 ms por inferência, o processo do detetor usa 27,5% de um núcleo e o descodificador da GPU cerca de 10%.
A vista em direto do Frigate com quatro câmaras de rua, cada uma com ícones de pessoa e de carro para os objetos que estão a ser seguidos
A vista em direto com 4 câmaras. Os ícones nos cantos mostram o que cada câmara está a seguir (pessoas, carros). Vídeos: RG72, Wikimedia Commons, CC BY-SA 4.0.

3. Ligar as suas câmaras a um Frigate na nuvem

O Frigate na nuvem precisa de ler o fluxo RTSP de cada câmara em casa ou no escritório. Há três formas de o fazer, e só a primeira deve ser a sua opção por defeito.

Recomendado: uma VPN (Tailscale ou WireGuard), nada aberto

Instale o Tailscale (ou simplesmente o WireGuard) num pequeno dispositivo sempre ligado, na mesma rede que as câmaras: um Raspberry Pi, um NAS ou um router compatível com WireGuard. Esse dispositivo passa a ser um subnet router: permite ao servidor na nuvem chegar à rede local através de um túnel cifrado. O Frigate usa então os endereços locais das câmaras, como se estivesse em sua casa, e nenhuma porta é aberta no seu router.

# no Raspberry Pi / NAS em casa (aqui, a rede das câmaras é 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
# aprove a rota na consola de administração do Tailscale e depois, no servidor na nuvem:
sudo tailscale up --accept-routes
# Frigate, no servidor na nuvem: a câmara mantém o seu endereço local
cameras:
  entrance:
    ffmpeg:
      inputs:
        - path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
          roles: [detect, record]

O vídeo é cifrado de ponta a ponta, a câmara nunca fica exposta à Internet e pode abrir a página web do Frigate no telemóvel através da mesma tailnet. Explicamos o Tailscale com mais detalhe em Jogue no seu servidor na nuvem a partir de qualquer lugar com Moonlight e Tailscale.

Possível: reencaminhamento de portas no router, com limites rigorosos

Também pode reencaminhar uma porta do seu router para a câmara e dar ao Frigate um endereço como rtsp://user:password@<your-public-ip>:8554/stream1. Funciona, mas conheça os riscos:

  • O RTSP normalmente não é cifrado. O vídeo e, em algumas câmaras, a palavra-passe atravessam a Internet em texto simples.
  • O firmware das câmaras baratas é um alvo clássico das botnets. Uma câmara exposta é analisada em poucas horas.

Se escolher este caminho, estas precauções são obrigatórias:

  • No router, permita a porta reencaminhada apenas a partir do endereço IP do servidor. Os nossos servidores têm um endereço IP fixo, e é isso que torna esta opção aceitável. Se o seu router não conseguir filtrar por endereço de origem, use antes a VPN.
  • Uma palavra-passe forte, exclusiva da câmara, nunca a de origem.
  • RTSPS (RTSP sobre TLS) se a câmara o suportar.
  • Firmware atualizado.

Nunca: uma câmara aberta a toda a Internet

Uma câmara acessível a qualquer pessoa, com ou sem palavra-passe, é a forma como vídeos privados acabam em sites públicos e câmaras acabam em botnets. Não o faça, nem “só para testar”.

O que custa em largura de banda e na lei

  • Largura de banda de upload: cada câmara envia o seu fluxo o tempo todo, normalmente 1 a 4 Mbit/s em 1080p H.264. Os nossos fluxos de teste tinham 4 Mbit/s cada, por isso 8 precisariam de 32 Mbit/s de upload. A fibra aguenta; uma linha ADSL lenta não. Se o upload for curto, use o segundo fluxo de baixa resolução da câmara para a deteção e mantenha a gravação em qualidade máxima no cartão SD da câmara.
  • Dados pessoais: o vídeo de pessoas é um dado pessoal. Para uma empresa que filma funcionários ou clientes, aplica-se o RGPD (avisos de videovigilância, conservação limitada, contrato com o fornecedor de alojamento). Os nossos servidores estão na UE.

4. Coral e mini PC, ou um servidor por mês?

Coral + mini PC em casaServidor na nuvem com GPU
Custocompra única: um mini PC por cerca de 150 a 250 €, um Coral USB por cerca de 60 a 80 €, um disco, mais cerca de 10 W de eletricidade o ano inteiro14,99 € s/ IVA por mês (iGPU Start) ou 29,99 € (iGPU Power)
Em 3 anoscerca de 300 a 400 € com a eletricidade540 € (Start) a 1.080 € (Power) s/ IVA
Uploadnenhum, o vídeo fica em casa1 a 4 Mbit/s por câmara, o tempo todo
Cópia fora do localnão: um ladrão pode levar o gravadorsim: as gravações estão longe das câmaras
Vários locaisum equipamento por local, ou uma VPN entre elesum só Frigate para todos os locais
Manutençãoo seu hardware, o seu disco, os seus cortes de energianós mantemos o servidor a funcionar; o Frigate fica a seu cargo

Os preços do Coral e do mini PC são preços correntes à data em que escrevemos; confirme-os antes de comprar. Um mini PC Intel recente (N100 e semelhantes) também consegue correr o OpenVINO na sua própria GPU, sem Coral.

O hardware em casa é para si se já tem um servidor em casa, se o seu upload é lento ou se quer que o vídeo nunca saia de casa. Um servidor na nuvem é para si se não tem servidor em casa (ou tem um Raspberry Pi ou um NAS fracos demais para a deteção), se quer as gravações guardadas longe das câmaras, se tem vários locais (lojas, escritórios, casa de férias) ou se quer aceder ao Frigate e ao Home Assistant de qualquer lugar sem abrir a sua rede doméstica.

5. Que plano escolher?

Com a descodificação e a deteção na GPU, o Frigate usou cerca de 1 vCPU para 8 câmaras com muito movimento.

  • iGPU Start (2 vCPU, 8 GB de RAM, Perf 1, 14,99 € s/ IVA por mês): uma casa ou uma pequena loja com 1 a 4 câmaras, com o Home Assistant ao lado.
  • iGPU Power (4 vCPU, 14 GB de RAM, Perf 2 = o dobro da parte de GPU do Start, 29,99 €): 4 a 8 câmaras, cenas com muito movimento, gravação no servidor ou vários locais. É o tamanho que testámos.
  • iGPU Pro (6 vCPU, 14 GB, Perf 3, 44,99 €): mais câmaras, ou o Frigate juntamente com outro trabalho de GPU (Immich, transcodificação) no mesmo servidor.

Sem a GPU, os mesmos 4 vCPU ficaram cheios a partir de 4 câmaras: precisaria de um servidor muito maior para fazer o mesmo trabalho no CPU.

6. Configurar num servidor Linux GPU

Quer o servidor pronto a usar? Peça-o por e-mail ao encomendar (contact@linuxgpu.eu): podemos entregar-lhe o servidor com o Frigate já instalado, com OpenVINO e VA-API na GPU, e o Tailscale pronto a ligar-se às suas câmaras.

Para o fazer você mesmo em Debian 13 com 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        # ou o broker MQTT do seu Home Assistant
ffmpeg:
  hwaccel_args: preset-vaapi   # descodificar na GPU
detectors:
  ov:
    type: openvino
    device: GPU                # detetar na 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

Obtenha a palavra-passe de administrador com docker logs frigate 2>&1 | grep -i password e abra https://<server>:8971 (melhor: só através do Tailscale). Na página Sistema, o detetor deve mostrar um tempo de inferência de poucos milissegundos e a GPU deve aparecer na lista.

Para o Frigate ao lado do Immich no mesmo servidor, com ficheiros Docker Compose, leia Self-host Immich and Frigate with OpenVINO on a GPU VPS (em inglês).

Experimentar

Ver os planos: o iGPU Start custa 14,99 € e o iGPU Power 29,99 € s/ IVA por mês.