deepstream-dev

Par nvidia · skills

Développement avec le SDK NVIDIA DeepStream 9.0 et l'API Python pyservicemaker. À utiliser pour la construction de pipelines d'analyse vidéo, le traitement vidéo basé sur GStreamer, l'intégration d'inférence TensorRT, la détection/le suivi d'objets, ou l'intégration Kafka/broker de messages.

npx skills add https://github.com/nvidia/skills --skill deepstream-dev

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

  1. 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
  2. Par défaut, utiliser nvurisrcbin pour 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=1 sur nvstreammux et sync=0 sur le sink
    • Convertir les chemins locaux en URI : "file://" + os.path.abspath(path)
  3. Itération métadonnées : Utiliser .frame_items et .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
  4. Syntaxe Pad de requête : Utiliser le modèle "sink_%u", JAMAIS des noms de pad littéraux

    pipeline.link(("decoder", "mux"), ("", "sink_%u"))  # CORRECT
    # pipeline.link(("decoder", "mux"), ("", "sink_0"))  # WRONG - causera une erreur
  5. Détection de plateforme pour les sinks :

    import platform
    sink_type = "nv3dsink" if platform.processor() == "aarch64" else "nveglglessink"
  6. Clonage de tampon : Toujours cloner les tampons pour le traitement asynchrone

    tensor = buffer.extract(0).clone()  # CRITIQUE
  7. Types de file d'attente :

    • queue.Queue → Utiliser avec threading.Thread
    • multiprocessing.Queue → Utiliser avec multiprocessing.Process
    • Utiliser le mauvais type provoque une perte de données silencieuse !
  8. Format config nvinfer :

    • YAML : Utiliser section property: (PAS model:), key: value avec espace après le deux-points
    • INI : Utiliser section [property], key=value avec signe égal
    • La section DOIT s'appeler property
  9. nvmsgbroker est un SINK : Ne peut pas avoir d'éléments aval - utiliser tee pour diviser le pipeline

  10. 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.

  11. Attachement de probe intégré : measure_fps_probe ne peut être attaché qu'à des éléments de traitement (ex. : nvinfer, nvosdbin), PAS à des éléments sink. L'attachement à un sink lève RuntimeError: Probe failure.

  12. Les modèles ONNX dynamiques nécessitent infer-dims : Quand le modèle ONNX a des formes d'entrée dynamiques (ex. : exporté avec dynamic=True dans YOLO Ultralytics, ou avec des axes dynamiques de batch/hauteur/largeur), vous DEVEZ ajouter infer-dims=C;H;W à la config nvinfer. Sans cela, TensorRT voit -1 pour les dimensions dynamiques et échoue avec setDimensions: 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
  13. 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-mode doivent correspondre à la sortie réelle :

    Génération modèle Forme tenseur sortie Champs cluster-mode
    v8 / v11 [batch, 84, 8400] [features(4+80), anchors] -- cx/cy/w/h brut + scores de classe, pas NMS 2 (NMS)
    v10 / v26+ [batch, 300, 6] [max_det, (x1,y1,x2,y2,conf,cls)] -- déjà post-NMS, coordonnées pixel 4 (aucun)

    Comment identifier au runtime : enregistrer inferDims.d[0] et inferDims.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: 2 est 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_angle dans references/nvinfer_config.md : pour les modèles non-OBB, initialisez la valeur NvDsInferObjectDetectionInfo avec obj{} et gardez rotation_angle = 0 ; un simple NvDsInferObjectDetectionInfo obj; laisse les champs non initialisés.

  14. L'environnement virtuel doit inclure pyservicemaker : pyservicemaker est 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 installer pyservicemaker et pyyaml dans 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épendances

    Symptô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)

Skills similaires