Frigate ohne Coral: Objekterkennung auf der Intel-GPU mit OpenVINO
Frigate ist der Open-Source-Videorekorder (NVR), den Home-Assistant-Nutzer lieben: Er überwacht Ihre Kameras und unterscheidet eine Person von einem Auto, einer Katze oder einem Schatten. Jahrelang lautete der Rat: „Kaufen Sie einen Google Coral“, um den Objektdetektor zu betreiben. Heute betreibt Frigate seinen Detektor auch mit OpenVINO auf einer Intel-GPU und kann das Video auf derselben GPU mit VA-API dekodieren.
Wir haben uns also eine einfache Frage gestellt: Was bringt die GPU Frigate wirklich, auf einem Cloud-Server mit einer geteilten Intel-GPU? Wir haben dieselben Kameras auf demselben Server laufen lassen, einmal mit der Arbeit auf der GPU, einmal nur auf der CPU, jeweils mit 1, 4 und 8 Kameras.
latest.jpg?bbox=1). Video: RG72, Wikimedia Commons, CC BY-SA 4.0.Die Ergebnisse im Überblick
- Die GPU entlastet die CPU. Mit Dekodierung und Erkennung auf der GPU brauchte Frigate 0,57 vCPU für 1 Kamera, 0,90 für 4 und 1,04 für 8. Mit allem auf der CPU brauchte es 2,16 vCPU für 1 Kamera, und die 4 vCPU des Servers waren ab 4 Kameras voll (96 bis 97 %).
- Mehr Erkennung, wenn viel los ist. Bei 8 belebten Kameras prüfte der GPU-Detektor 168 Objekte pro Sekunde gegenüber 107 auf der CPU (+57 %), und Frigate analysierte 62 % der Bilder gegenüber 44 %.
- Die Erkennungszeit pro Bild ist ähnlich. OpenVINO brauchte in den meisten Durchläufen etwa 5,6 bis 6,7 ms pro Inferenz auf der GPU und 7,2 bis 10,8 ms auf der CPU. Der eigentliche Gewinn ist nicht die Geschwindigkeit, sondern dass die CPU frei bleibt.
- Videodekodierung auf der GPU kostete etwa 1,7 % eines Kerns pro 1080p-Kamera, gegenüber etwa 12 %, wenn die CPU dekodiert. Acht 1080p-Streams nutzten etwa ein Viertel der Video-Engine der GPU.
- Kein Coral nötig. Ein einziger Cloud-Server mit GPU bewältigte 8 belebte Straßenkameras, und 3 vCPU blieben frei.
Testaufbau
| Element | Wert |
|---|---|
| Server | Debian 13, Linux 7.3, Intel UHD 770 (geteilte GPU), 4 vCPU, 12 GB RAM |
| Frigate | 0.18.2 (offizielles Docker-Image ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri |
| Detektor | type: openvino, device: GPU oder device: CPU, Modell SSDLite MobileNet v2 300×300 aus dem Image |
| Dekodierung | hwaccel_args: preset-vaapi (GPU) oder ohne Hardwarebeschleunigung (CPU) |
| Kameras | 1, 4 oder 8 RTSP-Streams, H.264 1920×1080 mit 25 fps, je 4 Mbit/s, ausgeliefert von MediaMTX auf demselben Server |
| Video | Endlosschleifen belebter Straßenkreuzungen von Wikimedia Commons (Lizenzen in den Bildunterschriften) |
| Frigate-Einstellungen | Erkennung in 1280×720 mit 5 fps pro Kamera, Objekte: Person, Auto, Fahrrad, Motorrad, Bus, Lkw, keine Aufzeichnung |
| Messungen | 60 s Aufwärmen, dann 90 s; CPU des ganzen Servers aus /proc/stat, /api/stats von Frigate alle 5 s, GPU-Engines aus dem Kernel (DRM fdinfo) |
Die CPU-Werte sind in vCPU angegeben (1,00 = ein voller Kern von 4). „Geprüfte Objekte pro Sekunde“ ist der
detection_fps-Wert von Frigate: wie viele Bildbereiche pro Sekunde durch den Detektor gingen, über alle Kameras
zusammen.
Unsere Clips sind ein schwieriger Fall: Kreuzungen in der Stadt, auf denen sich ständig Menschen und Autos bewegen, sodass Frigate den Detektor auf 10 bis 20 Bereiche pro Bild anwendet. Eine Einfahrt oder ein Ladeneingang, wo sich die meiste Zeit nichts bewegt, braucht viel weniger Erkennung.
1. Server-CPU: der Hauptunterschied
| Kameras | Alles auf der GPU | GPU-Detektor, CPU-Dekodierung | CPU-Detektor, GPU-Dekodierung | Alles auf der 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 %) |
Es ist der Detektor, der die CPU füllt. Wenn OpenVINO auf der CPU läuft, brauchte allein der Detektorprozess von Frigate 2,4 bis 3,1 Kerne; auf der GPU waren es 0,1 bis 0,3 Kerne. Die Videodekodierung kommt an zweiter Stelle: Jeder 1080p-Stream kostete etwa 12 % eines Kerns, wenn die CPU ihn dekodierte, und 1,7 % mit VA-API. Bei einer Kamera liegt der Unterschied zwischen GPU- und CPU-Dekodierung im Messrauschen; ab 4 Kameras spart VA-API einen sichtbaren Teil der CPU.
2. Wie viel Erkennung schafft der Server?
| Kameras | Geprüfte Objekte / s | Analysierte / empfangene Bilder | Inferenzzeit | |
|---|---|---|---|---|
| 1 | Alles auf der GPU | 53,7 | 5,0 / 5,0 | 6,7 ms |
| 1 | Alles auf der CPU | 56,8 | 5,0 / 5,1 | 8,3 ms |
| 4 | Alles auf der GPU | 114,6 | 11,7 / 20,1 | 8,5 ms |
| 4 | GPU-Detektor, CPU-Dekodierung | 173,4 | 17,8 / 20,1 | 5,6 ms |
| 4 | Alles auf der CPU | 127,5 | 13,3 / 20,2 | 7,2 ms |
| 8 | Alles auf der GPU | 167,9 | 25,1 / 40,3 | 5,8 ms |
| 8 | Alles auf der CPU | 106,8 | 17,8 / 40,4 | 9,1 ms |
Mit einer Kamera kommen beide Modi bei jedem Bild mit. Bei 4 und 8 belebten Kameras wird der einzelne Detektor von Frigate zur Grenze: Wenn er voll ist, überspringt Frigate Bilder (es verfolgt die Objekte weiter, sieht sie aber seltener an). Auf der GPU erreichte der Detektor maximal etwa 165 bis 175 Objekte pro Sekunde; auf der CPU kam er auf 107 bis 136 und belegte dabei den ganzen Server.
Bei einem Ergebnis wollen wir ehrlich sein: Der Durchlauf „4 Kameras, alles auf der GPU“ war langsamer (8,5 ms pro Inferenz, 115 Objekte pro Sekunde) als der Durchlauf mit CPU-Dekodierung (5,6 ms, 173 pro Sekunde). Die GPU wird mit anderen Servern geteilt, und die Inferenzzeit auf der GPU schwankte über unsere Durchläufe zwischen 5,6 und 11,6 ms. Lesen Sie die Durchsatzwerte daher als Größenordnungen, nicht als exakte Grenzen. Die CPU-Werte ändern nichts an diesem Bild: Auf der CPU ist der Server immer voll.
3. Ihre Kameras mit einem Frigate in der Cloud verbinden
Frigate in der Cloud muss den RTSP-Stream jeder Kamera zu Hause oder im Büro lesen. Dafür gibt es drei Wege, und nur der erste sollte Ihre Standardwahl sein.
Empfohlen: ein VPN (Tailscale oder WireGuard), nichts geöffnet
Installieren Sie Tailscale (oder einfach WireGuard) auf einem kleinen, dauerhaft eingeschalteten Gerät im selben Netz wie die Kameras: einem Raspberry Pi, einem NAS oder einem Router mit WireGuard-Unterstützung. Dieses Gerät wird zum Subnet Router: Es lässt den Cloud-Server über einen verschlüsselten Tunnel ins lokale Netz. Frigate nutzt dann die lokalen Adressen der Kameras, als stünde es bei Ihnen zu Hause, und auf Ihrem Router wird kein Port geöffnet.
# auf dem Raspberry Pi / NAS zu Hause (Ihr Kameranetz ist 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
# die Route in der Tailscale-Admin-Konsole freigeben, dann auf dem Cloud-Server:
sudo tailscale up --accept-routes
# Frigate auf dem Cloud-Server: Die Kamera behält ihre lokale Adresse
cameras:
entrance:
ffmpeg:
inputs:
- path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
roles: [detect, record]
Das Video ist Ende-zu-Ende verschlüsselt, die Kamera ist nie dem Internet ausgesetzt, und Sie können die Weboberfläche von Frigate über dasselbe Tailnet auf Ihrem Handy öffnen. Tailscale erklären wir ausführlicher in Mit Moonlight und Tailscale überall auf Ihrem Cloud-Server spielen.
Möglich: Portweiterleitung am Router, mit strengen Grenzen
Sie können auch einen Port Ihres Routers an die Kamera weiterleiten und Frigate eine Adresse wie
rtsp://user:password@<your-public-ip>:8554/stream1 geben. Das funktioniert, aber kennen Sie die Risiken:
- RTSP ist meist unverschlüsselt. Das Video und bei manchen Kameras auch das Passwort gehen im Klartext durchs Internet.
- Die Firmware billiger Kameras ist ein klassisches Ziel für Botnetze. Eine offen erreichbare Kamera wird innerhalb weniger Stunden gescannt.
Wenn Sie diesen Weg wählen, sind diese Vorkehrungen Pflicht:
- Erlauben Sie am Router den weitergeleiteten Port nur von der IP-Adresse des Servers. Unsere Server haben eine feste IP-Adresse, und genau das macht diesen Weg vertretbar. Wenn Ihr Router nicht nach Quelladresse filtern kann, nehmen Sie stattdessen das VPN.
- Ein starkes Passwort nur für diese Kamera, nie das Standardpasswort.
- RTSPS (RTSP über TLS), wenn die Kamera es unterstützt.
- Aktuelle Firmware.
Niemals: eine Kamera, die für das ganze Internet offen ist
Eine Kamera, die jeder erreichen kann, ob mit oder ohne Passwort, ist der Weg, auf dem private Videos auf öffentlichen Websites und Kameras in Botnetzen landen. Machen Sie das nicht, auch nicht „nur zum Testen“.
Was es an Bandbreite und rechtlich bedeutet
- Upload-Bandbreite: Jede Kamera sendet ihren Stream ständig, meist 1 bis 4 Mbit/s in 1080p H.264. Unsere Test-Streams hatten je 4 Mbit/s, 8 davon bräuchten also 32 Mbit/s Upload. Glasfaser schafft das, eine langsame DSL-Leitung nicht. Wenn der Upload knapp ist, nutzen Sie für die Erkennung den zweiten Stream der Kamera mit niedriger Auflösung und behalten Sie die Aufzeichnung in voller Qualität auf der SD-Karte der Kamera.
- Personenbezogene Daten: Videos von Menschen sind personenbezogene Daten. Für ein Unternehmen, das Mitarbeitende oder Kunden filmt, gilt die DSGVO (Hinweisschilder, begrenzte Speicherdauer, Vertrag mit dem Hoster). Unsere Server stehen in der EU.
4. Coral und Mini-PC oder Server im Monatsabo?
| Coral + Mini-PC zu Hause | Cloud-Server mit GPU | |
|---|---|---|
| Kosten | einmaliger Kauf: ein Mini-PC für etwa 150 bis 250 €, ein USB-Coral für etwa 60 bis 80 €, eine Festplatte, dazu etwa 10 W Strom das ganze Jahr | 14,99 € netto pro Monat (iGPU Start) oder 29,99 € (iGPU Power) |
| Über 3 Jahre | etwa 300 bis 400 € mit Strom | 540 € (Start) bis 1.080 € (Power) netto |
| Upload | keiner, das Video bleibt zu Hause | 1 bis 4 Mbit/s pro Kamera, ständig |
| Kopie außer Haus | nein: Ein Einbrecher kann den Rekorder mitnehmen | ja: Die Aufnahmen liegen weit weg von den Kameras |
| Mehrere Standorte | ein Gerät pro Standort oder ein VPN dazwischen | ein Frigate für alle Standorte |
| Wartung | Ihre Hardware, Ihre Festplatte, Ihre Stromausfälle | wir halten den Server am Laufen; Sie verwalten Frigate |
Die Preise für Coral und Mini-PC sind übliche Marktpreise zum Zeitpunkt des Schreibens; prüfen Sie sie vor dem Kauf. Ein aktueller Intel-Mini-PC (N100 und ähnliche) kann OpenVINO auch auf seiner eigenen GPU betreiben, ohne Coral.
Hardware zu Hause passt zu Ihnen, wenn Sie schon einen Heimserver betreiben, einen langsamen Upload haben oder das Video nie aus dem Haus geben wollen. Ein Cloud-Server passt zu Ihnen, wenn Sie keinen Heimserver haben (oder einen Raspberry Pi oder ein NAS, die für die Erkennung zu schwach sind), Aufnahmen weit weg von den Kameras speichern wollen, mehrere Standorte betreiben (Läden, Büros, Ferienhaus) oder Frigate und Home Assistant von überall erreichen wollen, ohne Ihr Heimnetz zu öffnen.
5. Welches Angebot?
Mit Dekodierung und Erkennung auf der GPU brauchte Frigate etwa 1 vCPU für 8 belebte Kameras.
- iGPU Start (2 vCPU, 8 GB RAM, Perf 1, 14,99 € netto pro Monat): ein Zuhause oder ein kleiner Laden mit 1 bis 4 Kameras, mit Home Assistant daneben.
- iGPU Power (4 vCPU, 14 GB RAM, Perf 2 = doppelter GPU-Anteil von Start, 29,99 €): 4 bis 8 Kameras, belebte Szenen, Aufzeichnung auf dem Server oder mehrere Standorte. Das ist die Größe, die wir getestet haben.
- iGPU Pro (6 vCPU, 14 GB, Perf 3, 44,99 €): mehr Kameras, oder Frigate plus andere GPU-Arbeit (Immich, Transkodierung) auf demselben Server.
Ohne GPU waren dieselben 4 vCPU ab 4 Kameras voll: Sie bräuchten einen viel größeren Server, um dieselbe Arbeit auf der CPU zu erledigen.
6. Einrichtung auf einem Linux-GPU-Server
Lieber sofort einsatzbereit? Fragen Sie bei der Bestellung per E-Mail danach (contact@linuxgpu.eu): Wir können Ihnen den Server mit vorinstalliertem Frigate liefern, mit OpenVINO und VA-API auf der GPU und Tailscale bereit für die Verbindung zu Ihren Kameras.
So richten Sie es selbst auf Debian 13 mit Docker ein:
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 # oder der MQTT-Broker Ihres Home Assistant
ffmpeg:
hwaccel_args: preset-vaapi # Dekodierung auf der GPU
detectors:
ov:
type: openvino
device: GPU # Erkennung auf der 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
Das Admin-Passwort erhalten Sie mit docker logs frigate 2>&1 | grep -i password; öffnen Sie dann
https://<server>:8971 (besser: nur über Tailscale). Auf der Systemseite sollte der Detektor eine Inferenzzeit von
wenigen Millisekunden anzeigen, und die GPU sollte aufgeführt sein.
Für Frigate neben Immich auf demselben Server, mit Docker-Compose-Dateien, lesen Sie Self-host Immich and Frigate with OpenVINO on a GPU VPS (auf Englisch).
Ausprobieren
Zu den Angeboten: iGPU Start kostet 14,99 € und iGPU Power 29,99 € netto pro Monat.