Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

OKdo 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.
OKdo 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:

Ostream Director login

Nach der Anmeldung werden Sie zur Startseite der Anwendung weitergeleitet, wo Sie alle Ihre ROCK 5AIO-Verbindungen verwalten und Ihre Bildverarbeitungspipelines erstellen können.

Ostream Director homepage

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.

ROCK 5 AIO Board Powered on

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.

Join Node

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.

Ostream Software Check

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ü

Stream Sources on Ostream Director

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:

Ostream Pool Example

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. 

Ostream Director Live View

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.

Ostream Director Search

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

Ostream Director RTSP Feed

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

Ostream Director RTSP 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

Ostream Director Output Stream

Vergewissern Sie sich, dass Sie den Output Stream in Ihrer Stream Source -> Hub Settings ausgewählt haben:

Ostream Director Hub Settings

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:

Ostream Flask

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.

Ostream Output

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.

Ostream Node Offline

  • 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 

Flask: https://flask.palletsprojects.com 

I'm an engineer and Linux advocate with probably more SBCs than a Odysseus moon lander

Kommentare