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.
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
| Elemento | Valor |
|---|---|
| Servidor | Debian 13, Linux 7.3, Intel UHD 770 (GPU partilhada), 4 vCPU, 12 GB de RAM |
| Frigate | 0.18.2 (imagem Docker oficial ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri |
| Detetor | type: openvino, device: GPU ou device: CPU, modelo SSDLite MobileNet v2 300×300 incluído na imagem |
| Descodificação | hwaccel_args: preset-vaapi (GPU) ou sem aceleração por hardware (CPU) |
| Câmaras | 1, 4 ou 8 fluxos RTSP, H.264 1920×1080 a 25 fps, 4 Mbit/s cada, servidos pelo MediaMTX no mesmo servidor |
| Vídeo | clips em ciclo de cruzamentos movimentados, da Wikimedia Commons (licenças nas legendas) |
| Definições do Frigate | deteção a 1280×720 e 5 fps por câmara, objetos: pessoa, carro, bicicleta, mota, autocarro, camião, sem gravação |
| Medições | 60 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
| Câmaras | Tudo na GPU | Detetor na GPU, descodificação no CPU | Detetor no CPU, descodificação na GPU | Tudo no 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%) |
É 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?
| Câmaras | Objetos verificados / s | Imagens analisadas / recebidas | Tempo de inferência | |
|---|---|---|---|---|
| 1 | Tudo na GPU | 53,7 | 5,0 / 5,0 | 6,7 ms |
| 1 | Tudo no CPU | 56,8 | 5,0 / 5,1 | 8,3 ms |
| 4 | Tudo na GPU | 114,6 | 11,7 / 20,1 | 8,5 ms |
| 4 | Detetor na GPU, descodificação no CPU | 173,4 | 17,8 / 20,1 | 5,6 ms |
| 4 | Tudo no CPU | 127,5 | 13,3 / 20,2 | 7,2 ms |
| 8 | Tudo na GPU | 167,9 | 25,1 / 40,3 | 5,8 ms |
| 8 | Tudo no CPU | 106,8 | 17,8 / 40,4 | 9,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.
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 casa | Servidor na nuvem com GPU | |
|---|---|---|
| Custo | compra ú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 inteiro | 14,99 € s/ IVA por mês (iGPU Start) ou 29,99 € (iGPU Power) |
| Em 3 anos | cerca de 300 a 400 € com a eletricidade | 540 € (Start) a 1.080 € (Power) s/ IVA |
| Upload | nenhum, o vídeo fica em casa | 1 a 4 Mbit/s por câmara, o tempo todo |
| Cópia fora do local | não: um ladrão pode levar o gravador | sim: as gravações estão longe das câmaras |
| Vários locais | um equipamento por local, ou uma VPN entre eles | um só Frigate para todos os locais |
| Manutenção | o seu hardware, o seu disco, os seus cortes de energia | nó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.