awebsite/public/de/project/airaspi-build-log/index.html

170 lines
38 KiB
HTML
Raw Normal View History

2025-10-06 18:01:45 +02:00
<!doctype html><html data-theme=light lang=de xmlns=http://www.w3.org/1999/xhtml><head><meta charset=UTF-8><meta content="Mein Portfolio, Blog und allgemeine Präsenz online" name=description><meta content="width=device-width,initial-scale=1" name=viewport><meta content=#FF7E3C name=theme-color><meta content=#CC5A26 media=(prefers-color-scheme:dark) name=theme-color><title>AIRASPI Build-Protokoll - Aron Petau</title><link href=https://aron.petau.net/de/project/airaspi-build-log/ rel=canonical><link href=https://mastodon.online/@reprintedAron rel=me><meta content=@reprintedAron@mastodon.online name=fediverse:creator><link href=/favicon/favicon-96x96.png rel=icon sizes=96x96 type=image/png><link href=/favicon/favicon.svg rel=icon type=image/svg+xml><link rel="shortcut icon" href=/favicon/favicon.ico><link href=/favicon/apple-touch-icon.png rel=apple-touch-icon sizes=180x180><meta content="Aron Petau" name=apple-mobile-web-app-title><link href=/favicon/site.webmanifest rel=manifest><link crossorigin href=https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css integrity=sha512-... referrerpolicy=no-referrer rel=stylesheet><link title="Aron Petau - Atom Feed" href=https://aron.petau.net/atom.xml rel=alternate type=application/atom+xml><style>:root{--accent-color:#ff7e3c}[data-theme=dark]{--accent-color:#cc5a26}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--accent-color:#cc5a26}}</style><link href=https://aron.petau.net/style.css rel=stylesheet><link href=https://aron.petau.net/css/timeline.css rel=stylesheet><link href=https://aron.petau.net/css/mermaid.css rel=stylesheet><link href=https://aron.petau.net/css/skills.css rel=stylesheet><link href=https://aron.petau.net/css/gallery.css rel=stylesheet><script defer src=https://aron.petau.net/closable.js></script><script defer src=https://aron.petau.net/copy-button.js></script><script data-goatcounter=https://awebsite.goatcounter.com/count defer src=https://aron.petau.net/count.js></script><script defer src=https://aron.petau.net/fuse.js></script><script defer src=https://aron.petau.net/search-fuse.js></script><script defer src=https://aron.petau.net/theme-switcher.js></script><script type=module>import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
mermaid.initialize({ startOnLoad: true });</script><meta content="Aron Petau" property=og:site_name><meta content="AIRASPI Build-Protokoll - Aron Petau" property=og:title><meta content=https://aron.petau.net/de/project/airaspi-build-log/ property=og:url><meta content="Nutzung einer Edge-TPU zum Bau eines Edge-Geräts für Bilderkennung und Objektdetektion" property=og:description><meta content=https://aron.petau.net/card.png property=og:image><meta content=de_DE property=og:locale><body><header id=site-nav><nav><a href=#main-content tabindex=0> Zum Hauptinhalt springen </a><ul><li id=home><a href=https://aron.petau.net/de/> <i class=icon></i>Aron Petau</a><li class=divider><li><a href=https://aron.petau.net/de/project/>Projekte</a><li><a href=https://aron.petau.net/de/pages/contact/>Kontakt</a><li><a href=https://aron.petau.net/de/pages/cv/>Vita</a><li><a href=https://aron.petau.net/de/pages/about/>Über mich</a><li id=search><button class=circle id=search-toggle title=Suche><i class=icon></i></button><li id=language-switcher><details class=closable><summary class=circle title=Sprache><i class=icon></i></summary> <ul><li><a href=https://aron.petau.net/project/airaspi-build-log/ lang=en>English</a></ul></details><li id=theme-switcher><details class=closable><summary class=circle title=Thema><i class=icon></i></summary> <ul><li><button title="Zum hellen Thema wechseln" class=circle id=theme-light><i class=icon></i></button><li><button title="Zum dunklen Thema wechseln" class=circle id=theme-dark><i class=icon></i></button><li><button title="Systemthema nutzen" class=circle id=theme-system><i class=icon></i></button></ul></details><li id=feed><a class=circle href=https://aron.petau.net/de/atom.xml title=Feed> <i class=icon></i> </a><li id=repo><a class=circle href=https://forgejo.petau.net/aron/awebsite title=Repository> <i class=icon></i> </a></ul></nav><div id=search-container><label class=visually-hidden for=search-bar>Suche</label><input placeholder="Suche nach…" autocomplete=off disabled id=search-bar type=search><div id=search-results-container><div id=search-results></div></div></div></header><main id=main-content><article><div id=heading><p><small> <time datetime=" 2024-01-30T00:00:00+00:00">Veröffentlicht am 30. 01. 2024</time></small><h1>AIRASPI Build-Protokoll</h1><p><small><span>Von Aron Petau</span><span></span><span>12 Minuten gelesen</span><span></span></small><ul class=tags><li><a class=tag href=https://aron.petau.net/de/tags/coral/>coral</a><li><a class=tag href=https://aron.petau.net/de/tags/docker/>docker</a><li><a class=tag href=https://aron.petau.net/de/tags/edge-tpu/>edge TPU</a><li><a class=tag href=https://aron.petau.net/de/tags/edge-computing/>edge computing</a><li><a class=tag href=https://aron.petau.net/de/tags/frigate/>frigate</a><li><a class=tag href=https://aron.petau.net/de/tags/local-ai/>local AI</a><li><a class=tag href=https://aron.petau.net/de/tags/private/>private</a><li><a class=tag href=https://aron.petau.net/de/tags/raspberry-pi/>raspberry pi</a><li><a class=tag href=https://aron.petau.net/de/tags/surveillance/>surveillance</a></ul></div><div id=buttons-container><a title="Nach Oben gehen" href=#top id=go-to-top><i class=icon></i></a><a href="https://shareopenly.org/share/?url=https://aron.petau.net/de/project/airaspi-build-log/&text=Nutzung%20einer%20Edge-TPU%20zum%20Bau%20eines%20Edge-Ger%C3%A4ts%20f%C3%BCr%20Bilderkennung%20und%20Objektdetektion" id=share title=Teilen><i class=icon></i></a><a title="Ein Issue erstellen" href=https://forgejo.petau.net/aron/awebsite/issues id=issue><i class=icon></i></a></div><h2 id=AI-Raspi_Build-Protokoll>AI-Raspi Build-Protokoll</h2><p>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.<p><strong>Projektziele:</strong><p>Bau eines Edge-Geräts mit Bilderkennung und Objektdetektion, das Video in Echtzeit verarbeite
</code></pre><h3 id=Vorbereitung_des_Systems_für_Coral_TPU>Vorbereitung des Systems für Coral TPU</h3><p>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.<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Kernel-Version prüfen
2025-05-17 17:22:24 +02:00
uname -a
2025-10-06 18:01:45 +02:00
</code></pre><pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># config.txt modifizieren
2025-05-17 17:22:24 +02:00
sudo nano /boot/firmware/config.txt
2025-10-06 18:01:45 +02:00
</code></pre><p>Während man in der Datei ist, folgende Zeilen hinzufügen:<pre class=language-config data-lang=config><code class=language-config data-lang=config>kernel=kernel8.img
2025-05-17 17:22:24 +02:00
dtparam=pciex1
dtparam=pciex1_gen=2
2025-10-06 18:01:45 +02:00
</code></pre><p>Speichern und neu starten:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>sudo reboot
</code></pre><pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Kernel-Version erneut prüfen
2025-05-17 17:22:24 +02:00
uname -a
2025-10-06 18:01:45 +02:00
</code></pre><ul><li>sollte jetzt anders sein, mit einem -v8 am Ende</ul><p>/boot/firmware/cmdline.txt bearbeiten<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>sudo nano /boot/firmware/cmdline.txt
</code></pre><ul><li>pcie_aspm=off vor rootwait hinzufügen</ul><pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>sudo reboot
</code></pre><h3 id=Modifizierung_des_Device_Tree>Modifizierung des Device Tree</h3><h4 id=Initialer_Script-Versuch_(Veraltet)>Initialer Script-Versuch (Veraltet)</h4><p>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.<blockquote class=markdown-alert-warning><p>vielleicht ist dieses Script das Problem? ich werde es ohne erneut versuchen</blockquote><pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>curl https://gist.githubusercontent.com/dataslayermedia/714ec5a9601249d9ee754919dea49c7e/raw/32d21f73bd1ebb33854c2b059e94abe7767c3d7e/coral-ai-pcie-edge-tpu-raspberrypi-5-setup | sh
</code></pre><p>Ja, es war das problematische Script. Ich habe einen Kommentar dokumentiert, der das Problem auf dem ursprünglichen Gist beschreibt: <a href="https://gist.github.com/dataslayermedia/714ec5a9601249d9ee754919dea49c7e?permalink_comment_id=4860232#gistcomment-4860232">Mein Kommentar auf dem Gist</a><h4 id=Manuelle_Device-Tree-Modifikation_(Empfohlen)>Manuelle Device-Tree-Modifikation (Empfohlen)</h4><p>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.<blockquote class=markdown-alert-note><p>In der Zwischenzeit wurde das Script aktualisiert und wird nun wieder empfohlen.</blockquote><p>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:<p><strong>1. Device Tree sichern und dekompilieren</strong><pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Aktuelles dtb sichern
2025-05-17 17:22:24 +02:00
sudo cp /boot/firmware/bcm2712-rpi-5-b.dtb /boot/firmware/bcm2712-rpi-5-b.dtb.bak
2025-10-06 18:01:45 +02:00
# Aktuelles dtb dekompilieren (Warnungen ignorieren)
2025-05-17 17:22:24 +02:00
dtc -I dtb -O dts /boot/firmware/bcm2712-rpi-5-b.dtb -o ~/test.dts
2025-10-06 18:01:45 +02:00
# Datei bearbeiten
2025-05-17 17:22:24 +02:00
nano ~/test.dts
2025-10-06 18:01:45 +02:00
# Zeile ändern: msi-parent = &lt;0x2f>; (unter `pcie@110000`)
# Zu: msi-parent = &lt;0x66>;
# Dann Datei speichern.
2025-05-17 17:22:24 +02:00
2025-10-06 18:01:45 +02:00
# dtb rekompilieren und zurück ins Firmware-Verzeichnis verschieben
2025-05-17 17:22:24 +02:00
dtc -I dts -O dtb ~/test.dts -o ~/test.dtb
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
2025-10-06 18:01:45 +02:00
# Neustart für Änderungen
sudo reboot
</code></pre><blockquote class=markdown-alert-note><p>Hinweis: msi-parent scheint heutzutage den Wert &lt;0x2c> zu haben, hat mich ein paar Stunden gekostet.</blockquote><p><strong>2. Änderungen verifizieren</strong><p>Nach dem Neustart prüfen, dass die Coral TPU vom System erkannt wird:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>lspci -nn | grep 089a
</code></pre><p>Die Ausgabe sollte ähnlich sein: <code>0000:01:00.0 System peripheral [0880]: Global Unichip Corp. Coral Edge TPU [1ac1:089a]</code><h3 id=Installation_des_Apex-Treibers>Installation des Apex-Treibers</h3><p>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.<p>Gemäß den offiziellen Anweisungen von <a href=https://coral.ai/docs/m2/get-started#2a-on-linux>coral.ai</a>:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
2025-05-17 17:22:24 +02:00
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install gasket-dkms libedgetpu1-std
sudo sh -c "echo 'SUBSYSTEM==\"apex\", MODE=\"0660\", GROUP=\"apex\"' >> /etc/udev/rules.d/65-apex.rules"
sudo groupadd apex
sudo adduser $USER apex
2025-10-06 18:01:45 +02:00
sudo reboot
</code></pre><p>Diese Sequenz:<ol><li>Fügt Googles Paket-Repository und GPG-Schlüssel hinzu<li>Installiert das gasket DKMS-Modul (Kernel-Treiber) und Edge-TPU-Runtime-Bibliothek<li>Erstellt udev-Regeln für Geräteberechtigungen<li>Erstellt eine <code>apex</code>-Gruppe und fügt den Benutzer hinzu<li>Neustart zum Laden des Treibers</ol><p>Nach dem Neustart Installation verifizieren:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>lspci -nn | grep 089a
</code></pre><p>Dies sollte die verbundene Coral TPU als PCIe-Gerät anzeigen.<p>Als Nächstes bestätigen, dass der Device-Node mit entsprechenden Berechtigungen existiert:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>ls -l /dev/apex_0
</code></pre><p>Wenn die Ausgabe <code>/dev/apex_0</code> mit entsprechenden Gruppenberechtigungen zeigt, war die Installation erfolgreich. Falls nicht, udev-Regeln und Gruppenzugehörigkeit überprüfen.<h3 id=Testen_mit_Beispielmodellen>Testen mit Beispielmodellen</h3><p>Um zu verifizieren, dass die TPU korrekt funktioniert, verwenden wir Googles Beispiel-Klassifizierungsskript mit einem vortrainierten MobileNet-Modell:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Python-Pakete installieren
sudo apt-get install python3-pycoral
# Beispiel-Code und Modelle herunterladen
mkdir -p ~/coral && cd ~/coral
git clone https://github.com/google-coral/pycoral.git
cd pycoral
# Vogel-Klassifizierungsbeispiel ausführen
python3 examples/classify_image.py \
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels test_data/inat_bird_labels.txt \
--input test_data/parrot.jpg
</code></pre><p>Die Ausgabe sollte Inferenz-Ergebnisse mit Konfidenzwerten zeigen, was bestätigt, dass die Edge TPU korrekt funktioniert.<h3 id=Docker-Installation>Docker-Installation</h3><p>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.<p>Docker mit dem offiziellen Convenience-Script von <a href=https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script>docker.com</a> installieren:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>curl -fsSL https://get.docker.com -o get-docker.sh
2025-05-17 17:22:24 +02:00
sudo sh get-docker.sh
sudo usermod -aG docker $USER
2025-10-06 18:01:45 +02:00
</code></pre><p>Nach der Installation ab- und wieder anmelden, damit Änderungen der Gruppenzugehörigkeit wirksam werden.<p>Docker so konfigurieren, dass es automatisch beim Booten startet:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>sudo systemctl enable docker.service
2025-05-17 17:22:24 +02:00
sudo systemctl enable containerd.service
2025-10-06 18:01:45 +02:00
</code></pre><h3 id=Edge_TPU_testen_(Optional)>Edge TPU testen (Optional)</h3><p>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.<p>Test-Verzeichnis und Dockerfile erstellen:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>mkdir coraltest
2025-05-17 17:22:24 +02:00
cd coraltest
sudo nano Dockerfile
2025-10-06 18:01:45 +02:00
</code></pre><p>In die neue Datei einfügen:<pre class=language-Dockerfile data-lang=Dockerfile><code class=language-Dockerfile data-lang=Dockerfile>FROM debian:10
2025-05-17 17:22:24 +02:00
WORKDIR /home
ENV HOME /home
RUN cd ~
RUN apt-get update
RUN apt-get install -y git nano python3-pip python-dev pkg-config wget usbutils curl
RUN echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" \
| tee /etc/apt/sources.list.d/coral-edgetpu.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN apt-get update
RUN apt-get install -y edgetpu-examples
2025-10-06 18:01:45 +02:00
RUN apt-get install libedgetpu1-std
CMD /bin/bash
</code></pre><p>Test-Container bauen und ausführen, Coral-Gerät durchreichen:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Docker-Container bauen
2025-05-17 17:22:24 +02:00
docker build -t "coral" .
2025-10-06 18:01:45 +02:00
# Docker-Container ausführen
2025-05-17 17:22:24 +02:00
docker run -it --device /dev/apex_0:/dev/apex_0 coral /bin/bash
2025-10-06 18:01:45 +02:00
</code></pre><p>Innerhalb des Containers ein Inferenz-Beispiel ausführen:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh># Inferenz-Beispiel innerhalb des Containers ausführen
2025-05-17 17:22:24 +02:00
python3 /usr/share/edgetpu/examples/classify_image.py --model /usr/share/edgetpu/examples/models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --label /usr/share/edgetpu/examples/models/inat_bird_labels.txt --image /usr/share/edgetpu/examples/images/bird.bmp
2025-10-06 18:01:45 +02:00
</code></pre><p>Man sollte Inferenz-Ergebnisse mit Konfidenzwerten von der Edge TPU sehen. Falls nicht, einen sauberen Neustart des Systems versuchen.<h3 id=Portainer_(Optional)>Portainer (Optional)</h3><p>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.<blockquote class=markdown-alert-note><p>Dies ist optional, gibt einem eine Browser-GUI für die verschiedenen Docker-Container.</blockquote><p>Portainer installieren:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>docker volume create portainer_data
2025-05-17 17:22:24 +02:00
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
2025-10-06 18:01:45 +02:00
</code></pre><p>Portainer im Browser aufrufen und Admin-Passwort setzen:<ul><li>Navigieren zu: <a href=https://airaspi.local:9443>https://airaspi.local:9443</a></ul><h3 id=VNC-Setup_(Optional)>VNC-Setup (Optional)</h3><p>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.<blockquote class=markdown-alert-note><p>Dies ist optional, nützlich zum Testen der Kameras auf dem Headless-Gerät. Man könnte einen Monitor anschließen, aber ich finde VNC bequemer.</blockquote><p>VNC über das Raspberry Pi Konfigurationstool aktivieren:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>sudo raspi-config
</code></pre><p>Navigieren zu: <strong>Interface Options</strong><strong>VNC</strong><strong>Enable</strong><h3 id=Verbindung_über_VNC_Viewer>Verbindung über VNC Viewer</h3><p><a href=https://www.realvnc.com/en/connect/download/viewer/>RealVNC Viewer</a> auf dem Computer installieren (verfügbar für macOS, Windows und Linux).<p>Mit der Adresse verbinden: <code>airaspi.local:5900</code><p>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.<h2 id=Frigate_NVR_Setup>Frigate NVR Setup</h2><p>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.<h3 id=Docker_Compose_Konfiguration>Docker Compose Konfiguration</h3><p>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.<blockquote class=markdown-alert-important><p>Wichtig: Die Pfade müssen auf die eigenen Pfade angepasst werden.</blockquote><pre class=language-yaml data-lang=yaml><code class=language-yaml data-lang=yaml>version: "3.9"
2025-05-17 17:22:24 +02:00
services:
frigate:
container_name: frigate
2025-10-06 18:01:45 +02:00
privileged: true # dies ist möglicherweise nicht für alle Setups notwendig
2025-05-17 17:22:24 +02:00
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
2025-10-06 18:01:45 +02:00
shm_size: "64mb" # für Kameras basierend auf obiger Berechnung aktualisieren
2025-05-17 17:22:24 +02:00
devices:
2025-10-06 18:01:45 +02:00
- /dev/apex_0:/dev/apex_0 # reicht PCIe Coral durch, Treiberanweisungen hier folgen https://coral.ai/docs/m2/get-started/#2a-on-linux
2025-05-17 17:22:24 +02:00
volumes:
- /etc/localtime:/etc/localtime:ro
2025-10-06 18:01:45 +02:00
- /home/aron/frigate/config.yml:/config/config.yml # durch eigene Config-Datei ersetzen
- /home/aron/frigate/storage:/media/frigate # durch eigenes Storage-Verzeichnis ersetzen
- type: tmpfs # Optional: 1GB Speicher, reduziert SSD/SD-Karten-Verschleiß
2025-05-17 17:22:24 +02:00
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "5000:5000"
- "8554:8554" # RTSP feeds
2025-10-06 18:01:45 +02:00
- "8555:8555/tcp" # WebRTC über tcp
- "8555:8555/udp" # WebRTC über udp
2025-05-17 17:22:24 +02:00
environment:
FRIGATE_RTSP_PASSWORD: "******"
2025-10-06 18:01:45 +02:00
</code></pre><p>Wichtige Konfigurationspunkte in dieser Docker-Compose-Datei:<ul><li><strong>Privileged-Modus</strong> und <strong>Device-Mappings</strong>: Erforderlich für Hardwarezugriff (TPU, Kameras)<li><strong>Shared Memory Size</strong>: Zugewiesen für effiziente Video-Frame-Verarbeitung<li><strong>Port-Mappings</strong>: Macht Frigate's Web-UI (5000) und RTSP-Streams (8554) zugänglich<li><strong>Volume-Mounts</strong>: Persistiert Aufnahmen, Konfiguration und Datenbank</ul><h3 id=Frigate-Konfigurationsdatei>Frigate-Konfigurationsdatei</h3><p>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. <code>/home/aron/frigate/config.yml</code>).<blockquote class=markdown-alert-note><p>Dies ist nur einmal notwendig. Danach kann man die Konfiguration in der GUI ändern.</blockquote><p>Hier ist eine funktionierende Konfiguration mit der Coral TPU:<pre class=language-yaml data-lang=yaml><code class=language-yaml data-lang=yaml>mqtt:
2025-05-17 17:22:24 +02:00
enabled: False
detectors:
cpu1:
type: cpu
num_threads: 3
coral_pci:
type: edgetpu
device: pci
cameras:
2025-10-06 18:01:45 +02:00
cam1: # &lt;++++++ Kamera benennen
2025-05-17 17:22:24 +02:00
ffmpeg:
hwaccel_args: preset-rpi-64-h264
inputs:
- path: rtsp://192.168.1.58:8900/cam1
roles:
- detect
2025-10-06 18:01:45 +02:00
cam2: # &lt;++++++ Kamera benennen
2025-05-17 17:22:24 +02:00
ffmpeg:
hwaccel_args: preset-rpi-64-h264
inputs:
- path: rtsp://192.168.1.58:8900/cam2
roles:
- detect
detect:
2025-10-06 18:01:45 +02:00
enabled: True # &lt;+++- Detektion deaktivieren bis funktionierende Kamera-Feeds vorhanden
width: 1280 # &lt;+++- für Kameraauflösung aktualisieren
height: 720 # &lt;+++- für Kameraauflösung aktualisieren
</code></pre><p>Diese Konfiguration:<ul><li><strong>Deaktiviert MQTT</strong>: Vereinfacht Setup für rein lokalen Betrieb<li><strong>Definiert zwei Detektoren</strong>: Einen Coral-TPU-Detektor (<code>coral</code>) und einen CPU-Fallback<li><strong>Verwendet Standard-Detektionsmodell</strong>: Frigate enthält ein vortrainiertes Modell<li><strong>Konfiguriert zwei Kameras</strong>: Beide auf 1280x720-Auflösung eingestellt<li><strong>Verwendet Hardware-Beschleunigung</strong>: <code>preset-rpi-64-h264</code> für Raspberry Pi 5<li><strong>Detektionszonen</strong>: Nur aktivieren, wenn Kamera-Feeds ordnungsgemäß funktionieren</ul><h2 id=MediaMTX_Setup>MediaMTX Setup</h2><p>MediaMTX ist ein Echtzeit-Medienserver, der das Streaming von den Raspberry-Pi-Kameras zu Frigate handhabt. Es ist notwendig, weil Frigate <code>libcamera</code> (den modernen Raspberry Pi Kamera-Stack) nicht direkt unterstützt.<p>MediaMTX direkt auf dem System installieren (nicht via Docker - die Docker-Version hat Kompatibilitätsprobleme mit libcamera).<blockquote class=markdown-alert-warning><p>Chip-Architektur beim Download doppelt prüfen - dies verursachte mir erhebliche Kopfschmerzen beim Setup.</blockquote><p>MediaMTX herunterladen und installieren:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>mkdir mediamtx
2025-05-17 17:22:24 +02:00
cd mediamtx
wget https://github.com/bluenviron/mediamtx/releases/download/v1.5.0/mediamtx_v1.5.0_linux_arm64v8.tar.gz
tar xzvf mediamtx_v1.5.0_linux_arm64v8.tar.gz && rm mediamtx_v1.5.0_linux_arm64v8.tar.gz
2025-10-06 18:01:45 +02:00
</code></pre><h3 id=MediaMTX-Konfiguration>MediaMTX-Konfiguration</h3><p>Die <code>mediamtx.yml</code>-Datei bearbeiten, um Kamera-Streams zu konfigurieren. Die untenstehende Konfiguration verwendet <code>rpicam-vid</code> (Raspberry Pis modernes Kamera-Tool), das durch FFmpeg geleitet wird, um RTSP-Streams zu erstellen.<p>Folgendes zum <code>paths</code>-Abschnitt in <code>mediamtx.yml</code> hinzufügen:<pre class=language-yaml data-lang=yaml><code class=language-yaml data-lang=yaml>paths:
2025-05-17 17:22:24 +02:00
cam1:
runOnInit: bash -c 'rpicam-vid -t 0 --camera 0 --nopreview --codec yuv420 --width 1280 --height 720 --inline --listen -o - | ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 1280x720 -i /dev/stdin -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH'
runOnInitRestart: yes
cam2:
runOnInit: bash -c 'rpicam-vid -t 0 --camera 1 --nopreview --codec yuv420 --width 1280 --height 720 --inline --listen -o - | ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 1280x720 -i /dev/stdin -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH'
runOnInitRestart: yes
2025-10-06 18:01:45 +02:00
</code></pre><p>Diese Konfiguration:<ul><li><strong><code>cam1</code> und <code>cam2</code></strong>: Definieren zwei Kamerapfade<li><strong><code>rpicam-vid</code></strong>: Erfasst YUV420-Video von Raspberry-Pi-Kameras<li><strong><code>ffmpeg</code></strong>: Transkodiert das Rohvideo zu H.264-RTSP-Stream<li><strong><code>runOnInitRestart: yes</code></strong>: Startet Stream automatisch neu, falls er fehlschlägt</ul><h3 id=Port-Konfiguration>Port-Konfiguration</h3><p>Standard-RTSP-Port ändern, um Konflikte mit Frigate zu vermeiden:<p>In <code>mediamtx.yml</code> ändern:<pre class=language-yaml data-lang=yaml><code class=language-yaml data-lang=yaml>rtspAddress: :8554
</code></pre><p>Zu:<pre class=language-yaml data-lang=yaml><code class=language-yaml data-lang=yaml>rtspAddress: :8900
</code></pre><p>Sonst gibt es einen Port-Konflikt mit Frigate.<h3 id=MediaMTX_starten>MediaMTX starten</h3><p>MediaMTX im Vordergrund ausführen, um zu verifizieren, dass es funktioniert:<pre class=language-zsh data-lang=zsh><code class=language-zsh data-lang=zsh>./mediamtx
</code></pre><p>Wenn keine Fehler auftreten, Streams mit VLC oder einem anderen RTSP-Client verifizieren:<ul><li><code>rtsp://airaspi.local:8900/cam1</code><li><code>rtsp://airaspi.local:8900/cam2</code></ul><p>Hinweis: Standard-RTSP-Port ist 8554, aber wir haben ihn in der Konfiguration auf 8900 geändert.<h2 id=Aktueller_Status_und_Performance>Aktueller Status und Performance</h2><h3 id=Was_funktioniert>Was funktioniert</h3><p>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.<p>Laut Frigate-Dokumentation kann die TPU bis zu 10 Kameras handhaben, es gibt also erheblichen Spielraum für Erweiterung.<h3 id=Aktuelle_Probleme>Aktuelle Probleme</h3><p>Es gibt jedoch mehrere signifikante Probleme, die das System behindern:<p><strong>1. Frigate Display-Limitierungen</strong><p>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.<p><strong>2. Stream-Stabilitätsprobleme</strong><p>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.<p><strong>3. Coral-Software-Aufgabe</strong><p>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.<p>Speziell scheint <code>pycoral</code> 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.<p>Dies schränkt die Fähigkeit, moderne Software und Bibliotheken mit dem System zu nutzen, erheblich ein.<h2 id=Reflexionen_und_Lessons_Learned>Reflexionen und Lessons Learned</h2><h3 id=Hardware-Entscheidungen>Hardware-Entscheidungen</h3><p><strong>Die M.2 E Key-Wahl</strong><p>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.<p>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.<h2 id=Zukünftige_Entwicklung>Zukünftige Entwicklung</h2><p>Mehrere Verbesserungen und Experimente sind geplant, um dieses System zu erweitern:<p><strong>Dokumentation und visuelle Hilfsmittel</strong><ul><li>Bilder und Screenshots zu diesem Build-Protokoll hinzufügen, um es einfacher nachzuvollziehen</ul><p><strong>Mobile-Stream-Integration</strong><ul><li>Prüfen, ob <a href=https://vdo.ninja>vdo.ninja</a> ein praktikabler Weg ist, mobile Streams hinzuzufügen, um Smartphone-Kamera-Integration und -Evaluierung zu ermöglichen</ul><p><strong>MediaMTX libcamera-Unterstützung</strong><ul><li>Die MediaMTX-Entwickler*innen bezüglich libcamera-Unterstützung kontaktieren, was den aktuellen <code>rpicam-vid</code>-Workaround eliminieren würde. Ich vermute, dass in der aktuellen Pipeline einiges an Performance verloren geht.</ul><p><strong>Frigate-Konfigurationsverfeinerung</strong><ul><li>Die Frigate-Konfiguration optimieren, um Snapshots zu aktivieren und möglicherweise eine Bild-/Videodatenbank zum späteren Training benutzerdefinierter Modelle aufzubauen</ul><p><strong>Speichererweiterung</strong><ul><li>Sich um das Anbringen einer externen SSD kümmern und die Videodateien darauf für Langzeitspeicherung und -analyse speichern</ul><p><strong>Datenexport-Fähigkeiten</strong><ul><li>Einen Weg finden, die Landmarkenpunkt