Parker Hu2026-07-22

Projet CPP d'inférence en temps réel YOLOv8 avec reComputer RK3576

Un projet d'inférence en temps réel YOLOv8 à entrées multi-sources et sorties multi-flux basé sur RK3576, RKNN, MPP, RGA et ZLMediaKit.

reComputer-RKrk3576yoloCPPGithub

Un projet d'inférence YOLOv8 en temps réel, multi-source en entrée et multi-flux en sortie, basé sur RK3576 / RKNN / MPP / RGA / ZLMediaKit.

Le projet actuel prend en charge :

  • Entrée caméra V4L2
  • Entrée vidéo réseau RTSP
  • Entrée en boucle de fichier vidéo local localvideo
  • Trois flux de sortie RTSP : flux principal / sous-flux / flux de débogage IA
  • Inférence YOLOv8 RKNN, superposition de boîtes englobantes, étiquettes de classe, horodatage et OSD FPS
  • Priorité à libavformat pour l'entrée de flux compressé RTSP/local, avec ffmpeg pipe comme solution de repli

Aperçu des fonctionnalités

  • Sources d'entrée

  • v4l2 : Convient aux caméras USB, capture locale

  • rtsp : Convient aux flux vidéo IPC/NVR/réseau

  • localvideo : Convient à la lecture de vidéo locale, validation hors ligne, inférence en boucle

  • Flux de sortie

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

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

  • Flux de débogage IA : rtsp://<board-ip>:8554/live/camera_ai

  • Utilisez --streams main,sub,ai pour produire simultanément un seul, deux ou les trois flux

  • Stratégies de résolution

  • Flux principal camera : Mise à l'échelle proportionnelle + remplissage (pas d'étirement)

  • Sous-flux camera_sub : Mise à l'échelle proportionnelle + recadrage centré (pas d'étirement)

  • Flux de débogage IA camera_ai : Mise à l'échelle proportionnelle + remplissage (pas d'étirement)

  • Inférence IA

  • Entrée fixe de 640x640

  • Priorité au RGA letterbox pour le prétraitement

  • Prend en charge le cache de détection, la correspondance PTS, la superposition IA

Guide de déploiement

Dépendances

  • Environnement d'exécution sur carte RK3576
  • RKNN Runtime
  • Rockchip MPP
  • RGA / librga
  • Bibliothèque d'exécution ZLMediaKit
  • Bibliothèque d'exécution FFmpeg ou outils en ligne de commande

Étapes de construction

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

Sorties de construction :

  • Exécutable : install/bin/rk3576_yolov8tortsp_demo
  • Bibliothèques d'exécution : install/lib
  • Documentation : install/docs
  • Répertoire des modèles : install/model

Configuration avant exécution

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

Placement des modèles

Placez les modèles RKNN dans :

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

Si --model n'est pas explicitement fourni, le programme sélectionnera automatiquement les modèles existants dans l'ordre suivant :

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

Utilisation

Entrée caméra V4L2

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

Entrée RTSP

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

Entrée de vidéo locale en boucle

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

Journaux détaillés

Seul un résumé de démarrage est affiché par défaut ; pour afficher les journaux d'exécution détaillés, ajoutez :

bash
--detail-info

Exporter les images d'entrée du NPU

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

Activer des flux de sortie spécifiques

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

Explication :

  • --streams ai : Effectuer uniquement l'inférence IA et produire camera_ai
  • --streams main,ai : Produire le flux principal et le flux de débogage IA
  • --streams main,sub : Double flux standard uniquement, ne charge pas le modèle RKNN
  • En cas d'omission, la valeur par défaut est --streams main,sub,ai

Afficher l'aide

bash
./bin/rk3576_yolov8tortsp_demo --help

Référence de l'API

Arguments de la ligne de commande principale

  • --source <v4l2|rtsp|localvideo> : Type de source d'entrée
  • --device <path> : Nœud de périphérique V4L2
  • --rtsp-input-url <url> : Adresse RTSP
  • --rtsp-username <valeur> : Nom d'utilisateur RTSP
  • --rtsp-password <valeur> : Mot de passe RTSP
  • --localvideo <path> : Chemin du fichier vidéo local
  • --model <path> : Chemin du modèle RKNN
  • --camera-width <valeur> / --camera-height <valeur> : Résolution d'entrée
  • --output-width <valeur> / --output-height <valeur> : Résolution de sortie du flux principal
  • --sub-width <valeur> / --sub-height <valeur> : Résolution de sortie du sous-flux
  • --fps <valeur> : Fréquence d'images cible pour l'encodage
  • --bitrate <valeur> : Débit binaire cible du flux principal
  • --rtsp-port <valeur> : Port du serveur RTSP local
  • --rtsp-app <valeur> : Nom de l'application RTSP
  • --rtsp-stream <valeur> : Nom du flux principal
  • --sub-stream <valeur> : Nom du sous-flux
  • --ai-stream <valeur> : Nom du flux de débogage IA
  • --streams <items> : Activer quels flux de sortie, prend en charge les combinaisons séparées par des virgules de main, sub, ai
  • --rtsp-timeout-ms <valeur> : Délai d'attente de lecture RTSP
  • --rtsp-reconnect-ms <valeur> : Intervalle de reconnexion RTSP
  • --perf-interval-ms <valeur> : Cycle de sortie PERF
  • --detail-info : Activer les journaux détaillés
  • --help : Afficher l'aide

Signification des métriques PERF

  • process : Temps de traitement d'image dans la branche
  • encode : Temps d'encodage MPP
  • push : Temps de poussée RTSP
  • e2e : Temps total depuis le début du traitement jusqu'à la fin de la poussée dans la branche
  • fps : Débit réel de la branche calculé par fenêtre statistique en temps réel

Aperçu de la structure du projet

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

Guide de développement

1. Extension des sources d'entrée

  • Interface unifiée dans include/rk3576_yolo_demo/source/i_source.hpp
  • Point d'entrée de la fabrique dans src/source/source_factory.cpp
  • Les nouvelles sources d'entrée doivent implémenter :
    • Open()
    • Close()
    • ReadPacket()
    • Describe()

2. Extension des sorties de branche

  • L'implémentation de la branche se trouve dans src/branch/branch_output.cpp
  • Prend actuellement en charge trois stratégies de géométrie :
    • stretch
    • letterbox
    • center_crop
  • Les relations géométriques sont calculées uniformément dans ComputeFrameTransform(), facilitant la réutilisation pour la mise à l'échelle de sortie et le mappage des boîtes IA

3. Extension de l'inférence IA

  • Point d'entrée RKNN dans src/ai/yolov8_engine.cpp
  • Le prétraitement donne la priorité à RGA
  • Les résultats de détection entrent dans le cache DetectionFrame, puis sont superposés par la branche IA en fonction de la correspondance PTS

4. Journalisation et débogage

  • Affiche uniquement un résumé de démarrage par défaut
  • Les journaux d’exécution détaillés sont activés via --detail-info
  • Le logger se trouve dans include/rk3576_yolo_demo/common/logger.hpp

Recommandations de déploiement

  • Pour un déploiement en production, assurez-vous que les permissions appropriées sont définies pour /dev/rga, les périphériques vidéo et les bibliothèques d’exécution concernées
  • Il est recommandé de packager les modèles, les bibliothèques d’exécution et les configurations ensemble avec install/
  • L’entrée RTSP priorise libavformat, avec basculement automatique vers ffmpeg pipe dans les environnements plus anciens
  • Pour un fonctionnement stable à long terme, il est recommandé d’utiliser systemd ou supervisor pour la gestion en démon et le redémarrage

Limitations connues

  • Le dessin des boîtes et la superposition en filigrane pour camera_ai consomment encore une certaine charge CPU
  • e2e ne représente pas la latence complète de bout en bout ; il s’agit uniquement du temps passé dans la branche
  • localvideo est actuellement basé sur le lien de lecture de flux compressé, principalement utilisé pour la validation hors ligne et l’inférence en boucle

Suggestions de développement futur

  1. Continuer à réduire la charge CPU de l’OSD pour camera_ai, en introduisant potentiellement la mise en cache des tuiles ou des chemins de fusion plus efficaces
  2. Ajouter une véritable métrique pipeline_e2e de bout en bout, distincte de l’actuel e2e de branche
  3. Améliorer le contrôle du rythme de lecture dans les scénarios localvideo afin de le rapprocher des sources en temps réel
  4. Ajouter davantage de capacités de configuration indépendante des paramètres d’encodage pour les flux principal et secondaire
  5. Si des types d’entrée plus complexes sont nécessaires, continuer à étendre la couche d’abstraction source