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.
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
| Onderdeel | Waarde |
|---|---|
| Server | Debian 13, Linux 7.3, Intel UHD 770 (gedeelde GPU), 4 vCPU, 12 GB RAM |
| Frigate | 0.18.2 (officiële Docker-image ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri |
| Detector | type: openvino, device: GPU of device: CPU, model SSDLite MobileNet v2 300×300 uit de image |
| Decodering | hwaccel_args: preset-vaapi (GPU) of zonder hardwareversnelling (CPU) |
| Camera’s | 1, 4 of 8 RTSP-streams, H.264 1920×1080 op 25 fps, elk 4 Mbit/s, geleverd door MediaMTX op dezelfde server |
| Video | herhaalde clips van drukke kruispunten van Wikimedia Commons (licenties in de bijschriften) |
| Frigate-instellingen | detectie op 1280×720 en 5 fps per camera, objecten: persoon, auto, fiets, motor, bus, vrachtwagen, geen opname |
| Metingen | 60 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
| Camera’s | Alles op de GPU | GPU-detector, CPU-decodering | CPU-detector, GPU-decodering | Alles op de 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%) |
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?
| Camera’s | Gecontroleerde objecten / s | Geanalyseerde / ontvangen beelden | Inferentietijd | |
|---|---|---|---|---|
| 1 | Alles op de GPU | 53,7 | 5,0 / 5,0 | 6,7 ms |
| 1 | Alles op de CPU | 56,8 | 5,0 / 5,1 | 8,3 ms |
| 4 | Alles op de GPU | 114,6 | 11,7 / 20,1 | 8,5 ms |
| 4 | GPU-detector, CPU-decodering | 173,4 | 17,8 / 20,1 | 5,6 ms |
| 4 | Alles op de CPU | 127,5 | 13,3 / 20,2 | 7,2 ms |
| 8 | Alles op de GPU | 167,9 | 25,1 / 40,3 | 5,8 ms |
| 8 | Alles op de CPU | 106,8 | 17,8 / 40,4 | 9,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.
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 thuis | Cloudserver met GPU | |
|---|---|---|
| Kosten | eenmalige 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 jaar | ongeveer € 300 tot € 400 inclusief stroom | € 540 (Start) tot € 1.080 (Power) excl. btw |
| Upload | geen, de video blijft thuis | 1 tot 4 Mbit/s per camera, continu |
| Kopie buiten de deur | nee: een inbreker kan de recorder meenemen | ja: de opnames staan ver van de camera’s |
| Meerdere locaties | één kastje per locatie, of een VPN ertussen | één Frigate voor alle locaties |
| Onderhoud | jouw hardware, jouw schijf, jouw stroomstoringen | wij 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.