Dieses Dokument dokumentiert den Prozess des Baus eines maßgeschneiderten Edge-Computing-Geräts für Echtzeit-Bilderkennung und Objektdetektion. Das Ziel war es, ein portables, eigenständiges System zu schaffen, das unabhängig von Cloud-Infrastruktur funktionieren kann.
Bau eines Edge-Geräts mit Bilderkennung und Objektdetektion, das Video in Echtzeit verarbeiten kann, mit dem Ziel von 30fps bei 720p-Auflösung. Portabilität und autonomer Betrieb sind kritische Anforderungen—das Gerät muss ohne aktive Internetverbindung funktionieren und einen kompakten Formfaktor für Installationsumgebungen beibehalten. Alle Berechnungen finden lokal auf dem Gerät selbst statt, was es zu einer echten Edge-Computing-Lösung ohne Cloud-Abhängigkeit macht.
Dieses Projekt wurde inspiriert von [pose2art](https://github.com/MauiJerry/Pose2Art), das das kreative Potenzial der Echtzeit-Posenerkennung für interaktive Installationen demonstrierte.
Dieser Build wäre ohne die exzellente Dokumentation und Troubleshooting-Anleitungen aus der Community nicht möglich gewesen. Die Hauptquellen, auf die ich mich während dieses Projekts verlassen habe, waren:
Ich habe den Raspberry Pi Imager verwendet, um das neueste Raspberry Pi OS auf eine SD-Karte zu flashen. Die OS-Wahl ist kritisch für die Kamerakompatibilität.
- Verwendung des Standard-arm64-Images (mit Desktop) - kritisch für Kameratreiber-Kompatibilität
- Aktivierung benutzerdefinierter Einstellungen für Headless-Betrieb
- Aktivierung von SSH für Fernzugriff
- Konfiguration des WiFi-Ländercodes für rechtliche Compliance
- Festlegung von WiFi-SSID und Passwort für automatische Netzwerkverbindung
- Konfiguration der Locale-Einstellungen für richtige Zeitzone und Tastaturlayout
- Festlegung eines benutzerdefinierten Hostnamens: `airaspi` für einfache Netzwerkidentifikation
### System-Update
Nach dem ersten Boot ist das Aktualisieren des Systems unerlässlich. Dieser Prozess kann mit dem vollständigen Desktop-Image beträchtliche Zeit in Anspruch nehmen, stellt aber sicher, dass alle Pakete aktuell sind und Sicherheitspatches angewendet werden.
Die PCIe-Schnittstelle des Raspberry Pi 5 erfordert eine spezifische Konfiguration, um mit der Coral Edge TPU zu funktionieren. Dieser Abschnitt war technisch am anspruchsvollsten und umfasste Kernel-Modifikationen und Device-Tree-Änderungen. Ein großes Dankeschön an Jeff Geerling für die Dokumentation dieses Prozesses—ohne sein detailliertes Troubleshooting wäre dies nahezu unmöglich gewesen.
Anfangs gab es ein automatisiertes Script, das die Device-Tree-Modifikationen handhaben sollte. Jedoch erwies sich dieses Script als problematisch und verursachte Probleme während meines Builds.
curl https://gist.githubusercontent.com/dataslayermedia/714ec5a9601249d9ee754919dea49c7e/raw/32d21f73bd1ebb33854c2b059e94abe7767c3d7e/coral-ai-pcie-edge-tpu-raspberrypi-5-setup | sh
Ja, es war das problematische Script. Ich habe einen Kommentar dokumentiert, der das Problem auf dem ursprünglichen Gist beschreibt:
[Mein Kommentar auf dem Gist](https://gist.github.com/dataslayermedia/714ec5a9601249d9ee754919dea49c7e?permalink_comment_id=4860232#gistcomment-4860232)
Anstatt mich auf das automatisierte Script zu verlassen, folgte ich Jeff Geerlings manuellem Ansatz. Diese Methode gibt vollständige Kontrolle über den Prozess und hilft zu verstehen, was tatsächlich unter der Haube passiert.
Der Device-Tree-Modifikationsprozess umfasst das Sichern des aktuellen Device-Tree-Blobs (DTB), das Dekompilieren in ein lesbares Format, das Bearbeiten der MSI-Parent-Referenz zur Behebung von PCIe-Kompatibilitätsproblemen und dann das Zurückkompilieren in Binärformat. Hier ist der schrittweise Prozess:
Nach dem Neustart prüfen, dass die Coral TPU vom System erkannt wird:
```zsh
lspci -nn | grep 089a
```
Die Ausgabe sollte ähnlich sein: `0000:01:00.0 System peripheral [0880]: Global Unichip Corp. Coral Edge TPU [1ac1:089a]`
### Installation des Apex-Treibers
Mit dem ordnungsgemäß konfigurierten Device Tree ist der nächste Schritt die Installation von Googles Apex-Treiber für die Coral Edge TPU. Dieser Treiber ermöglicht die Kommunikation zwischen Betriebssystem und TPU-Hardware.
Gemäß den offiziellen Anweisungen von [coral.ai](https://coral.ai/docs/m2/get-started#2a-on-linux):
Wenn die Ausgabe `/dev/apex_0` mit entsprechenden Gruppenberechtigungen zeigt, war die Installation erfolgreich. Falls nicht, udev-Regeln und Gruppenzugehörigkeit überprüfen.
### Testen mit Beispielmodellen
Um zu verifizieren, dass die TPU korrekt funktioniert, verwenden wir Googles Beispiel-Klassifizierungsskript mit einem vortrainierten MobileNet-Modell:
Docker bietet Containerisierung für die Anwendungen, die wir ausführen werden (Frigate, MediaMTX, etc.). Dies hält Abhängigkeiten isoliert und macht das Deployment wesentlich sauberer.
Docker mit dem offiziellen Convenience-Script von [docker.com](https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script) installieren:
Um zu verifizieren, dass die Edge TPU innerhalb eines Docker-Containers funktioniert, können wir ein Test-Image bauen. Dies ist besonders nützlich, wenn man plant, die TPU mit containerisierten Anwendungen zu nutzen.
Portainer bietet eine webbasierte GUI für die Verwaltung von Docker-Containern, Images und Volumes. Obwohl nicht erforderlich, macht es das Container-Management deutlich komfortabler.
VNC bietet Remote-Desktop-Zugriff auf den Headless-Raspberry Pi. Dies ist besonders nützlich zum Testen von Kameras und Debuggen von visuellen Problemen, ohne einen physischen Monitor anzuschließen.
Man wird nach Benutzernamen und Passwort des Raspberry Pi gefragt. Nach der Verbindung hat man vollen Remote-Desktop-Zugriff zum Testen von Kameras und Debuggen.
Frigate ist ein vollständiger Network Video Recorder (NVR) mit Echtzeit-Objektdetektion, angetrieben von der Coral Edge TPU. Es ist das Herzstück dieses Edge-AI-Systems.
### Docker Compose Konfiguration
Dieses Setup verwendet Docker Compose, um den Frigate-Container mit allen notwendigen Konfigurationen zu definieren. Wenn man Portainer verwendet, kann man dies als Custom Stack hinzufügen.
> [!IMPORTANT]
> Wichtig: Die Pfade müssen auf die eigenen Pfade angepasst werden.
Frigate benötigt eine YAML-Konfigurationsdatei, um Kameras, Detektoren und Detektionszonen zu definieren. Diese Datei am Pfad erstellen, der in der docker-compose-Datei angegeben wurde (z.B. `/home/aron/frigate/config.yml`).
> [!NOTE]
> Dies ist nur einmal notwendig. Danach kann man die Konfiguration in der GUI ändern.
Hier ist eine funktionierende Konfiguration mit der Coral TPU:
MediaMTX ist ein Echtzeit-Medienserver, der das Streaming von den Raspberry-Pi-Kameras zu Frigate handhabt. Es ist notwendig, weil Frigate `libcamera` (den modernen Raspberry Pi Kamera-Stack) nicht direkt unterstützt.
Die `mediamtx.yml`-Datei bearbeiten, um Kamera-Streams zu konfigurieren. Die untenstehende Konfiguration verwendet `rpicam-vid` (Raspberry Pis modernes Kamera-Tool), das durch FFmpeg geleitet wird, um RTSP-Streams zu erstellen.
Wenn keine Fehler auftreten, Streams mit VLC oder einem anderen RTSP-Client verifizieren:
-`rtsp://airaspi.local:8900/cam1`
-`rtsp://airaspi.local:8900/cam2`
Hinweis: Standard-RTSP-Port ist 8554, aber wir haben ihn in der Konfiguration auf 8900 geändert.
## Aktueller Status und Performance
### Was funktioniert
Das System streamt erfolgreich von beiden Kameras mit 30fps und 720p-Auflösung. Die Coral Edge TPU führt Objektdetektion mit minimaler Latenz durch - die TPU selbst kommt nicht ins Schwitzen und behält durchgehend hohe Performance bei.
Laut Frigate-Dokumentation kann die TPU bis zu 10 Kameras handhaben, es gibt also erheblichen Spielraum für Erweiterung.
### Aktuelle Probleme
Es gibt jedoch mehrere signifikante Probleme, die das System behindern:
**1. Frigate Display-Limitierungen**
Frigate begrenzt die Display-FPS auf 5, was deprimierend anzusehen ist, besonders da die TPU nicht einmal ins Schwitzen kommt. Die Hardware ist eindeutig zu viel mehr fähig, aber Software-Limitierungen halten sie zurück.
**2. Stream-Stabilitätsprobleme**
Der Stream ist völlig unberechenbar und droppt ständig Frames. Ich habe manchmal Detektions-FPS von nur 0,2 beobachtet, aber die TPU-Geschwindigkeit sollte definitiv nicht der Flaschenhals sein. Eine mögliche Lösung könnte sein, die Kameras an ein separates Gerät anzuschließen und von dort zu streamen.
**3. Coral-Software-Aufgabe**
Das größte Problem ist, dass Google das Coral-Ökosystem scheinbar aufgegeben hat, obwohl sie gerade neue Hardware dafür veröffentlicht haben. Ihr aktuellster Python-Build unterstützt nur Python 3.9.
Speziell scheint `pycoral` das Problem zu sein - ohne ein ordentliches Update bin ich auf Debian 10 mit Python 3.7.3 beschränkt. Das ist mies. Es gibt Custom-Wheels, aber nichts, das plug-and-play zu sein scheint.
Dies schränkt die Fähigkeit, moderne Software und Bibliotheken mit dem System zu nutzen, erheblich ein.
## Reflexionen und Lessons Learned
### Hardware-Entscheidungen
**Die M.2 E Key-Wahl**
Die Entscheidung, die M.2 E Key-Version zu nehmen, um Geld zu sparen, anstatt mehr für die USB-Version auszugeben, war ein riesiger Fehler. Bitte tu dir selbst einen Gefallen und gib die zusätzlichen 40 Euro aus.
Technisch ist sie wahrscheinlich schneller und besser für Dauerbetrieb, aber ich habe den Vorteil davon noch nicht gespürt. Die USB-Version hätte wesentlich mehr Flexibilität und einfacheres Debugging geboten.
## Zukünftige Entwicklung
Mehrere Verbesserungen und Experimente sind geplant, um dieses System zu erweitern:
**Dokumentation und visuelle Hilfsmittel**
- Bilder und Screenshots zu diesem Build-Protokoll hinzufügen, um es einfacher nachzuvollziehen
**Mobile-Stream-Integration**
- Prüfen, ob [vdo.ninja](https://vdo.ninja) ein praktikabler Weg ist, mobile Streams hinzuzufügen, um Smartphone-Kamera-Integration und -Evaluierung zu ermöglichen
**MediaMTX libcamera-Unterstützung**
- Die MediaMTX-Entwickler*innen bezüglich libcamera-Unterstützung kontaktieren, was den aktuellen `rpicam-vid`-Workaround eliminieren würde. Ich vermute, dass in der aktuellen Pipeline einiges an Performance verloren geht.
- Die Frigate-Konfiguration optimieren, um Snapshots zu aktivieren und möglicherweise eine Bild-/Videodatenbank zum späteren Training benutzerdefinierter Modelle aufzubauen
- Einen Weg finden, die Landmarkenpunkte von Frigate zu exportieren, möglicherweise via OSC (wie in meinem [pose2art](/project/pose2art/)-Projekt) für kreative Anwendungen zu senden
- Einen anderen HAT finden, der Zugriff auf die andere TPU ermöglicht - ich habe die Dual-Version, kann aber aufgrund von Hardware-Einschränkungen derzeit nur auf 1 der 2 TPUs zugreifen