Compétence DeepStream Development
Lorsque cette compétence est active, LISEZ TOUJOURS les documents de référence pertinents avant de générer du code. NE PAS vous fier à la mémoire - les documents de référence contiennent des détails critiques sur les noms de propriétés exacts, l'utilisation correcte de l'API et les pièges courants.
Référence rapide SDK et architecture
Exigences de version DeepStream SDK 9.0
- GStreamer : 1.24.2
- Pilote NVIDIA : 590+
- CUDA : 13.1
- TensorRT : 10.14.1.48
- Plateformes : Ubuntu 24.04 (x86_64 et ARM64/Jetson)
Flux pipeline typique
Source → Stream Muxer → Inference → [Tracker] → OSD → Renderer
Les composants entre [crochets] sont optionnels -- ne les ajoutez que si l'utilisateur les demande explicitement.
| Étape | Rôle | Élément(s) clé(s) | Requis ? |
|---|---|---|---|
| Source | Entrée depuis fichiers, RTSP, caméras | nvurisrcbin (préféré), nvmultiurisrcbin, filesrc |
Oui |
| Stream Muxer | Agrège les flux pour l'inférence | nvstreammux |
Oui |
| Inference | Exécution du modèle TensorRT | nvinfer, nvinferserver |
Oui |
| Tracker | Suivi multi-objets entre les images | nvtracker |
Seulement si demandé |
| OSD | Dessine les boîtes de délimitation, étiquettes, superpositions | nvosdbin |
Oui (pour la visualisation) |
| Renderer | Affiche ou enregistre la sortie | nveglglessink, nv3dsink, filesink |
Oui |
Modèle de mémoire
DeepStream utilise le gestionnaire de mémoire vidéo NVIDIA (NVMM) pour les transferts de tampon GPU sans copie. Les chaînes de capacités utilisent memory:NVMM pour indiquer la mémoire GPU (ex. : video/x-raw(memory:NVMM), format=NV12).
Règles critiques
-
Ajouter uniquement les composants demandés : NE PAS ajouter d'éléments pipeline que l'utilisateur n'a pas demandés.
- Tracker (
nvtracker) : Ajouter seulement si l'utilisateur demande explicitement le suivi ou les ID d'objets entre les images - GIEs secondaires : Ajouter seulement si l'utilisateur demande la classification ou l'extraction d'attributs
- Analytics (
nvdsanalytics) : Ajouter seulement si l'utilisateur demande le franchissement de ligne, le comptage ROI, etc. - Message broker (
nvmsgbroker/nvmsgconv) : Ajouter seulement si l'utilisateur demande la messagerie Kafka/cloud - En cas de doute, construisez le pipeline fonctionnel minimal et laissez l'utilisateur demander des ajouts
- Tracker (
-
Par défaut, utiliser
nvurisrcbinpour les sources : Quand l'utilisateur dit « caméra », « flux », « vidéo » ou fournit un chemin fichier :- Toujours utiliser
nvurisrcbin-- il gère RTSP, HTTP et les fichiers locaux (file://) de façon transparente - Utiliser
filesrc+qtdemux+ parser seulement si l'utilisateur demande explicitement un contrôle brut de la source fichier - Pour les sources RTSP/live, aussi définir
live-source=1surnvstreammuxetsync=0sur le sink - Convertir les chemins locaux en URI :
"file://" + os.path.abspath(path)
- Toujours utiliser
-
Itération métadonnées : Utiliser
.frame_itemset.object_items(retournent des itérateurs, PAS des listes)- JAMAIS utiliser
len()sur ceux-ci - itérer pour compter - L'itérateur ne peut être consommé qu'une fois
- JAMAIS utiliser
-
Syntaxe Pad de requête : Utiliser le modèle
"sink_%u", JAMAIS des noms de pad littérauxpipeline.link(("decoder", "mux"), ("", "sink_%u")) # CORRECT # pipeline.link(("decoder", "mux"), ("", "sink_0")) # WRONG - causera une erreur -
Détection de plateforme pour les sinks :
import platform sink_type = "nv3dsink" if platform.processor() == "aarch64" else "nveglglessink" -
Clonage de tampon : Toujours cloner les tampons pour le traitement asynchrone
tensor = buffer.extract(0).clone() # CRITIQUE -
Types de file d'attente :
queue.Queue→ Utiliser avecthreading.Threadmultiprocessing.Queue→ Utiliser avecmultiprocessing.Process- Utiliser le mauvais type provoque une perte de données silencieuse !
-
Format config nvinfer :
- YAML : Utiliser section
property:(PASmodel:),key: valueavec espace après le deux-points - INI : Utiliser section
[property],key=valueavec signe égal - La section DOIT s'appeler
property
- YAML : Utiliser section
-
nvmsgbroker est un SINK : Ne peut pas avoir d'éléments aval - utiliser
teepour diviser le pipeline -
TOUS les sinks ont besoin de async=0 pour les scissions Tee ou les sources dynamiques : CRITIQUE pour les transitions d'état
# Lors de l'utilisation de scissions tee OU de sources dynamiques, TOUS les sinks DOIVENT avoir async=0 pipeline.add("nveglglessink", "sink", { "sync": 0, "qos": 0, "async": 0 # CRITIQUE - prévient l'interblocage de transition d'état })Symptôme en cas d'omission : Le pipeline reste en état PAUSED, aucune vidéo ne s'affiche.
-
Attachement de probe intégré :
measure_fps_probene peut être attaché qu'à des éléments de traitement (ex. :nvinfer,nvosdbin), PAS à des éléments sink. L'attachement à un sink lèveRuntimeError: Probe failure. -
Les modèles ONNX dynamiques nécessitent
infer-dims: Quand le modèle ONNX a des formes d'entrée dynamiques (ex. : exporté avecdynamic=Truedans YOLO Ultralytics, ou avec des axes dynamiques de batch/hauteur/largeur), vous DEVEZ ajouterinfer-dims=C;H;Wà la config nvinfer. Sans cela, TensorRT voit-1pour les dimensions dynamiques et échoue avecsetDimensions: Error Code 3. Valeurs courantes :- Modèles YOLO (entrée 640) :
infer-dims=3;640;640 - Modèles avec entrée 416 :
infer-dims=3;416;416 - Modèles avec entrée 1280 :
infer-dims=3;1280;1280
- Modèles YOLO (entrée 640) :
-
Le format de sortie Ultralytics YOLO dépend de la génération du modèle -- les nouveaux modèles (v10+/v26+) génèrent des résultats post-NMS ; les anciens modèles (v8/v11) génèrent des tenseurs bruts pré-NMS. Le parser personnalisé et
cluster-modedoivent correspondre à la sortie réelle :Génération modèle Forme tenseur sortie Champs cluster-modev8 / v11 [batch, 84, 8400][features(4+80), anchors]-- cx/cy/w/h brut + scores de classe, pas NMS2(NMS)v10 / v26+ [batch, 300, 6][max_det, (x1,y1,x2,y2,conf,cls)]-- déjà post-NMS, coordonnées pixel4(aucun)Comment identifier au runtime : enregistrer
inferDims.d[0]etinferDims.d[1]à l'intérieur du parser personnalisé.d={84, 8400}→ pré-NMS (style v8/v11)d={300, 6}→ post-NMS (style v10/v26+)
Symptôme de non-correspondance : Si
cluster-mode: 2est utilisé avec une sortie post-NMS[N, 6], les boîtes de délimitation apparaissent décalées de 45° ou 135° par rapport aux objets réels (le NMS de DeepStream retraite incorrectement les coordonnées déjà finales). Si vous voyez des boîtes inclinées ou tournées, vérifiez aussi la note OBB /rotation_angledansreferences/nvinfer_config.md: pour les modèles non-OBB, initialisez la valeurNvDsInferObjectDetectionInfoavecobj{}et gardezrotation_angle = 0; un simpleNvDsInferObjectDetectionInfo obj;laisse les champs non initialisés. -
L'environnement virtuel doit inclure pyservicemaker :
pyservicemakerest installé au niveau système mais N'EST PAS accessible depuis un environnement virtuel Python standard. Quand une tâche nécessite un venv (ex. : pour le téléchargement/conversion de modèle avec dépendances pip), toujours installerpyservicemakeretpyyamldans le venv. La configuration venv dans le code généré et le README doivent toujours inclure :python3 -m venv venv source venv/bin/activate pip install /opt/nvidia/deepstream/deepstream/service-maker/python/pyservicemaker*.whl pyyaml pip install -r requirements.txt # autres dépendancesSymptôme en cas d'omission :
ModuleNotFoundError: No module named 'pyservicemaker'lors de l'exécution de l'application dans le venv.
Chemins clés (DeepStream 9.0)
- Modèles :
/opt/nvidia/deepstream/deepstream/samples/models/ - Détecteur primaire :
/opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx - Lib Tracker :
/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so - Lib Kafka :
/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so - Exemples de configs :
/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/
Documents de référence
IMPORTANT : Toujours lire ces documents pour les détails complets. NE PAS générer du code de mémoire.
| Document | À utiliser quand |
|---|---|
| references/gstreamer_plugins.md | Recherche de propriétés plugin, TOUTES les propriétés listées |
| references/service_maker_api.md | Utilisation de l'API Pipeline/Flow, accès aux métadonnées, probes, EventMessageUserMetadata |
| references/use_cases_pipelines.md | Construction de pipelines : lecture simple, multi-inférence, GIE en cascades |
| references/kafka_messaging.md | Configuration Kafka/message broker, config nvmsgconv/nvmsgbroker, msg2p-newapi |
| references/best_practices.md | Motifs de conception, pièges courants, anti-motifs |
| references/buffer_apis.md | BufferProvider/Feeder (injection), BufferRetriever/Receiver (extraction) |
| references/media_extractor_advanced.md | MediaExtractor, MediaChunk, FrameSampler |
| references/utilities_config.md | PerfMonitor, EngineFileMonitor, SourceConfig, SensorInfo, SmartRecordConfig |
| references/nvinfer_config.md | Format fichier config nvinfer, TOUS les paramètres |
| references/tracker_config.md | Config nvtracker, NvDCF/IOU/DeepSORT/NvSORT |
| references/troubleshooting.md | Messages d'erreur et solutions |
| references/rest_api_dynamic.md | API REST, ajout/suppression dynamique de source, nvmultiurisrcbin |
| references/metamux_config.md | Config nvdsmetamux, inférence multi-modèle parallèle, fusion métadonnées, filtrage ID source |
| references/docker_containers.md | Images Docker, exemples Dockerfile, installation pyservicemaker, commandes run conteneur |
Référence rapide d'erreurs
| Erreur | Solution |
|---|---|
iterator has no len() |
Itérer pour compter, ne pas utiliser len() |
pad template not found |
Utiliser "sink_%u" pas "sink_0" |
| Perte de données en file d'attente | Utiliser multiprocessing.Queue avec Process |
| Échec analyse config | Utiliser property: pas model: en YAML |
Avertissement dépréciation is-classifier |
Utiliser network-type: 1 au lieu de is-classifier: 1 pour les classifieurs ; omettre les deux pour les détecteurs |
Avertissement clé inconnue min-boxes |
Utiliser minBoxes (camelCase) dans les sections class-attrs-*, pas min-boxes |
| GIE secondaire inactif | Définir process-mode: 2, vérifier operate-on-gie-id |
| Tee/source dynamique bloquée PAUSED | Définir async: 0 sur TOUS les éléments sink |
| RTSP pas de données/reconnexion | Tester l'URL avec ffplay, vérifier les identifiants |
RuntimeError: Probe failure |
measure_fps_probe ne peut pas s'attacher à des éléments sink ; utiliser nvinfer ou nvosdbin à la place |
setDimensions dims négatives / construction engine échouée |
Ajouter infer-dims=C;H;W pour les modèles ONNX dynamiques (ex. : infer-dims=3;640;640) |
No module named 'pyservicemaker' dans venv |
pip install /opt/nvidia/deepstream/deepstream/service-maker/python/pyservicemaker*.whl pyyaml dans le venv |
AttributeError: object has no attribute 'obj_label' |
Utiliser obj_meta.label pas obj_meta.obj_label dans pyservicemaker (le nom de l'API C diffère de la liaison Python) |