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.
Ein auf RK3576 / RKNN / MPP / RGA / ZLMediaKit basierendes YOLOv8-Echtzeit-Inferenzprojekt mit mehreren Eingangsquellen und mehreren Ausgangsströmen.
Das aktuelle Projekt unterstützt:
V4L2-KameraeingabeRTSP-Netzwerkvideoeingabelocalvideo-Endlosschleife für lokale Videodateien- Drei RTSP-Ausgabestreams: Hauptstream / Substream / AI-Debug-Stream
YOLOv8 RKNN-Inferenz, Bounding-Box-Overlay, Klassenbezeichnungen, Zeit- und FPS-OSDlibavformatwird bevorzugt für RTSP/lokale komprimierte Stream-Eingabe verwendet, mitffmpeg pipeals 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
-
cameraHauptstream: Proportionale Skalierung + Padding (keine Streckung) -
camera_subSubstream: Proportionale Skalierung + zentriertes Zuschneiden (keine Streckung) -
camera_aiAI-Debug-Stream: Proportionale Skalierung + Padding (keine Streckung) -
KI-Inferenz
-
Feste Eingabe von
640x640 -
Bevorzugt
RGA letterboxfü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
cd /home/parker/Projects/rk3576_yolov8tortsp_demo
chmod +x scripts/build-linux.sh
./scripts/build-linux.shBuild-Ausgaben:
- Ausführbare Datei:
install/bin/rk3576_yolov8tortsp_demo - Laufzeitbibliotheken:
install/lib - Dokumentation:
install/docs - Modellverzeichnis:
install/model
Einrichtung vor der Ausführung
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"Modellplatzierung
Platzieren Sie die RKNN-Modelle in:
model/
yolov8n_rk3576.rknn
yolov8s_rk3576.rknn
yolov8m_rk3576.rknnWenn --model nicht explizit angegeben wird, wählt das Programm automatisch vorhandene Modelle in der folgenden Reihenfolge aus:
model/yolov8n_rk3576.rknnmodel/yolov8s_rk3576.rknnmodel/yolov8m_rk3576.rknn
Verwendung
V4L2-Kameraeingabe
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 cameraRTSP-Eingabe
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 cameraLokale Video-Endlosschleife
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 cameraDetaillierte Protokolle
Standardmäßig wird nur eine Startzusammenfassung ausgegeben; um detaillierte Laufzeitprotokolle anzuzeigen, fügen Sie hinzu:
--detail-infoExport von NPU-Eingabebildern
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-infoBestimmte Ausgabestreams aktivieren
--streams ai
--streams main,ai
--streams main,sub
--streams main,sub,aiErläuterung:
--streams ai: Nur KI-Inferenz durchführen undcamera_aiausgeben--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,aiverwendet
Hilfe anzeigen
./bin/rk3576_yolov8tortsp_demo --helpAPI-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 vonmain,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 Zweigsencode: MPP-Kodierungszeitpush: RTSP-Push-Zeite2e: Gesamtzeit vom Beginn der Verarbeitung bis zum Abschluss des Push-Vorgangs innerhalb des Zweigsfps: Tatsächlicher Zweig-Durchsatz, berechnet anhand des Wall-Clock-Statistikfensters
Projektstrukturübersicht
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_partyEntwicklerhandbuch
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:
stretchletterboxcenter_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 aufPTS-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目前基于压缩流读取链路,主要用于离线验证与循环推理
未来开发建议
- 继续降低
camera_ai的 OSD CPU 开销,可能引入瓦片缓存或更高效的混合路径 - 添加真正的全链路
pipeline_e2e指标,与当前分支e2e区分 - 改进
localvideo场景中的播放节奏控制,使其更接近实时源 - 为主/子码流增加更多独立的编码参数配置能力
- 如需支持更复杂的输入类型,可继续扩展
source抽象层