Frigate und Coral TPU: Wie viele Kameras ein Beschleuniger schafft

Inhalt
Vor jeder Frigate-Installation steht die Frage, wie viele Kameras eine Coral trägt, und die Antwort ist immer eine Spanne – weil die Frage in dieser Form falsch gestellt ist. Eine TPU verarbeitet keine Kameras. Sie verarbeitet Inferenzen, und dafür hat sie genau tausend Millisekunden je Sekunde.
Alles Übrige folgt daraus: wie viele Erkennungen je Sekunde die Anlage erzeugt, wie lange eine davon auf dem gewählten Beschleuniger dauert und wie viel von der Sekunde übrig bleibt, wenn mehrere Kameras gleichzeitig etwas zu tun haben. Drei Zahlen, eine Multiplikation.

Was eine Erkennung wirklich kostet
Frigate schickt nicht jedes Bild an den Detektor. Zuerst sucht ein billiger CPU-Durchlauf nach Bewegung und schneidet die Flächen heraus, in denen sich etwas geändert hat; nur diese Bereiche gehen an die TPU, jeder als eigene Inferenz. Eine ruhige Szene kostet deshalb gar nichts, und eine Szene mit zwei getrennten bewegten Flächen kostet zwei Inferenzen je Bild statt einer.
Genau diese Feinheit macht aus Kamerazahlen eine Schätzerei. Die Last ist nicht Kameras mal Bildrate, sondern Kameras mal Bildrate mal Anzahl der Bewegungsbereiche – und der letzte Faktor ist eine Eigenschaft des Blickfelds, nicht der Hardware. Eine Kamera auf eine Hecke im Wind erzeugt den ganzen Tag Bereiche, eine auf ein geschlossenes Tor stundenlang keinen einzigen.
Die Rechnung in einer Zeile
Inferenzen/s = Kameras × Erkennungsbildrate × Bereiche je Bild
Belegung = Inferenzen/s × Inferenzzeit
Reserve = 1000 ms/s − Belegung
8 Kameras × 5 B/s × 1,5 Bereiche = 60 Inferenzen/s
60/s × 8 ms = 480 ms/s → 48 % einer Coral
Der Faktor 1,5 Bereiche je Bild ist ein brauchbarer Arbeitswert für gemischte Außenansichten; eine belebte Straße braucht zwei bis drei, ein stiller Flur kaum einen. Diesen Wert zu messen statt anzunehmen lohnt sich, weil er der einzige in der Zeile ist, der auf keinem Datenblatt steht.
Warum der Mittelwert die falsche Zahl ist
Eine Auslegung auf den Mittelwert ergibt eine Anlage, die monatelang glänzend läuft. Der Mittelwert ist niedrig, weil die meisten Kameras die meiste Zeit nichts sehen, Ein darauf gebautes Budget hat keine Reserve für den Nachmittag, an dem eine Lieferung kommt, der Hund im Garten ist und der Wind auffrischt – drei Kameras beschäftigt in derselben Sekunde, und zwar in der wichtigsten.
Der brauchbare Auslegungsfall ist der gleichzeitige: alle Kameras, die plausibel zusammen etwas zu tun haben können, gleichzeitig beschäftigt, bei der eingestellten Bildrate. Passt dieser Fall in eine Sekunde TPU-Zeit, hat die Anlage keine schlechten Nachmittage. Passt er nicht, ist der Fehler im Protokoll unsichtbar und im fehlenden Ausschnitt offensichtlich.
Was welcher Detektor liefert
| Detektor | Inferenzzeit | Inferenzen/s | Kameras bei 5 B/s |
|---|---|---|---|
| Coral M.2 / PCIe | ~7 ms | 143 | 19 |
| Coral USB am USB-3.0-Anschluss | ~8 ms | 125 | 16 |
| Coral USB am USB-2.0-Anschluss | ~22 ms | 45 | 6 |
| OpenVINO auf einer Intel-iGPU | ~15 ms | 66 | 8 |
| Nur CPU, vier Kerne | ~90 ms | 11 | 1 |
Die dritte Zeile ist die häufigste selbst zugefügte Wunde: derselbe Stick, dasselbe Modell, derselbe Code, nur in einer schwarzen statt einer blauen Buchse – und ein Drittel der Geschwindigkeit. Die letzte Zeile erklärt, warum der CPU-Detektor eher ein Machbarkeitsnachweis als eine Möglichkeit ist: Eine Kamera ist keine Anlage.
Zwei Beschleuniger verdoppeln die Obergrenze ungefähr, weil Frigate die Arbeit dem gerade freien Detektor gibt. Was sie nicht halbieren, steht im nächsten Abschnitt.
Der Engpass ist meist nicht die TPU
Bevor ein Bild beim Detektor ankommt, muss es dekodiert werden, und Dekodieren ist reine CPU-Arbeit, an die kein Beschleuniger dieses Budgets rührt. Einen 1280×720-Nebenstrom bei 5 B/s zu dekodieren, ist Kleingeld. Einen 4K-Hauptstrom bei 20 B/s zu dekodieren, kostet rund einen Kern je Kamera – weshalb eine Anlage mit acht Kameras eine Maschine flachlegen kann, während die TPU bei elf Prozent steht.
Die Anordnung, die das vermeidet, ist die übliche und verdient es, ausgesprochen zu werden: Die Erkennung läuft auf dem Nebenstrom, in der Auflösung, die die Kamera ohnehin liefert, mit fünf Bildern je Sekunde. Die Aufzeichnung läuft auf dem Hauptstrom und wird kopiert, nicht neu kodiert – die volle Auflösung landet auf der Platte, ohne dass dafür ein einziges Bild dekodiert wird. Der Detektor sieht nie 4K und muss es auch nie: Eine Person wird aus ein paar hundert Pixeln Umriss gefunden, und der Ausschnitt, den später jemand ansieht, ist der unangetastete Hauptstrom.
Woran sich Sättigung ankündigt
Frigate meldet zwei Zahlen, die die Frage entscheiden. Die Inferenzgeschwindigkeit ist die Millisekundenzahl je Erkennung; steigt sie über den Wert aus der Tabelle, drosselt der Beschleuniger – eine Coral am USB, warm genug zum Langsamerwerden, ist im geschlossenen Schrank ein vertrauter Anblick. Die Erkennungsbildrate ist die tatsächlich erreichte Rate; liegt sie unter der eingestellten, werden Bilder eingereiht und verworfen.
Von außen zeigen sich beide Störungen gleich, und zwar auf die denkbar unfreundlichste Art: Die Aufzeichnung ist da, der Zeitstrahl ist lückenlos, und am Ereignis hängt einfach kein Objekt. Nichts ist laut ausgefallen. Das Budget war vier Sekunden lang überzogen, und es waren die vier Sekunden, auf die es ankam.
Detektoren einrichten und die Zahl der Bereiche senken
In der Frigate-Konfiguration ist eine Coral ein Detektor vom Typ edgetpu; der Wert device legt fest, welches Gerät Frigate öffnet: usb für einen einzelnen USB-Stick, pci für eine einzelne M.2- oder PCIe-Karte. Ein zweiter Beschleuniger ist ein zweiter Eintrag mit Index:
detectors:
coral1:
type: edgetpu
device: pci:0
coral2:
type: edgetpu
device: pci:1
Für USB lauten die Werte entsprechend usb:0 und usb:1. Jeder Detektor läuft in einem eigenen Prozess, und alle bedienen sich aus einer gemeinsamen Warteschlange mit den Erkennungsanfragen aller Kameras. Eine feste Zuordnung von Kameras zu Beschleunigern gibt es nicht; eine zweite Coral hebt deshalb die Obergrenze der ganzen Anlage und nicht nur die einer Hälfte der Kameras. Unter Docker erscheint eine PCIe-Coral nach der Installation ihres Treibers auf dem Host als /dev/apex_0, und genau dieser Geräteknoten wird in den Container gereicht.
Der Faktor der Rechnung, den die Konfiguration senken kann, ohne Erkennungsgelegenheiten zu opfern, ist die Zahl der Bereiche je Bild. Zwei Funktionen von Frigate wirken direkt darauf.
- Bewegungsmasken decken Flächen ab, in denen Bewegung nie ein relevantes Objekt bedeutet: den eigenen Zeitstempel der Kamera, den Himmel, Baumkronen im Wind. Bewegung innerhalb einer Maske löst keine Erkennung mehr aus, diese Flächen erzeugen also keine Bereiche mehr. Ein Objekt in der maskierten Fläche wird trotzdem erkannt, wenn Bewegung an anderer Stelle im Bild die Erkennung anstößt. Zu viel Maske hat einen Preis: Ein Objekt, das in eine vollständig maskierte Fläche wandert, kann verloren gehen und wird beim Wiederauftauchen als neues Objekt verfolgt.
- Stehende Objekte gehen nicht in jedem Bild an den Detektor. Bleibt ein verfolgtes Objekt so lange nahezu an derselben Stelle, wie die Stillstandsschwelle vorgibt, ab Werk das Zehnfache der Erkennungsbildrate (50 Bilder bei 5 B/s), prüft Frigate es nur noch in jedem 50. Bild, dem voreingestellten Stillstandsintervall. Ein im Bild geparktes Auto wird dann etwa alle zehn Sekunden geprüft statt fünfmal je Sekunde, bis Bewegung am Objekt selbst die reguläre Erkennung wieder anlaufen lässt.
Beide Effekte gehören in den gemessenen Bereichsfaktor der Rechnung oben: Maßgeblich ist der Wert, der sich mit gesetzten Masken zeigt, nicht der davor.
Fragen und Antworten
Wie stark entlastet es die Coral, die Erkennungsbildrate von 5 auf 3 Bilder je Sekunde zu senken?
Im selben Verhältnis: Im Beispiel mit acht Kameras und 1,5 Bereichen je Bild werden aus 60 Inferenzen je Sekunde 36, bei 8 ms also 288 statt 480 ms/s oder 29 statt 48 Prozent einer Coral. Der Preis sind weniger Gelegenheiten, denn eine Person, die das Bild in einer Sekunde durchquert, wird dreimal geprüft statt fünfmal, und ein Objekt, das nur kurz im Bild ist, wird eher verpasst.
Woran lässt sich erkennen, ob eine Coral USB tatsächlich mit USB-3.0-Geschwindigkeit läuft?
Die blaue Buchse allein ist kein Beleg. Ein USB-2.0-Hub dazwischen, ein Verlängerungskabel ohne USB-3.0-Adern oder ein Stecker, der nicht ganz sitzt und nur die USB-2.0-Kontakte trifft, drücken den Stick auf 480 Mbit/s. Unter Linux zeigt lsusb -t die ausgehandelte Geschwindigkeit je Gerät: 5000M steht für USB 3.0, 480M für USB 2.0.
Die entscheidende Probe ist die Inferenzgeschwindigkeit, die Frigate meldet: Bei rund 8 ms läuft der Stick schnell, ein Wert um 22 ms spricht für den langsamen Anschluss. Bei Frigate in Docker kommt eine Eigenheit hinzu: Der Stick meldet sich nach dem Laden seiner Firmware mit einer anderen Kennung neu am Bus. Deshalb wird üblicherweise der ganze USB-Bus in den Container gereicht und nicht ein einzelnes Gerät.
Lässt sich die Dekodierlast, die keine Coral übernimmt, auf die Grafikeinheit verlagern?
Ja, und bei mehreren Kameras bringt das oft mehr als ein zweiter Beschleuniger. Frigate dekodiert über ffmpeg, und ffmpeg kann diese Arbeit an Hardware abgeben: bei Intel-Prozessoren über VAAPI oder Quick Sync der integrierten Grafik, bei Nvidia-Karten über NVDEC, auf manchen Einplatinenrechnern über deren eigene Dekoder. In der Konfiguration geschieht das über hwaccel_args, für die Frigate fertige Voreinstellungen mitbringt.
Zwei Punkte gehören in die Rechnung. Erstens entlastet das nur den Strom, der tatsächlich dekodiert wird, also den Nebenstrom für die Erkennung; der Hauptstrom wird ohnehin nur kopiert. Wer der Erkennung den 4K-Hauptstrom gibt, verlagert die teure Arbeit, statt sie zu vermeiden. Zweitens teilen sich Dekodierung und Erkennung dieselbe Grafikeinheit, wenn dort zugleich OpenVINO als Detektor läuft. Die rund 15 ms aus der Tabelle sind dann nicht mehr gesetzt; maßgeblich ist die Inferenzgeschwindigkeit, die Frigate unter Last meldet.