ROCK 5 AIO Starter Anleitung
Die KI-Bildverarbeitung ist technisch.
Einer der sich abzeichnenden Anwendungsfälle für KI ist die Erkennung signifikanter Ereignisse, die in Videomedienströmen zur weiteren Analyse erfasst werden. Beispiele hierfür sind die Erkennung von Nummernschildern sowie die Erkennung und Identifizierung von Eindringlingen.
Die Umsetzung dieser Anwendungen erfordert in der Regel die Integration von Kamerafeeds mit Cloud-Diensten und eine komplexe KI-Modellierung, was sowohl teuer als auch technisch anspruchsvoll ist.
ROCK 5AIO ist ein neuer SBC mit einer 3-Top-NPU, der entwickelt wurde, um einen Teil dieser Komplexität zu beseitigen, indem er die KI-Bildverarbeitung an den "Rand" bringt. Er wird mit einem Debian-Betriebssystem und Medienverarbeitungssoftware ausgeliefert, um die Erstellung von Bildverarbeitungspipelines mit vorkonfigurierten KI-Modellen zu vereinfachen, die jeder verwenden kann.
In diesem Projekt zeigen wir, wie man den ROCK 5AIO einrichtet, ihn mit der OStream Management Web UI verbindet und "Drag & Drop" Bildverarbeitungspipelines erstellt, die Ereignisse in Videoströmen identifizieren können. Außerdem konfigurieren wir einen RTSP (Real Time Streaming Protocol) Kamera-Feed mit einem Raspberry Pi Kameramodul und zeigen, wie man die Erfassung von Ereignisdaten mit dem Webhook-Service in OStream für die weitere Verarbeitung testet.
Schwierigkeitsgrad: Mittel
Zeit: 4 Stunden
Schritte: 11
Lizenz: Flask - BSD-3-Clause license
Benötigte Teile
Teil | Beschreibung | RS Teile-Nr. |
---|---|---|
ROCK 5 AIO | Edge AI Media Board | (267-4908) |
USB-C Power supply (5V / 3A) | OKdo Multihead Dual Port USB Quick Charge Power Supply (PSU) 36W with USB-C | (243-6356) |
USB-C to USB-C Cable | DELTACO USB-C to USB-C Cable | (276-7733) |
Raspberry Pi 4 | OKdo Raspberry Pi 4 4GB Model B Starter Kit | (202-0644) |
Camera | Raspberry Pi camera module V2 | (913-2664) |
PC | Host computer Windows/Mac/Linux |
Schritt 1: OStream Director
Bevor Sie Ihren ROCK 5AIO anschließen, erstellen Sie ein OStream Director-Konto. Dies ist eine Web-UI-Anwendung zur Verwaltung und Steuerung Ihres ROCK 5AIO.
Kostenloser Account: https://app.ostream.com und einfach hier eintragen:
Nach der Anmeldung werden Sie zur Startseite der Anwendung weitergeleitet, wo Sie alle Ihre ROCK 5AIO-Verbindungen verwalten und Ihre Bildverarbeitungspipelines erstellen können.
Schritt 2: ROCK 5AIO anschalten
Jetzt ist es an der Zeit, Ihr ROCK 5AIO einzuschalten. Das ist ganz einfach, denn es müssen keine SD-Karten geflasht oder Software heruntergeladen werden. Das Debian-Betriebssystem ist auf dem integrierten 16-GB-eMMC-Speicher vorinstalliert, sodass Sie es nur noch einschalten müssen:
Schließen Sie ein Ethernet-Kabel an den RJ45-Anschluss an. Das Gerät unterstützt auch 48V POE, wenn Sie dies zur Verfügung haben.
Schließen Sie ein 5V / 3A-Netzteil über ein USB-C-Kabel an den USB-Anschluss neben der RJ45-Buchse an.
Die blaue LED-Statusanzeige leuchtet auf und nach 1 - 2 Minuten ist das Board hochgefahren.
Schritt 3: Verbinden
Sobald Ihr ROCK 5AIO hochgefahren ist, können Sie es an Ihr OStream anschließen, wo es als Node bezeichnet wird. Jedem Board liegt eine Karte bei, auf der die eindeutige Seriennummer des Boards aufgeführt ist, die Sie für diesen Schritt benötigen:
Klicken Sie in der Menüleiste von OStream auf Join Node
Geben Sie die Seriennummer von der Karte in das Feld ein
Klicken Sie auf Find Node
Ihre Karte sollte nun in der Knotenliste aufgeführt sein. Ihr Aktivierungs- und Online-Status ist durch ein grünes Häkchen gekennzeichnet, das anzeigt, dass sie verbunden ist.
Vergewissern Sie sich, dass die Firmware Ihrer Karte bei der ersten Verbindung auf dem neuesten Stand ist:
Klicken Sie auf das Symbol "Bearbeiten" für Ihren Knoten und wählen Sie die Registerkarte "Status".
Prüfen Sie, ob die Software-Version die neueste ist (1053)
Wenn nicht, geben Sie die Versionsnummer ein, klicken Sie auf Upgrade Agent und warten Sie 1 Minute.
Nachdem Sie die Meldung Execute OK erhalten haben, klicken Sie auf Reboot Host
Klicken Sie nach 2 Minuten auf die Registerkarte "Status", bis der Knoten wieder im Menü "Knotenliste" angezeigt wird.
Schritt 4: SSH Access
Der Fernzugriff über SSH ist nützlich für Tests und Fehlersuche. Ermitteln Sie den Hostnamen und die IP-Adresse Ihres ROCK 5AIO über die Konsole Ihres Netzwerkrouters.
Der Hostname für mein Board war ocom-cecaf1 mit dem Standardbenutzernamen: ocom und dem Passwort: Physico22
Öffnen Sie ein Terminal und melden Sie sich über ssh mit dem Hostnamen oder der IP-Adresse Ihres Boards mit einem der folgenden Befehle an. Geben Sie das Passwort ein, wenn Sie dazu aufgefordert werden:
$ ssh ocom@ocom-cecaf1
oder
$ ssh ocom@ocom-cecaf1.local
Jetzt Passwort ändern:
$ passwd
Schritt 5: MP4 Test
Nun ist es an der Zeit zu testen, ob alles wie erwartet funktioniert. Es gibt eine ausführliche Anleitung für die Einrichtung Ihrer ersten Pipeline bei OStream, also werden wir die Grundlagen abdecken, aber die Schnittstelle ist sehr intuitiv.
Lassen Sie uns eine Pipeline erstellen, um eines der auf der Karte installierten Testvideos zu analysieren. Geben Sie in Ihrer ssh-Sitzung die folgenden Befehle ein, um ein streamSources-Verzeichnis zu erstellen und die Testdatei dorthin zu kopieren:
ocom@ocom-cecaf1:~$ sudo mkdir -p /userdata/ostream/oa/streamSources
ocom@ocom-cecaf1:~$ sudo chown ocom:ocom /userdata/ostream/oa/streamSources
ocom@ocom-cecaf1:~$ cp /userdata/ostream/oa/media/tutorials/courtyard.mp4 /userdata/ostream/oa/streamSources/
Klicken Sie auf Stream Sources im Menü
Klicken Sie auf die Schaltfläche Create, um die Vorlage zur Erstellung einer Stromquelle zu öffnen, und füllen Sie die Optionen aus:
Geben Sie Ihrer Quelle einen Namen
Setzen Sie den Quellpool auf Ihren Pool
Wählen Sie die Low Code Pipeline
Setzen Sie den Typ auf On Board MP4
Legen Sie den Dateipfad auf courtyard.mp4 für unsere Beispieldatei fest.
Klicken Sie auf Speichern / Aktualisieren
Hier ist eine Datei, die ich zuvor erstellt habe:
Sie landen wieder auf der Seite mit den Dampfquellen.
Klicken Sie auf das Symbol Videokamera, um die Seite Live Viewer zu öffnen.
Ziehen Sie in der Pipeline den RK Person AI Service zwischen die Videoelemente Cap und Encode
Klicken Sie auf das Start-Symbol in der Pipeline, damit Ihr Video im Viewer abgespielt wird.
Jedes Mal, wenn eine Person erkannt wird, wird ein farbiger Rahmen um das erkannte Objekt angezeigt.
Es gibt 92 verschiedene KI-Dienste, die alle Arten von Objekten erkennen können, die Sie ausprobieren können. Ersetzen Sie einfach den Personendienst durch denjenigen, den Sie ausprobieren möchten, drücken Sie auf Speichern und aktualisieren Sie den Browser.
Schritt 6: Suche
Jedes Mal, wenn Ihre KI-Pipeline ein Objekt identifiziert, speichert sie dieses Bild in OStream, und Sie können die Suchfunktion verwenden, um das Bild mit Hilfe von Suchbegriffen abzurufen. Die Erfassungsdaten sind auch im JSON-Format verfügbar, so dass sie in von Ihnen entwickelte Anwendungen integriert werden können (siehe unten).
Jetzt können Sie alle Inferenzereignisse durchsuchen, bei denen Personen im Videostream identifiziert wurden:
Wählen Sie im Menü den Punkt Suche
Geben Sie einen Suchbegriff ein, der mit dem Zeichen '$' beginnt, z. B.: $person
Es werden alle Videobilder angezeigt, die die identifizierten Objekte enthalten. Sie können diese nach Zeit filtern.
Wenn Sie die Option Medien deaktivieren, können Sie die entsprechenden JSON-Metadaten sehen.
Schritt 7: RTSP video
Sie können Kameras nicht nur direkt an den CSI-Anschluss des ROCK 5AIO-Boards anschließen, sondern auch RTSP-Medienstreams über die OStream-Benutzeroberfläche einbinden.
Das Board fungiert als Remote-Client für den Server, an den die Kamera angeschlossen ist. Dies ermöglicht es dem ROCK 5AIO, eine beliebige RTSP-Kamera im Netzwerk anzuschließen und das Video über seine AI-Pipeline zu verarbeiten.
Ich habe eine RTSP Kamera mit einem Raspberry Pi 4 (Pi OS Desktop 32 bit) und V2 aufgesetzt, siehe hier: Open Source Mediamtx project.
- Installiere MediaMTX mit dem Link hier: https://github.com/bluenviron/mediamtx/releases/tag/v1.8.0
- In der README gibt es eine ziemlich gute Anleitung, wie man die Anwendung ausführt - stellen Sie sicher, dass Sie die armv7 Version für 32bit OS installieren (verwenden Sie nicht die Ausgabe von uname -m)
Laden Sie mediamtx_v1.8.0_linux_armv7.tar.gz herunter und öffnen Sie das zip file.
$ tar -xvzf mediamtx_v1.8.0_linux_armv7.tar.gz
$ cd mediamtx
Erstellen Sie eine Kopie von mediamtx.yml:
$ cp mediamtx.yml mediamtx.yml.orig
Fügen Sie dann mit Ihrem bevorzugten Editor die folgende Stanza an das EOF an. Dies konfiguriert Ihre Kamera und den Pfad. cam ist der Ressourcenname in Ihrer RTSP-URL:
paths:
cam:
source: rpiCamera
rpiCameraWidth: 1280
rpiCameraHeight: 720
rpiCameraVFlip: true
rpiCameraHFlip: true
rpiCameraBitrate: 1500000
Mediamtx server muss Zugriff haben
$ chmod +x mediamtx
Starten Sie den Server mit
./mediamtx
Der Videostream ist über Port 8554 an der IP-Adresse Ihres Pi verfügbar, zum Beispiel: rtsp://192.168.1.100:8554/cam
Sie können ein anderes Terminal öffnen und den Videostream mit ffmpeg ansehen, um zu testen:
ffplay rtsp://192.168.1.100:8554/cam -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
Tipp: Die Version von vlc (v3.0.16), die auf meinem Ubuntu Laptop installiert ist, funktioniert nicht mit RTSP!
Ich habe das neueste Snap-Paket installiert und es hat funktioniert:
$ snap run vlc rtsp://192.168.1.100:8554/cam
Der RTSP Stream sollte jetzt laufen.
Schritt 8: RTSP Pipeline
Sobald Sie einen funktionierenden RTSP-Kamera-Feed haben, können Sie ihn an Ihren ROCK 5AIO für die AI-Verarbeitung anschließen.
Fügen Sie in OStream eine neue Stream-Quelle hinzu, ähnlich wie bei dem MP4-Test in Schritt 5.
Wählen Sie Stream Sources und klicken Sie auf Create
Setzen Sie den Source Pool auf Ihren Pool und die Anwendung auf Low Code Pipeline
Setzen Sie den Typ auf Remote Camera RTSP
Setzen Sie die RTSP-URL auf die URL für Ihre entfernte Kamera. Im obigen Beispiel wäre das:
rtsp://192.168.1.100:8554/cam
Klicken Sie auf Aktualisieren
Die Stream-Quelle wird nun als Eintrag in der Menüleiste angezeigt.
Wählen Sie Ihre Quelle aus und starten Sie sie im Live-Viewer
Schritt 9: Webhooks
Wenn Sie eine vollständige Bildverarbeitungspipeline aufbauen möchten, benötigen Sie bei jedem "Ereignis" Zugriff auf die Inferenz-Metadaten.
OStream verfügt über eine Webhook-Funktion, die jedes Mal ausgelöst wird, wenn ein Inferenzereignis eintritt und Ihr Modell ein Objekt identifiziert. Die Empfindlichkeit hierfür wird in den Eigenschaften des AI-Objekts festgelegt, indem Sie in der Pipeline auf das Objekt klicken und dort den Konfidenzprozentsatz einstellen.
Sie benötigen einen HTTP-Endpunkt, an den OStream die Daten posten kann. Als Test habe ich Hookdeck.com verwendet, um einen lokalen Proxy für den Webhook zu einem Flask-Server einzurichten, der in meinem lokalen Netzwerk läuft.
Dieser Blog Post erklärt alles: https://dev.to/hookdeck/local-webhook-development-using-hookdeck-cli-1om
Erstellen Sie zunächst ein Hookdeck-Konto, falls Sie noch keins haben, und laden Sie dann die Hookdeck-CLI-Anwendung herunter und installieren Sie sie auf Ihrem lokalen Rechner.
Ich habe meinen Laptop mit Ubuntu Linux benutzt, um die .deb-Version der neuesten Version herunterzuladen und zu installieren. Es gibt auch Versionen für andere Systeme. Hookdeck CLI läuft im Terminal.
https://github.com/hookdeck/hookdeck-cli/releases/tag/v0.8.6
Richten Sie nun eine einfache Flask-Anwendung ein, die ein Python-Webserver ist. Sie benötigen das Flask-Paket, das Sie in eine virtuelle Umgebung stellen können:
$ mkdir flask && cd flask
$ python -m venv venv
$ source venv/bin/activate
(venv) ~/flask$ pip install Flask
Kopieren Sie den folgenden Inhalt in eine Datei namens main.py im Verzeichnis flask:
import logging
from flask import Flask, request, jsonify
logger = logging.getLogger()
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook_receiver():
data = request.json # Get the JSON data from the incoming request
logger.info(f"Objects detected: {len(data['objects'])}")
logger.debug(data['objects'])
return jsonify({'message': 'OK'}), 200
if __name__ == '__main__':
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.getLogger().setLevel(logging.DEBUG)
app.run(debug=True)
Starten Sie den server auf default port 5000
$ python main.py
* Serving Flask app 'main'
* Debug mode: on
* Running on http://127.0.0.1:5000
14:48:45: Press CTRL+C to quit
Now login to your Hookdeck account using your browser then and create a connection to the Hookdeck CLI by running the following command in a terminal on your local host:
$ hookdeck login
Loggen Sie sich nun mit Ihrem Browser in Ihr Hookdeck-Konto ein und stellen Sie eine Verbindung zum Hookdeck-CLI her, indem Sie den folgenden Befehl in einem Terminal auf Ihrem lokalen Rechner ausführen:
$ hookdeck listen 5000
Dadurch werden Sie aufgefordert, Hookdeck den URL-Pfad mitzuteilen, der in unserem Beispiel auf /webhook für POST-Anfragen eingestellt ist.
Sobald dies konfiguriert ist, gibt Hookdeck die für den Webhook zu verwendende URL in OStream aus:
Klicken Sie im OStream-Menü auf Ihren Output Stream und fügen Sie Ihre Webhook-URL einschließlich des Pfads hinzu
Vergewissern Sie sich, dass Sie den Output Stream in Ihrer Stream Source -> Hub Settings ausgewählt haben:
Jedes Mal, wenn Ihre Pipeline läuft und ein Objekt erkennt, sendet OStream die Ereignisdaten an Ihre Anwendung, in diesem Fall an den Flask-Server. Sobald Sie die JSON-Daten haben, können Sie sie auf jede beliebige Weise verarbeiten.
In diesem Beispiel zählen wir die Anzahl der Personen, die in jedem Videobild erkannt werden, und protokollieren auch die gesamten Metadaten zur Überprüfung.
Hier sehen Sie eine typische Ausgabe im Flask-Terminal, die die Anzahl der erkannten Objekte anzeigt, die ein berechneter Wert aus den Metadaten in der Flask-Funktion ist, gefolgt von der gesamten Objektliste:
Wenn Sie das Flask-Terminal über den Live-Stream-Viewer in OStream legen, können Sie sehen, dass die Reaktion auf jedes Inferenzereignis fast augenblicklich erfolgt.
Sobald Sie diese Informationen haben, können Sie Warnmeldungen erstellen oder den Zeitstempel verwenden, um Abschnitte des ursprünglichen Datenstroms in einer Aufzeichnung nachzuschlagen.
Ich testete den webhook mit AWS Lambda Instanz, was ein bisschen komplizierter ist, aber es hat gleich funktioniert.
Es ist der Ausgangspunkt einer hochentwickelten Bildverarbeitungspipeline...
Schritt 10: Herunterfahren
Fahren Sie das System mit dem Befehl poweroff ordnungsgemäß herunter und warten Sie 2 Minuten, bevor Sie das Netzteil entfernen, da die blaue LED auch dann noch leuchtet, wenn das System heruntergefahren ist.
$ sudo poweroff
Schritt 11: Troubleshooting
Ich hatte ein paar Anlaufschwierigkeiten mit meinem Board, aber es gibt einen reaktionsschnellen Support per E-Mail an support@ostream.com.
Hier sind ein paar Tipps:
OStream Node offline - Wenn Ihr Node offline angezeigt wird, ist der ObjectAgent-Prozess möglicherweise fehlgeschlagen.
- Warten Sie nach dem Hochfahren 2 Minuten lang
Stellen Sie sicher, dass Ihr Ethernet-Kabel angeschlossen ist.
Prüfen Sie, ob der ObjectAgent-Dienst läuft - hier ist er ausgefallen
ocom@ocom-cecaf1:~$ sudo systemctl status ObjectAgent
● ObjectAgent.service - ObjectAgent Service
Loaded: loaded (/etc/systemd/system/ObjectAgent.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2024-05-01 16:41:02 BST; 1min 26s ago
Process: 475 ExecStart=/userdata/ostream/oa/bin/ObjectAgent (code=exited, status=255/EXCEPTION)
Main PID: 475 (code=exited, status=255/EXCEPTION)
…
May 01 16:41:02 ocom-cecaf1 ObjectAgent[475]: [ERROR] Wlan ping response not valid
May 01 16:41:02 ocom-cecaf1 ObjectAgent[475]: [ERROR] Eth or wifi test failed above
May 01 16:41:02 ocom-cecaf1 systemd[1]: ObjectAgent.service: Failed with result 'exit-code'.
Wenn ObjectAgent versucht, Ihr Wlan anzupingen und es nicht konfiguriert ist, setzen Sie diese Prüfung außer Kraft, indem Sie die Datei startupValidationDone in /userdata/ostream/oa/bin/
ocom@ocom-cecaf1:~$ sudo touch /userdata/ostream/oa/bin/startupValidationDone
- Starten Sie neu und überprüfen Sie, ob ObjectAgent läuft.
ocom@ocom-cecaf1:~$ sudo reboot
ocom@ocom-cecaf1:~$ sudo systemctl status ObjectAgent
Live View startet nicht - Restart ObjectAgent:
ocom@ocom-cecaf1:~$ sudo systemctl restart ObjectAgent
Logs - diese sind in /userdata/ostream/oa/bin/
und /userdata/ostream/rd/bin/
Fazit
ROCK 5AIO in Verbindung mit OStream ist eine innovative neue Lösung, um die Komplexität der KI-Bildverarbeitung zu reduzieren.
Das Board unterstützt den direkten Anschluss an eine CSI-Kamera oder über Remote-RTSP-Medienstreams, die über das Netzwerk laufen, und kann so mehrere Kameras verarbeiten.
Die Bildströme werden lokal verarbeitet, wobei nur die Ereignisbilder an den OStream-Dienst übertragen werden. Dadurch wird die Bandbreite reduziert und der Datenschutz verbessert. Außerdem können die Aufnahmeereignisse zur weiteren Überprüfung durchsucht werden, wobei die JSON-Metadaten über Webhooks zur Verfügung gestellt werden.
Die gesamte Software ist bereits auf dem Board vorinstalliert, so dass die Einrichtung einfach ist und die Verwendung der OStream-Web-UI sehr intuitiv ist.
In diesem Projekt haben wir gezeigt, wie man die ROCK 5AIO einrichtet, KI-Bildverarbeitungspipelines mit entfernten RTSP-Kameras erstellt und auf die von der KI erkannten Bildereignisse für die weitere Anwendungsentwicklung zugreift.
Mit der Möglichkeit, einfach auf die KI-Inferenzdaten zuzugreifen, sind Ihrer Fantasie für Ihre KI-Bildverarbeitungsanwendung keine Grenzen gesetzt!
Referenz:
OStream site: https://www.ostream.com
Hookdeck site: https://hookdeck.com
Kommentare