Sturzdetektion in mehreren Szenarien basierend auf reComputer RK3576
Sturzverhaltenserkennung in mehreren Szenarien und bei mehreren Zielen unter Verwendung des YOLOv8n‑pose-Modells, mit Inferenzbeschleunigung durch den reComputer RK3576 und einfacher Informationsrückmeldung über eine Webseite.
Mehrszenario-Sturzerkennung basierend auf reComputer RK3576
Ein Sturzerkennungsprojekt basierend auf RK3576 / RKNN / YOLO / RGA
Sie können den Quellcode dieses Projekts einsehen unter: https://github.com/doublelf/fall_detection
Schnellstart
Projekt-Image über Docker pullen
docker pull ghcr.io/doublelf/pose_optimized:v1Testen Sie den Modelleffekt mit dem integrierten Beispiel
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
--device /dev/video1:/dev/video1 \
--device /dev/dri/renderD129:/dev/dri/renderD129 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
-v $(pwd)/video:/app/video \
seeed/pose_optimized:local \
python3 web_detection.py --model_path model/yolov8n_pose.rknn --video video/example1.mp4Dabei bildet "-v $(pwd)/video:/app/video" den lokalen Videoordner auf den Speicherort /app/video im Image ab.
Wenn Sie ein lokales Video für die Inferenz verwenden möchten, speichern Sie die lokale Datei in dem durch $(pwd)/video angegebenen Ordner.
Nachdem das Projekt erfolgreich gestartet ist, rufen Sie http://<board_ip>:8000/ auf, um die Echtzeit-Inferenzwirkung zu sehen.
Weiterentwicklung basierend auf dem Projekt
Image mit dem cp-Befehl auf die lokale Maschine kopieren
sudo docker cp pose_optimized:/app/web_detection.py ./Nachdem Sie den Code von web_detection.py geändert haben, denken Sie daran, den lokalen Code neu in das Image zu integrieren
sudo docker build -t seeed/pose_optimized:localFühren Sie es dann erneut aus.
Kamera für Echtzeit-Inferenz aufrufen
Wenn Sie die Inferenz ausführen, ändern Sie den Parameter "--video" in "--camera_id", um die Kamera für die Inferenz aufzurufen.
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
--device /dev/video1:/dev/video1 \
--device /dev/dri/renderD129:/dev/dri/renderD129 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
-v $(pwd)/video:/app/video \
seeed/pose_optimized:local \
python3 web_detection.py --model_path model/yolov8n_pose.rknn --camera_id 1Hier ist "--camera_id" mit dem Gerät verknüpft, das Sie in "--device /dev/video1:/dev/video1" angegeben haben.
KI-Inferenz-Erweiterungen
Inferenz-Engine: Basierend auf der RKNN-C-API verpackt, mit dem Haupteinstieg in web_detection.py und den tatsächlichen Aufrufen von utils/rknn_wrapper.py, mit Unterstützung der RK3576 NPU-Hardwarebeschleunigung. Modelleingabe: Akzeptiert das quantisierte Modell yolov8n_pose.rknn mit einer festen Eingabegröße von 640×640. Die Ausgabe umfasst Objekterkennungsboxen und 17 Schlüsselpunktkoordinaten. Nachbearbeitung: Analysiert die drei Feature-Maps aus der Modellausgabe, entfernt doppelte Boxen mittels NMS und verwendet den OKS-Algorithmus, um die Konfidenz der Schlüsselpunkte zu optimieren, und erzeugt schließlich strukturierte Posedaten.
Vorverarbeitung und Bildverarbeitung
Hardware-Beschleunigung: Nutzt die RGA-Einheit des RK3576 für Bildskalierung, Farbräumkonvertierung (YUV→RGB) und Formatkonvertierung, was die CPU-Last erheblich reduziert. Videoerfassung: Unterstützt die direkte Erfassung von V4L2-Kameras oder das Lesen lokaler Videodateien, wobei die Eingabequellen über die Parameter --camera_id und --video gewechselt werden. Bildratensteuerung: Erfassungs- und Inferenz-Thread sind getrennt und verwenden eine Doppelpuffer-Warteschlange, um Frame-Drops zu vermeiden und eine minimale Latenz für Echtzeit-Streams zu gewährleisten.
Empfehlungen für die Bereitstellung
Laufzeitberechtigungen: Es muss der --privileged-Container-Modus verwendet werden und /dev/video*, /dev/dri/renderD* (für RGA) sowie die Gerätebaum-Kompatibilitätsdatei explizit gemappt werden, um einen normalen Zugriff auf NPU und VPU zu gewährleisten. Image-Paketierung: Das Image enthält bereits alle Abhängigkeiten (RKNN Runtime, OpenCV, Flask). Es wird empfohlen, --net=host zu verwenden, um die Komplexität der Portzuordnung zu vermeiden. Wenn Sie Modelle oder Konfigurationen dauerhaft speichern müssen, können Sie externe Verzeichnisse einbinden. Langzeitbetrieb: Es wird empfohlen, einen systemd-Dienst oder Supervisor zur Überwachung des Container-Prozesses zu verwenden und die Richtlinie --restart=always festzulegen.
Bekannte Einschränkungen
Einzelstream-Inferenz: Das aktuelle Design unterstützt nur die Eingabe eines einzelnen Videostreams. Mehrfach-Stream-Parallelität erfordert die zusätzliche Entwicklung von Multithreading-/Multiprocess-Management-Logik. Rendering-Overhead: Obwohl RGA die Vorverarbeitung beschleunigt, verbrauchen die Zeichenoperationen von OpenCV immer noch einige CPU-Ressourcen. Bei hohen Auflösungen kann die Bildrate auf 15–20 FPS sinken. Netzwerkstream-Unterstützung: Unterstützt derzeit nur lokale Kameras oder Dateien; das Abrufen von RTSP/HTTP-Netzwerkstreams ist noch nicht integriert. Keine persistente Speicherung: Erkennungsergebnisse werden nur für die Echtzeitanzeige verwendet und nicht in einer Datenbank oder einem Dateisystem gespeichert. Verlaufsdaten erfordern benutzerdefinierte Erweiterungen. Hardwarekompatibilität: Die RGA-Beschleunigung hängt von RK3576-spezifischen Treibern ab. Andere RK-Serien-Chips (wie RK3568) laufen möglicherweise nicht direkt und erfordern möglicherweise das Neukompilieren von OpenCV und die Anpassung der RGA-Aufrufschnittstelle.