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.
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é à
libavformatpour l'entrée de flux compressé RTSP/local, avecffmpeg pipecomme 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,aipour 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 letterboxpour 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
cd /home/parker/Projects/rk3576_yolov8tortsp_demo
chmod +x scripts/build-linux.sh
./scripts/build-linux.shSorties 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
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"Placement des modèles
Placez les modèles RKNN dans :
model/
yolov8n_rk3576.rknn
yolov8s_rk3576.rknn
yolov8m_rk3576.rknnSi --model n'est pas explicitement fourni, le programme sélectionnera automatiquement les modèles existants dans l'ordre suivant :
model/yolov8n_rk3576.rknnmodel/yolov8s_rk3576.rknnmodel/yolov8m_rk3576.rknn
Utilisation
Entrée caméra V4L2
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 cameraEntrée RTSP
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 cameraEntrée de vidéo locale en boucle
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 cameraJournaux 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 :
--detail-infoExporter les images d'entrée du NPU
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-infoActiver des flux de sortie spécifiques
--streams ai
--streams main,ai
--streams main,sub
--streams main,sub,aiExplication :
--streams ai: Effectuer uniquement l'inférence IA et produirecamera_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
./bin/rk3576_yolov8tortsp_demo --helpRé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 demain,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 brancheencode: Temps d'encodage MPPpush: Temps de poussée RTSPe2e: Temps total depuis le début du traitement jusqu'à la fin de la poussée dans la branchefps: Débit réel de la branche calculé par fenêtre statistique en temps réel
Aperçu de la structure du projet
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_partyGuide 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 :
stretchletterboxcenter_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 correspondancePTS
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 versffmpeg pipedans 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_aiconsomment encore une certaine charge CPU e2ene représente pas la latence complète de bout en bout ; il s’agit uniquement du temps passé dans la branchelocalvideoest 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
- 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 - Ajouter une véritable métrique
pipeline_e2ede bout en bout, distincte de l’actuele2ede branche - Améliorer le contrôle du rythme de lecture dans les scénarios
localvideoafin de le rapprocher des sources en temps réel - Ajouter davantage de capacités de configuration indépendante des paramètres d’encodage pour les flux principal et secondaire
- Si des types d’entrée plus complexes sont nécessaires, continuer à étendre la couche d’abstraction
source