Parker Hu2026-07-22

YOLOv8 Echtzeit-Inferenz CPP-Projekt mit reComputer RK3576

Ein Projekt zur YOLOv8-Echtzeit-Inferenz mit Mehrkanal-Eingabe und Mehrfach-Stream-Ausgabe auf Basis von RK3576, RKNN, MPP, RGA und ZLMediaKit.

reComputer-RKrk3576yoloCPPGithub

Ein auf RK3576 / RKNN / MPP / RGA / ZLMediaKit basierendes YOLOv8-Echtzeit-Inferenzprojekt mit mehreren Eingangsquellen und mehreren Ausgangsströmen.

Das aktuelle Projekt unterstützt:

  • V4L2-Kameraeingabe
  • RTSP-Netzwerkvideoeingabe
  • localvideo-Endlosschleife für lokale Videodateien
  • Drei RTSP-Ausgabestreams: Hauptstream / Substream / AI-Debug-Stream
  • YOLOv8 RKNN-Inferenz, Bounding-Box-Overlay, Klassenbezeichnungen, Zeit- und FPS-OSD
  • libavformat wird bevorzugt für RTSP/lokale komprimierte Stream-Eingabe verwendet, mit ffmpeg pipe als Fallback

Funktionsübersicht

  • Eingangsquellen

  • v4l2: Geeignet für USB-Kameras, lokale Erfassung

  • rtsp: Geeignet für IPC/NVR/Netzwerkvideo-Streams

  • localvideo: Geeignet für lokale Videowiedergabe, Offline-Validierung, Schleifen-Inferenz

  • Ausgabestreams

  • Hauptstream: rtsp://<board-ip>:8554/live/camera

  • Substream: rtsp://<board-ip>:8554/live/camera_sub

  • AI-Debug-Stream: rtsp://<board-ip>:8554/live/camera_ai

  • Verwenden Sie --streams main,sub,ai, um einen einzelnen, zwei oder alle drei Streams gleichzeitig auszugeben

  • Auflösungsstrategien

  • camera Hauptstream: Proportionale Skalierung + Padding (keine Streckung)

  • camera_sub Substream: Proportionale Skalierung + zentriertes Zuschneiden (keine Streckung)

  • camera_ai AI-Debug-Stream: Proportionale Skalierung + Padding (keine Streckung)

  • KI-Inferenz

  • Feste Eingabe von 640x640

  • Bevorzugt RGA letterbox für die Vorverarbeitung

  • Unterstützt Erkennungscache, PTS-Abgleich, KI-Overlay

Bereitstellungshandbuch

Abhängigkeiten

  • RK3576-Board-Laufzeitumgebung
  • RKNN Runtime
  • Rockchip MPP
  • RGA / librga
  • ZLMediaKit-Laufzeitbibliothek
  • FFmpeg-Laufzeitbibliothek oder Kommandozeilenwerkzeuge

Build-Schritte

bash
cd /home/parker/Projects/rk3576_yolov8tortsp_demo
chmod +x scripts/build-linux.sh
./scripts/build-linux.sh

Build-Ausgaben:

  • Ausführbare Datei: install/bin/rk3576_yolov8tortsp_demo
  • Laufzeitbibliotheken: install/lib
  • Dokumentation: install/docs
  • Modellverzeichnis: install/model

Einrichtung vor der Ausführung

bash
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"

Modellplatzierung

Platzieren Sie die RKNN-Modelle in:

text
model/
  yolov8n_rk3576.rknn
  yolov8s_rk3576.rknn
  yolov8m_rk3576.rknn

Wenn --model nicht explizit angegeben wird, wählt das Programm automatisch vorhandene Modelle in der folgenden Reihenfolge aus:

  1. model/yolov8n_rk3576.rknn
  2. model/yolov8s_rk3576.rknn
  3. model/yolov8m_rk3576.rknn

Verwendung

V4L2-Kameraeingabe

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source v4l2 \
  --device /dev/video0 \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

RTSP-Eingabe

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source rtsp \
  --rtsp-input-url "rtsp://192.168.100.101:554/live" \
  --rtsp-username "admin" \
  --rtsp-password "c32bdc3e" \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-timeout-ms 5000 \
  --rtsp-reconnect-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

Lokale Video-Endlosschleife

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source localvideo \
  --localvideo ./videos/demo.mp4 \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

Detaillierte Protokolle

Standardmäßig wird nur eine Startzusammenfassung ausgegeben; um detaillierte Laufzeitprotokolle anzuzeigen, fügen Sie hinzu:

bash
--detail-info

Export von NPU-Eingabebildern

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source localvideo \
  --localvideo ./videos/demo.mp4 \
  --model model/yolov8n_rk3576.rknn \
  --streams ai \
  --dump-ai-input-dir ./debug_ai_input \
  --dump-ai-input-every 30 \
  --detail-info

Bestimmte Ausgabestreams aktivieren

bash
--streams ai
--streams main,ai
--streams main,sub
--streams main,sub,ai

Erläuterung:

  • --streams ai: Nur KI-Inferenz durchführen und camera_ai ausgeben
  • --streams main,ai: Hauptstream und AI-Debug-Stream ausgeben
  • --streams main,sub: Nur Standard-Dual-Stream, lädt kein RKNN-Modell
  • Wenn weggelassen, wird standardmäßig --streams main,sub,ai verwendet

Hilfe anzeigen

bash
./bin/rk3576_yolov8tortsp_demo --help

API-Referenz

Kernbefehlszeilenargumente

  • --source <v4l2|rtsp|localvideo>: Eingangsquellentyp
  • --device <path>: V4L2-Geräteknoten
  • --rtsp-input-url <url>: RTSP-Adresse
  • --rtsp-username <value>: RTSP-Benutzername
  • --rtsp-password <value>: RTSP-Passwort
  • --localvideo <path>: Pfad zur lokalen Videodatei
  • --model <path>: Pfad zum RKNN-Modell
  • --camera-width <value> / --camera-height <value>: Eingabeauflösung
  • --output-width <value> / --output-height <value>: Ausgabeauflösung des Hauptstreams
  • --sub-width <value> / --sub-height <value>: Ausgabeauflösung des Substreams
  • --fps <value>: Ziel-Bildrate für die Kodierung
  • --bitrate <value>: Zielbitrate des Hauptstreams
  • --rtsp-port <value>: Port des lokalen RTSP-Servers
  • --rtsp-app <value>: RTSP-App-Name
  • --rtsp-stream <value>: Hauptstream-Name
  • --sub-stream <value>: Substream-Name
  • --ai-stream <value>: AI-Debug-Stream-Name
  • --streams <items>: Aktiviert ausgewählte Ausgabestreams, unterstützt durch Kommas getrennte Kombinationen von main, sub, ai
  • --rtsp-timeout-ms <value>: RTSP-Lese-Timeout
  • --rtsp-reconnect-ms <value>: RTSP-Wiederverbindungsintervall
  • --perf-interval-ms <value>: PERF-Ausgabezyklus
  • --detail-info: Detaillierte Protokolle aktivieren
  • --help: Hilfe ausgeben

PERF-Bedeutungen

  • process: Bildverarbeitungszeit innerhalb des Zweigs
  • encode: MPP-Kodierungszeit
  • push: RTSP-Push-Zeit
  • e2e: Gesamtzeit vom Beginn der Verarbeitung bis zum Abschluss des Push-Vorgangs innerhalb des Zweigs
  • fps: Tatsächlicher Zweig-Durchsatz, berechnet anhand des Wall-Clock-Statistikfensters

Projektstrukturübersicht

text
rk3576_yolov8tortsp_demo
├── CMakeLists.txt
├── README.md
├── docs
├── include
│   ├── rk3576_demo
│   └── rk3576_yolo_demo
├── model
├── scripts
├── src
│   ├── ai          # RKNN inference and pre/post-processing
│   ├── app         # Application entry and orchestration
│   ├── branch      # 3-branch output, OSD, PERF
│   ├── camera      # V4L2 capture
│   ├── codec       # MPP encode/decode
│   ├── common      # Common types, logger, thread queues
│   ├── pipeline    # V2 distribution and processing pipeline
│   ├── rga         # Image scaling and conversion
│   ├── rtsp        # Local RTSP publishing
│   ├── source      # Input source abstraction and implementation
│   ├── utils
│   └── watermark   # Time/FPS/Label rendering
└── third_party

Entwicklerhandbuch

1. Erweiterung von Eingangsquellen

  • Einheitliche Schnittstelle unter include/rk3576_yolo_demo/source/i_source.hpp
  • Factory-Einstiegspunkt unter src/source/source_factory.cpp
  • Neue Eingangsquellen sollten implementieren:
    • Open()
    • Close()
    • ReadPacket()
    • Describe()

2. Erweiterung von Zweigausgaben

  • Die Zweigimplementierung befindet sich unter src/branch/branch_output.cpp
  • Derzeit werden drei Geometriestrategien unterstützt:
    • stretch
    • letterbox
    • center_crop
  • Geometrische Beziehungen werden einheitlich in ComputeFrameTransform() berechnet, was die Wiederverwendung für Ausgabeskalierung und KI-Box-Mapping erleichtert

3. Erweiterung der KI-Inferenz

  • RKNN-Einstiegspunkt unter src/ai/yolov8_engine.cpp
  • Vorverarbeitung bevorzugt RGA
  • Erkennungsergebnisse gelangen in den DetectionFrame-Cache und werden dann vom KI-Zweig basierend auf PTS-Abgleich überlagert

4. 日志与调试

  • 默认仅打印启动摘要
  • 通过 --detail-info 启用详细运行时日志
  • 日志记录器位于 include/rk3576_yolo_demo/common/logger.hpp

部署建议

  • 生产部署时,请确保为 /dev/rga、视频设备及相关运行时库设置正确的权限
  • 建议将模型、运行时库和配置文件一同打包到 install/ 目录下
  • RTSP 输入优先使用 libavformat,在旧环境中会自动回退到 ffmpeg pipe
  • 为确保长期稳定运行,建议使用 systemd 或 supervisor 进行守护进程及重启管理

已知限制

  • camera_ai 的框绘制和水印叠加仍会消耗一定的 CPU 开销
  • e2e 并非完整的全链路延迟,它仅代表分支内消耗的时间
  • localvideo 目前基于压缩流读取链路,主要用于离线验证与循环推理

未来开发建议

  1. 继续降低 camera_ai 的 OSD CPU 开销,可能引入瓦片缓存或更高效的混合路径
  2. 添加真正的全链路 pipeline_e2e 指标,与当前分支 e2e 区分
  3. 改进 localvideo 场景中的播放节奏控制,使其更接近实时源
  4. 为主/子码流增加更多独立的编码参数配置能力
  5. 如需支持更复杂的输入类型,可继续扩展 source 抽象层