Blog

Frigate zonder Coral: objectdetectie op de Intel-GPU met OpenVINO

We draaiden Frigate 0.18 met 1, 4 en 8 camera's op een cloudserver met een gedeelde Intel UHD 770: met OpenVINO en videodecodering op de GPU gebruikten 8 drukke camera's 1 vCPU in plaats van 3,9, en controleerde Frigate 57% meer objecten per seconde. Hoe je je camera's veilig koppelt, en wat het kost vergeleken met een Coral.

Frigate zonder Coral: objectdetectie op de Intel-GPU met OpenVINO

Frigate is de open-source videorecorder (NVR) waar Home Assistant-gebruikers dol op zijn: hij houdt je camera’s in de gaten en ziet het verschil tussen een persoon, een auto, een kat of een schaduw. Jarenlang was het advies “koop een Google Coral” om de objectdetector te draaien. Tegenwoordig draait Frigate zijn detector ook met OpenVINO op een Intel-GPU, en kan hij de video op dezelfde GPU decoderen met VA-API.

Daarom stelden we een simpele vraag: wat levert de GPU Frigate echt op, op een cloudserver met een gedeelde Intel-GPU? We draaiden dezelfde camera’s op dezelfde server, eerst met het werk op de GPU, daarna alleen op de CPU, met 1, 4 en 8 camera’s.

Een kruispunt gezien door Frigate, met kaders rond elke persoon en auto die de OpenVINO-detector op de GPU heeft gevonden
Wat de detector ziet: elk kader is een persoon of auto die OpenVINO op de GPU heeft gevonden, met de bijbehorende score. Beeld uit de API van Frigate (latest.jpg?bbox=1). Video: RG72, Wikimedia Commons, CC BY-SA 4.0.

De resultaten in het kort

  • De GPU ontlast de CPU. Met decodering en detectie op de GPU gebruikte Frigate 0,57 vCPU voor 1 camera, 0,90 voor 4 en 1,04 voor 8. Met alles op de CPU gebruikte hij 2,16 vCPU voor 1 camera, en de 4 vCPU van de server zaten vanaf 4 camera’s vol (96 tot 97%).
  • Meer detectie als het druk wordt. Met 8 drukke camera’s controleerde de GPU-detector 168 objecten per seconde tegenover 107 op de CPU (+57%), en analyseerde Frigate 62% van de beelden tegenover 44%.
  • De detectietijd per beeld ligt dicht bij elkaar. OpenVINO deed er in de meeste runs ongeveer 5,6 tot 6,7 ms per inferentie over op de GPU en 7,2 tot 10,8 ms op de CPU. De echte winst zit niet in snelheid, maar in een CPU die vrij blijft.
  • Videodecodering op de GPU kostte ongeveer 1,7% van één core per 1080p-camera, tegenover ongeveer 12% als de CPU decodeert. Acht 1080p-streams gebruikten ongeveer een kwart van de video-engine van de GPU.
  • Geen Coral nodig. Eén cloudserver met de GPU verwerkte 8 drukke straatcamera’s met nog 3 vCPU over.

Testopstelling

OnderdeelWaarde
ServerDebian 13, Linux 7.3, Intel UHD 770 (gedeelde GPU), 4 vCPU, 12 GB RAM
Frigate0.18.2 (officiële Docker-image ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri
Detectortype: openvino, device: GPU of device: CPU, model SSDLite MobileNet v2 300×300 uit de image
Decoderinghwaccel_args: preset-vaapi (GPU) of zonder hardwareversnelling (CPU)
Camera’s1, 4 of 8 RTSP-streams, H.264 1920×1080 op 25 fps, elk 4 Mbit/s, geleverd door MediaMTX op dezelfde server
Videoherhaalde clips van drukke kruispunten van Wikimedia Commons (licenties in de bijschriften)
Frigate-instellingendetectie op 1280×720 en 5 fps per camera, objecten: persoon, auto, fiets, motor, bus, vrachtwagen, geen opname
Metingen60 s opwarmen, daarna 90 s; CPU van de hele server via /proc/stat, /api/stats van Frigate elke 5 s, GPU-engines via de kernel (DRM fdinfo)

CPU-cijfers staan in vCPU (1,00 = één volledige core van de 4). “Gecontroleerde objecten per seconde” is de detection_fps van Frigate: hoeveel beelddelen elke seconde door de detector gingen, voor alle camera’s samen.

Onze clips zijn een lastig geval: kruispunten in de stad waar voortdurend mensen en auto’s bewegen, waardoor Frigate de detector op 10 tot 20 beelddelen per beeld laat draaien. Een oprit of winkelingang waar het grootste deel van de tijd niets beweegt, heeft veel minder detectie nodig.

1. Server-CPU: het grootste verschil

Staafdiagram: server-CPU gebruikt door Frigate met 1, 4 en 8 camera's, alles op de GPU tegenover alles op de CPU
CPU van de hele server, in vCPU van de 4. Met decodering en detectie op de GPU (groen) gebruiken 8 camera's ongeveer 1 vCPU. Alleen op de CPU (oranje) zit de server vanaf 4 camera's vol.
Camera’sAlles op de GPUGPU-detector, CPU-decoderingCPU-detector, GPU-decoderingAlles op de 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%)

Het is de detector die de CPU vult. Als OpenVINO op de CPU draait, gebruikte het detectorproces van Frigate alleen al 2,4 tot 3,1 cores; op de GPU was dat 0,1 tot 0,3 core. Videodecodering komt op de tweede plaats: elke 1080p-stream kostte ongeveer 12% van een core als de CPU hem decodeerde, en 1,7% met VA-API. Met één camera valt het verschil tussen GPU- en CPU-decodering binnen de meetruis; vanaf 4 camera’s bespaart VA-API een zichtbaar deel van de CPU.

2. Hoeveel detectie kan de server aan?

Staafdiagram: objecten per seconde gecontroleerd door de Frigate-detector met 1, 4 en 8 camera's, alles op de GPU tegenover alles op de CPU
Beelddelen die de detector elke seconde controleert, voor alle camera's samen. Bij 8 camera's doet de GPU er 168 per seconde, de CPU 107 terwijl hij de hele server bezet.
Camera’sGecontroleerde objecten / sGeanalyseerde / ontvangen beeldenInferentietijd
1Alles op de GPU53,75,0 / 5,06,7 ms
1Alles op de CPU56,85,0 / 5,18,3 ms
4Alles op de GPU114,611,7 / 20,18,5 ms
4GPU-detector, CPU-decodering173,417,8 / 20,15,6 ms
4Alles op de CPU127,513,3 / 20,27,2 ms
8Alles op de GPU167,925,1 / 40,35,8 ms
8Alles op de CPU106,817,8 / 40,49,1 ms

Met één camera houden beide modi elk beeld bij. Met 4 en 8 drukke camera’s wordt de enkele detector van Frigate de grens: als die vol zit, slaat Frigate beelden over (hij blijft objecten volgen, maar kijkt er minder vaak naar). Op de GPU kwam de detector tot ongeveer 165 tot 175 objecten per seconde; op de CPU haalde hij 107 tot 136 en bezette hij de hele server.

Eerlijk over één resultaat: de run “4 camera’s, alles op de GPU” kwam trager uit (8,5 ms per inferentie, 115 objecten per seconde) dan de run met CPU-decodering (5,6 ms, 173 per seconde). De GPU wordt gedeeld met andere servers en de inferentietijd op de GPU schommelde over onze runs tussen 5,6 en 11,6 ms. Lees de doorvoercijfers dus als ordegroottes, niet als exacte grenzen. De CPU-cijfers veranderen dat beeld niet: op de CPU zit de server altijd vol.

De systeempagina van Frigate: inferentiesnelheid van de detector 5,73 ms, detector-CPU 27,5%, GPU-gebruik 82%, GPU-decoder 10,5%
De eigen systeempagina van Frigate met 4 camera's op de GPU: 5,7 ms per inferentie, het detectorproces gebruikt 27,5% van één core en de GPU-decoder ongeveer 10%.
De liveweergave van Frigate met vier straatcamera's, elk met persoon- en auto-icoontjes voor de objecten die worden gevolgd
De liveweergave met 4 camera's. De icoontjes in de hoeken laten zien wat elke camera volgt (personen, auto's). Video's: RG72, Wikimedia Commons, CC BY-SA 4.0.

3. Je camera’s koppelen aan Frigate in de cloud

Frigate in de cloud moet de RTSP-stream van elke camera thuis of op kantoor kunnen lezen. Dat kan op drie manieren, en alleen de eerste zou je standaardkeuze moeten zijn.

Aanbevolen: een VPN (Tailscale of WireGuard), niets opengezet

Installeer Tailscale (of gewoon WireGuard) op een klein apparaat dat altijd aan staat in hetzelfde netwerk als de camera’s: een Raspberry Pi, een NAS of een router met WireGuard-ondersteuning. Dat apparaat wordt een subnet router: het laat de cloudserver via een versleutelde tunnel het lokale netwerk bereiken. Frigate gebruikt dan de lokale adressen van de camera’s, alsof hij bij je thuis staat, en er wordt geen poort op je router opengezet.

# op de Raspberry Pi / NAS thuis (je cameranetwerk is hier 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
# keur de route goed in de Tailscale-beheerconsole, en dan op de cloudserver:
sudo tailscale up --accept-routes
# Frigate, op de cloudserver: de camera houdt zijn lokale adres
cameras:
  entrance:
    ffmpeg:
      inputs:
        - path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
          roles: [detect, record]

De video is end-to-end versleuteld, de camera hangt nooit open op internet, en je kunt de webpagina van Frigate via hetzelfde tailnet op je telefoon openen. We leggen Tailscale uitgebreider uit in Overal spelen op je cloudserver met Moonlight en Tailscale.

Mogelijk: port forwarding op de router, met strikte grenzen

Je kunt ook een poort op je router doorsturen naar de camera en Frigate een adres geven zoals rtsp://user:password@<your-public-ip>:8554/stream1. Dat werkt, maar ken de risico’s:

  • RTSP is meestal niet versleuteld. De video, en bij sommige camera’s ook het wachtwoord, gaat onversleuteld over internet.
  • Firmware van goedkope camera’s is een klassiek doelwit voor botnets. Een bereikbare camera wordt binnen enkele uren gescand.

Kies je deze weg, dan zijn deze voorzorgsmaatregelen verplicht:

  • Sta op de router de doorgestuurde poort alleen toe vanaf het IP-adres van de server. Onze servers hebben een vast IP-adres, en dat maakt dit acceptabel. Kan je router niet filteren op bronadres, gebruik dan de VPN.
  • Een sterk wachtwoord, alleen voor deze camera, nooit het standaardwachtwoord.
  • RTSPS (RTSP via TLS) als de camera dat ondersteunt.
  • Bijgewerkte firmware.

Nooit: een camera die openstaat voor heel internet

Een camera die voor iedereen bereikbaar is, met of zonder wachtwoord, is precies hoe privévideo’s op openbare websites belanden en camera’s in botnets. Doe het niet, ook niet “even om te testen”.

Wat het kost aan bandbreedte en wat de wet zegt

  • Uploadbandbreedte: elke camera stuurt zijn stream continu, meestal 1 tot 4 Mbit/s in 1080p H.264. Onze teststreams waren elk 4 Mbit/s, dus 8 ervan zouden 32 Mbit/s upload vragen. Glasvezel kan dat aan, een trage DSL-lijn niet. Is je upload krap, gebruik dan de tweede stream van de camera met lage resolutie voor detectie en bewaar de opname in volle kwaliteit op de SD-kaart van de camera.
  • Persoonsgegevens: beelden van mensen zijn persoonsgegevens. Voor een bedrijf dat personeel of klanten filmt, geldt de AVG (informatieborden, beperkte bewaartermijn, een verwerkersovereenkomst met de hostingpartij). Onze servers staan in de EU.

4. Coral en een mini-pc, of een server per maand?

Coral + mini-pc thuisCloudserver met GPU
Kosteneenmalige aankoop: een mini-pc van zo’n € 150 tot € 250, een USB-Coral van zo’n € 60 tot € 80, een schijf, plus ongeveer 10 W stroom het hele jaar€ 14,99 per maand excl. btw (iGPU Start) of € 29,99 (iGPU Power)
Over 3 jaarongeveer € 300 tot € 400 inclusief stroom€ 540 (Start) tot € 1.080 (Power) excl. btw
Uploadgeen, de video blijft thuis1 tot 4 Mbit/s per camera, continu
Kopie buiten de deurnee: een inbreker kan de recorder meenemenja: de opnames staan ver van de camera’s
Meerdere locatieséén kastje per locatie, of een VPN ertussenéén Frigate voor alle locaties
Onderhoudjouw hardware, jouw schijf, jouw stroomstoringenwij houden de server draaiende; jij beheert Frigate

De prijzen voor de Coral en de mini-pc zijn gangbare winkelprijzen op het moment van schrijven; controleer ze voordat je iets koopt. Een recente Intel-mini-pc (N100 en vergelijkbaar) kan OpenVINO ook op zijn eigen GPU draaien, zonder Coral.

Hardware thuis past bij je als je al een thuisserver hebt, een trage upload hebt of wilt dat de video het huis nooit verlaat. Een cloudserver past bij je als je geen thuisserver hebt (of een Raspberry Pi of NAS die te zwak is voor detectie), je opnames ver van de camera’s wilt bewaren, meerdere locaties hebt (winkels, kantoren, vakantiehuis), of Frigate en Home Assistant overal bereikbaar wilt hebben zonder je thuisnetwerk open te zetten.

5. Welk abonnement?

Met decodering en detectie op de GPU gebruikte Frigate ongeveer 1 vCPU voor 8 drukke camera’s.

  • iGPU Start (2 vCPU, 8 GB RAM, Perf 1, € 14,99 per maand excl. btw): een woning of kleine winkel met 1 tot 4 camera’s, met Home Assistant ernaast.
  • iGPU Power (4 vCPU, 14 GB RAM, Perf 2 = twee keer het GPU-aandeel van Start, € 29,99): 4 tot 8 camera’s, drukke beelden, opname op de server, of meerdere locaties. Dit is de grootte die we hebben getest.
  • iGPU Pro (6 vCPU, 14 GB, Perf 3, € 44,99): meer camera’s, of Frigate plus ander GPU-werk (Immich, transcoderen) op dezelfde server.

Zonder GPU zaten dezelfde 4 vCPU vanaf 4 camera’s vol: je zou een veel grotere server nodig hebben om hetzelfde werk op de CPU te doen.

6. Zo zet je het op een Linux GPU-server

Liever meteen klaar voor gebruik? Vraag het per e-mail bij je bestelling (contact@linuxgpu.eu): we kunnen de server leveren met Frigate al geïnstalleerd, met OpenVINO en VA-API op de GPU, en Tailscale klaar om verbinding te maken met je camera’s.

Zelf doen op Debian 13 met 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        # of de MQTT-broker van je Home Assistant
ffmpeg:
  hwaccel_args: preset-vaapi   # decoderen op de GPU
detectors:
  ov:
    type: openvino
    device: GPU                # detecteren op de 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

Haal het beheerderswachtwoord op met docker logs frigate 2>&1 | grep -i password en open dan https://<server>:8971 (beter: alleen via Tailscale). Op de systeempagina hoort de detector een inferentietijd van een paar milliseconden te tonen en moet de GPU in de lijst staan.

Voor Frigate naast Immich op dezelfde server, met Docker Compose-bestanden, lees Self-host Immich and Frigate with OpenVINO on a GPU VPS (in het Engels).

Probeer het

Bekijk de abonnementen: iGPU Start kost € 14,99 en iGPU Power € 29,99 per maand excl. btw.