option
MaisonMaison Skill DevOps et CI/CD vss-deploy-detection-tracking-3d

vss-deploy-detection-tracking-3d

NVIDIA/skills NVIDIA/skills

Déployer et exploiter le microservice RTVI-CV-3D dédié à la détection et au suivi 3D multi-caméras, prenant en charge des ensembles de données d'exemple, des vidéos personnalisées et des flux RTSP.

...Développer tout
0
Heure mise à jour 28 septembre 2026

Objectif

Déployer et exploiter le microservice RTVI-CV-3D sous le nom de MV3DT (MODE=mv3dt) — perception DeepStream par caméra et fusion BEV sur plusieurs caméras calibrées — sur le jeu de données d’exemple fourni, des vidéos personnalisées ou un flux RTSP en direct, sans l’agent d’entrepôt complet ni la LLM / VLM.

Instructions

Procédez de haut en bas : répondez aux questions d’orientation (Q0–Q3) dans la section « Routing », puis suivez la référence correspondant au chemin choisi. Les procédures détaillées étape par étape se trouvent dans le répertoire references/ (déploiement, chaîne d’étalonnage, configuration des caméras, vérification, démontage, dépannage).

Exemples

  • Activez le suivi multi-caméras sur le jeu de données d’exemple.
  • Déployez RTVI-CV-3D sur mes vidéos disponibles ici : <chemin/vers/les/vidéos>.
  • Exécutez MV3DT sur des flux RTSP après l’étalonnage.

Déploiement VSS de la détection et du suivi — 3D (RTVI-CV-3D / MV3DT)

Lancez le microservice RTVI-CV-3D en tant que pile MV3DT (MODE=mv3dt) à partir du blueprint du warehouse : perception DeepStream par caméra (vss-rtvi-cv-mv3dt) + fusion BEV (vss-rtvi-cv-bev-fusion) + bus MQTT mosquitto + courtier + pile de capteurs VST — sans la pile d’agents / LLM / VLM fournie avec le blueprint « warehouse » complet.

Le mécanisme de composition proprement dit se trouve dans deploy/docker/industry-profiles/warehouse-operations/warehouse-mv3dt-app/. Cette compétence gère les remplacements d'environnement, la chaîne d'étalonnage et la vérification.

Routage

Poser au maximum quatre questions à l’utilisateur, puis acheminer la requête.

Q0 — Taille du profil (superpositions ou non)

Par défaut, le profil est « étendu », sauf si l’utilisateur demande explicitement le profil « minimal ». Le profil « étendu » déploie ELK + vss-video-analytics-api-mv3dt + vss-kibana-init-mv3dt + vss-import-calibration-output-mv3dt en plus du noyau MV3DT — ce sont les composants dont le mur vidéo VST a besoin pour afficher les superpositions de cadres de sélection. Sans eux, le mur vidéo fonctionne mais affiche les flux bruts sans superpositions.

Réponse de l’utilisateur MINIMAL_PROFILE Ce que vous obtenez Quand choisir
étendu (par défaut) "" Noyau MV3DT + ELK + API d'analyse + Kibana. Les superpositions fonctionnent dans le mur d'images VST. Recommandé pour une expérience de bout en bout complète. « Je souhaite bénéficier d’une expérience de bout en bout complète », « Je souhaite voir les cadres de sélection », ou aucune préférence indiquée
minimal « true » Noyau MV3DT uniquement. Environ 5 conteneurs en moins. Pas de superpositions dans VST. Les métadonnées restent sur Kafka/Redis. « Je n’ai besoin que des données », « hôte Edge / Thor », « encombrement minimal »

Remarque sur l’ELK sélectif : il n’existe pas de solution intermédiaire « minimal + ELK uniquement » dans la configuration actuelle. Tous les services contrôlés par ${MINIMAL_PROFILE:+_extended} démarrent ensemble (ES, Logstash, Kibana, video-analytics-api, kibana-init, import-calibration). L’expansion du paramètre :+ de bash génère le suffixe _extended lorsque MINIMAL_PROFILE est défini ; extended ramène la chaîne de filtrage à la forme simple bp_wh_kafka_mv3dt, à laquelle le profil de composition actif correspond déjà. Soit vous acceptez l’ensemble complet étendu, soit vous restez en mode minimal.

Q1 — Source de données

Posez cette question sauf si la source est explicitement mentionnée dans le premier message de l’utilisateur. Une simple requête telle que « deploy rtvi-cv-3d » redirige vers cette compétence MV3DT (MODE=mv3dt), maisn’ implique pas d’échantillon.

  • sample — le jeu de données synthétiques regroupant 4 caméras (warehouse-4cams-20mx20m-synthetic). L’étalonnage est fourni dans l’arborescence ; aucune exécution d’AMC n’est nécessaire.
  • videos — l’utilisateur dispose de fichiers vidéo locaux (tous les fichiers *.mp4 nommés d’après ses caméras). L’AMC autonome (profilauto_calib ) s’exécutera si l’étalonnage fait défaut.
  • rtsp — l’utilisateur dispose d’URL RTSP en direct. Calibrage via l’AMC piloté par VIOS ; le déploiement final nécessite également un fichier d’informations sur les capteurs (camera_info.json) contenant ces URL RTSP.

Q2 — Couverture de l’étalonnage (ignorer pour l’exemple)

Pour les vidéos et le RTSP, vérifiez si l’étalonnage se trouve déjà sur le disque, à l’emplacement de montage attendu par le conteneur de perception :

DATASET="${SAMPLE_VIDEO_DATASET:?}"          # le slug du jeu de données de l’utilisateur ; voir Q3
CAL_DIR="${VSS_APPS_DIR}/industry-profiles/warehouse-operations/warehouse-mv3dt-app/calibration/sample-data/${DATASET}"

# Rechercher N'IMPORTE LEQUEL des fichiers suivants : calibration.json, ainsi que camInfo/*.yml ou *.yaml portant soit
# la nomenclature « cam_* », soit « Camera* » (l'exemple fourni utilise Camera*.yml, AMC peut
# générer des fichiers cam_*.yml — élargissez la recherche en conséquence)
test -f "${CAL_DIR}/calibration.json" \
  && ls "${CAL_DIR}/camInfo/"*.{yml,yaml} 2>/dev/null

Si l’utilisateur a lui-même fourni un chemin d’étalonnage, validez ce chemin à la place — ne recalculez pas. Consultez configure-cameras.md pour la normalisation des noms de caméras et la détection fiable du nombre de caméras (analyse calibration.json).

Q3 — Détecteur + slug du jeu de données (uniquement lorsque Q2 déclenche l’AMC)

  • resnet (par défaut, rapide) ou transformer (plus lent, plus performant en cas d’occlusion) — transmis à l’API AMC /v1/calibrate/ à l’étape B (voir vss-generate-video-calibration/SKILL.md:48-62).
  • Un slug court de jeu de données au format « kebab-case » utilisé comme SAMPLE_VIDEO_DATASET (par exemple : customer-aisle-4cams). Il détermine le chemin de montage pour l’étalonnage et est enregistré dans le fichier .env.

Table de routage

Q1 Résultat Q2 Chemin
échantillon (calculs intégrés dans l'arborescence et déjà normalisés) directement dans «references/deploy-rtvi-cv-3d-stack.md »
vidéos cal présent references/configure-cameras.md → references/deploy-rtvi-cv-3d-stack.md
vidéos cal manquant références/calibration-workflow.md (mode vidéos) → références/configure-cameras.md → références/deploy-rtvi-cv-3d-stack.md
rtsp cal présent references/configure-cameras.md → references/deploy-rtvi-cv-3d-stack.md
rtsp cal manquant references/calibration-workflow.md (mode rtsp) → references/configure-cameras.md → references/deploy-rtvi-cv-3d-stack.md

Tous les chemins convergent vers references/verify-and-view.md une fois que la commande « up -d » est terminée. Les fichiers references/troubleshooting.md et references/teardown.md sont liés, mais ne font pas partie du scénario normal.

Règle de désambiguïsation. Dans cette compétence, « RTVI-CV-3D » désigne le déploiement du microservice MV3DT et utilise MODE=mv3dt. Redirigez vers ../vss-deploy-profile/references/warehouse.md uniquement lorsque l’utilisateur demande le blueprint complet de l’entrepôt, Sparse4D, MODE=3d ou warehouse-3d-app. Cette compétence est réservée à MV3DT, sans la pile d’agents / LLM / VLM.

Prérequis

1. Chemin d’accès au dépôt

Localisez le répertoire « video-search-and-summarization/ » sur le disque. Toutes les commandes « compose » s’exécutent à partir de /deploy/docker/. Si ce chemin est inconnu, demandez-le à l’utilisateur.

2. CLI NGC + clé

$NGC_CLI_API_KEY doit être définie et doit disposer d’un accès aux images nvidia/vss-core/*. Consultez vss-deploy-profile/references/ngc.md pour la configuration si elle est manquante.

Si l’utilisateur a déjà exécuté la commande ` ngc config set ` mais que $NGC_CLI_API_KEY n’est pas exportée dans ce shell, la clé se trouve déjà sur le disque :

NGC_CLI_API_KEY=$(awk -F'= ' '/^apikey/{print $2}' ~/.ngc/config 2>/dev/null)
test -n "${NGC_CLI_API_KEY}" && echo "clé extraite de ~/.ngc/config"

Assurez-vous que la valeur de la clé figure également dans ` industry-profiles/warehouse-operations/.env:164 ` (NGC_CLI_API_KEY=...) — `compose` ne la lit qu’à partir de cet emplacement au moment du démarrage, et non à partir de l’environnement de votre shell.

3. Slug HARDWARE_PROFILE

Le nombre de flux pris en charge par le MV3DT public est répertorié dans le Guide de démarrage rapide de Warehouse, sous la rubrique « Options de déploiement prises en charge par le profil Vision AI du MV3DT ». Utilisez le slug HARDWARE_PROFILE correspondant ci-dessous.

Sélectionnez-le à partir de la commande ` nvidia-smi --query-gpu=name --format=csv,noheader` :

Nom du GPU HARDWARE_PROFILE Flux pris en charge par le MV3DT
RTX PRO 6000 Blackwell RTXPRO6000BW 18
H100 (NVL, SXM HBM3) H100 13
L40S L40S 7
IGX Thor IGX-THOR 4
DGX Spark DGX-SPARK 4

Si le GPU de l'utilisateur ne figure pas dans cette liste, consultez le fichier industry-profiles/warehouse-operations/.env pour connaître les valeurs HARDWARE_PROFILE disponibles, puis vérifiez que le profil correspondant existe bien dans le fichier blueprint-configurator/blueprint_config.yml avant de l'utiliser. Ne déduisez pas le nombre de flux à partir du slug seul.

La limite MV3DT par GPU est appliquée au moment du déploiement. vss-configurator-mv3dt calcule final_stream_count = min(NUM_STREAMS, max_streams_supported) et applique une opération de gestion de fichiers « keep_count » sur ${VSS_DATA_DIR}/videos/${SAMPLE_VIDEO_DATASET}/ afin que seuls les fichiers .mp4 correspondant à final_stream_count soient conservés (triés par ordre lexicographique, les N derniers étant conservés). Si le nombre de flux pris en charge par le MV3DT de votre GPU (tableau ci-dessus) est inférieur au nombre de caméras, les opérations perception / mdx-raw / mdx-bev s’exécutent avec le nombre de flux pris en charge. Choisissez soit un GPU prenant en charge un nombre de flux plus élevé, soit indiquez explicitement cette limite à l’utilisateur afin qu’il sache quels flux seront traités.

4. Données de l’application sur le disque

VSS_DATA_DIR doit pointer vers le répertoire vss-warehouse-app-data extrait (distinct du dépôt). Si vous le pointez vers le répertoire `deploy/docker/` du dépôt, le déploiement se bloque : le configurateur ne parvient pas à trouver le jeu de données, Redis ne peut pas ouvrir son fichier journal et Perception reste à l’état « Créé ». Vérifiez le chemin d’accès avant le déploiement.

Vérification préalable au déploiement :

DATA_DIR="${VSS_DATA_DIR:?VSS_DATA_DIR non défini dans .env}"
DATASET="${SAMPLE_VIDEO_DATASET:-warehouse-4cams-20mx20m-synthetic}"

for sub in videos models data_log; do
  test -d "${DATA_DIR}/${sub}" || { echo "ERREUR : ${DATA_DIR}/${sub} manquant"; exit 1; }
done

# Pour les modes « sample » et « videos » — le répertoire « videos » doit exister
test -d "${DATA_DIR}/videos/${DATASET}" \
  || { echo "ERREUR : ${DATA_DIR}/videos/${DATASET} manquant — slug incorrect ou données de l'application non extraites"; exit 1; }

# Contrôle de cohérence : le nombre de vidéos doit correspondre au nombre de données d'étalonnage.
# Certains archives tar d’app-data publiées contiennent parfois un ensemble de données d’exemple comportant
# moins de vidéos que ne le laisse entendre le nom de l’ensemble de données — vérifiez et récupérez séparément les
# caméras manquantes si la capacité mv3dt de votre GPU est suffisante pour toutes les utiliser.
ls "${DATA_DIR}/videos/${DATASET}/"*.mp4 2>/dev/null | wc -l

# S'assurer que tous les sous-répertoires par service sous data_log/ existent. Kafka / Elasticsearch /
# redis / postgres ainsi que le chemin de téléchargement de l'API d’analyse vidéo (`/web-api-app/files`)
# s’exécutent avec des identifiants utilisateur (UID) non root sur ces montages liés. Sans accès en écriture, les démons
# ou l’étalonnage/l’importation d’images peuvent échouer en raison d’erreurs de permissions.
mkdir -p \
  "${DATA_DIR}/data_log/analytics_cache" \
  "${DATA_DIR}/data_log/calibration_toolkit" \
  "${DATA_DIR}/data_log/elastic/data" \
  "${DATA_DIR}/data_log/elastic/logs" \
  "${DATA_DIR}/data_log/kafka" \
  "${DATA_DIR}/data_log/redis/data" \
  "${DATA_DIR}/data_log/redis/log" \
  "${DATA_DIR}/data_log/vss_video_analytics_api"

# Accorder l’accès en écriture uniquement aux UID spécifiques des conteneurs — ACL à portée limitée, PAS 777 et
# PAS chown. UID (selon data-directory.md) : postgres=70, redis=999, elasticsearch / VST /
# kafka=1000. Le premier appel concerne les fichiers existants ; le second définit des ACL *par défaut* afin que
# les fichiers/répertoires créés par les démons lors de l'exécution (par ex. PGDATA de Postgres) héritent de ces droits d'accès.
ACL='u:70:rwx,u:999:rwx,u:1000:rwx'
setfacl -R    -m "$ACL" "${DATA_DIR}/data_log"
setfacl -R -d -m "$ACL" "${DATA_DIR}/data_log"

Des ACL à portée limitée, et non un chmod 777. Cela n’accorde l’accès qu’aux UID de conteneurs connus — cela ne rendpas data_log accessible en écriture à tout le monde, et cela ne modifie pas le propriétaire (ce qui perturberait le fonctionnement de PostgreSQL / Elasticsearch, car ces derniers se réapproprient leurs répertoires lors du premier démarrage). Privilégiez cette méthode pour les exécutions pilotées par des agents et les hôtes partagés. Le fichier de référence canonique ../vss-deploy-profile/references/data-directory.md documente la commande générale chmod -R 777 ainsi que le tableau des UID par conteneur ; cette compétence utilise à la place l’équivalent avec des ACL à portée limitée . Demandez confirmation à l’utilisateur avant de modifier les permissions de l’hôte.

Nécessite un système de fichiers POSIX-ACL (ext4 / xfs — par défaut) et le paquet acl (setfacl). Si un démon continue d’enregistrer une erreur de permission après le déploiement, identifiez son UID (docker inspect --format '{{.Config.User}}') et ajoutez -m u::rwx aux deux appels.

Si les données de l’application (app-data) ne sont pas encore extraites : téléchargez-les via le registre ngc à l’aide de la ressource download-version « nvidia/vss-warehouse/vss-warehouse-app-data: » puis exécutez tar -xvf (voir references/deploy-rtvi-cv-3d-stack.md pour la recherche des balises et la procédure complète).

5. Vérification préalable (système)

nvidia-smi, runtime Docker NVIDIA visible (docker info | grep -i runtimes), et docker run --rm --gpus all ubuntu:24.04 avec nvidia-smi affichant uniquement des résultats verts. Les vérifications complètes des pilotes, du noyau et des paramètres sysctl se trouvent dans vss-deploy-profile/references/prerequisites.md.

Si une vérification échoue, corrigez le problème avant de continuer — ne passez pas à la phase de déploiement.

6. Accessibilité via un navigateur (hôtes cloud / VPN d’entreprise uniquement)

Si l’utilisateur doit visualiser le mur d’images VST via un navigateur sur un réseau différent de celui de l’hôte de déploiement (machine virtuelle cloud, VPN d’entreprise, session via tunnel SSH), les règles du pare-feu en amont peuvent bloquer VST WebRTC (STUN vers stun.l.google.com:19302, plus des paquets UDP aléatoires pour les médias). Consultez references/verify-and-view.md#browser-reachability pour connaître les symptômes et les solutions de contournement. Par ailleurs : certains hôtes bloquent le port par défaut du microservice AMC (TCP/8010) ; si l'utilisateur signale que l'interface utilisateur AMC sur le port :5000 fonctionne mais que ses appels de données échouent, réessayez avec une valeur différente pour VSS_AUTO_CALIBRATION_PORT.

Dépannage

Lorsqu’une étape de déploiement, d’étalonnage ou de vérification échoue, arrêtez-vous et identifiez la cause de l’échec avant de réessayer. Les vérifications rapides ci-dessous couvrent les erreurs MV3DT les plus courantes ; utilisez references/troubleshooting.md pour les commandes de diagnostic complètes et les solutions, ../vss-generate-video-calibration/SKILL.md pour les échecs du workflow AMC, et ../vss-deploy-profile/references/warehouse-debug.md pour les problèmes plus généraux liés à la pile Warehouse.

Symptôme Cause probable Première vérification ou correction
vss-rtvi-cv-bev-fusion n’est pas opérationnel ou le fichier /tmp/fusion_ready est manquant Le courtier n’est pas prêt, incompatibilité avec MAX_EXPECTED_SENSORS ou incompatibilité avec STREAM_TYPE Vérifiez broker-health-check, exécutez docker inspect --format '{{.State.Health.Status}}' sur vss-rtvi-cv-bev-fusion et mdx-raw / mdx-bev; puis réexécutez references/configure-cameras.md si le nombre de flux diffère
Perception affiche « Sources actives : 0 », aucun FPS ou un nombre de caméras inférieur à celui attendu État obsolète du capteur VST, slug de jeu de données incorrect, étalonnage manquant ou limite de flux par GPU Vérifiez SAMPLE_VIDEO_DATASET, NUM_STREAMS, camInfo/ et la liste des capteurs VST ; si d'anciens capteurs persistent, suivez les instructions de references/teardown.md avant de redéployer
vss-rtvi-cv-mv3dt se ferme avec un message « nœud invalide » de MqttCommunicator ou des échecs de soumission du tracker Les noms des caméras dans les vidéos, le fichier calibration.json et le répertoire camInfo/ ne respectent pas la convention Camera, Camera_01, … Normalisez tous les noms de caméras en suivant les instructions de l’étape 0 du fichier references/configure-cameras.md, puis effacez l’état VST obsolète et redéployez
Échec de la création, du téléchargement, de l’étalonnage ou de l’exportation MV3DT d’un projet AMC Problème lié au service/à l'API AutoMagicCalib en dehors de ce chemin de déploiement MV3DT Utilisez ../vss-generate-video-calibration/SKILL.md pour déployer/déboguer AMC, puis revenez à references/calibration-workflow.md une fois l’exportation réussie
vss-behavior-analytics-mv3dt redémarre avec des erreurs de validation du schéma d’étalonnage L’exportation AMC comporte des champs « groupe », « région » ou « emplacement » vides Appliquez le correctif de l'espace réservé dans references/calibration-workflow.md, étape 4a, ou renseignez ces champs dans AMC avant l'exportation
Le profil étendu ne comporte aucune superposition et vss-import-calibration-output-mv3dt signale dans son journal que le fichier imageMetadata.json est introuvable L’exportation AMC MV3DT n’a pas généré les fichiers images/Top.png et images/imageMetadata.json Générez ces deux fichiers en suivant l'étape 4b du fichier references/calibration-workflow.md, puis relancez l'importateur one-shot
Échec de la récupération des images, du chargement du modèle ou de la compilation du moteur au premier démarrage NGC_CLI_API_KEY manquante ou expirée, VSS_DATA_IR incorrect, fichiers BodyPose3DNet manquants ou mémoire insuffisante sur le GPU Vérifiez à nouveau l’authentification NGC, confirmez la présence de ${VSS_DATA_DIR}/models/mv3dt/BodyPose3DNet/, consultez la fin des journaux vss-rtvi-cv-mv3dt et libérez de la mémoire ou modifiez RT_CV_DEVICE_ID si le GPU est saturé

Avant toute restauration destructive (docker compose down -v, effacement de data_log, suppression de l'état du capteur VST ou modification des listes d'accès de l'hôte), expliquez les conséquences et obtenez la confirmation de l'utilisateur. Enregistrez la commande ayant échoué, les valeurs .env pertinentes, la sortie de docker compose ps et les derniers journaux du conteneur avant d'effectuer des modifications entraînant une réinitialisation de l'état.

Comment tout cela s'articule

SKILL.md (ce fichier — routage Q0/Q1/Q2/Q3)
  └─ si étalonnage manquant ─> calibration-workflow.md
  │                     └─ enchaîne vers vss-generate-video-calibration (déploiement + API Drive)
  │                     └─ récupère /v1/result/{project_id}/mv3dt_result?result_type=amc (plus vggt lorsque le raffinement est activé)
  │                     └─ stocke les fichiers d’étalonnage dans warehouse-mv3dt-app/calibration/sample-data//
  ├─> configure-cameras.md (normalisation du nom de caméra, synchronisation NUM_STREAMS, ajustement du capteur VST)
  └─> deploy-rtvi-cv-3d-stack.md (composition avec bp_wh_kafka_mv3dt + configuration étendue/minimale)
        └─> verify-and-view.md (FPS, fusion_ready, mdx-bev, mur vidéo VST + vérifications WebRTC)

Compétences associées

  • vss-generate-video-calibration — la compétence AMC. Gère le déploiement AMC, la capture RTSP, l’API de calibrage et le hook d’exportation /v1/result/.../mv3dt_result utilisé par cette compétence. calibration-workflow.md s’y enchaîne.
  • vss-deploy-profile — structure globale inter-profils. À utiliser à la place lorsque l’utilisateur souhaite le plan complet de l’entrepôt (avec agents / LLM / VLM), et pas seulement MV3DT.
  • vss-manage-video-io-storage — compétence API VIOS / VST. Utile pour le mur vidéo VST (visualisation par superposition) et pour la gestion des capteurs mentionnée dans configure-cameras.md.

La référence officielle du « warehouse-blueprint » du dépôt, située dans ../vss-deploy-profile/references/warehouse.md, couvre les formats 2D, 3D et MV3DT au sein de la pile complète de l’entrepôt — cette compétence est la version complémentaire dédiée exclusivement à MV3DT qui supprime la couche agent / LLM / VLM.

Voir sur GitHub
---
name: vss-deploy-detection-tracking-3d
description: Deploy and operate the RTVI-CV-3D microservice for multi-camera 3D detection and tracking, supporting sample datasets, custom videos, and RTSP streams.
license: Apache-2.0
---

## Purpose

Deploy and operate the RTVI-CV-3D microservice as MV3DT (`MODE=mv3dt`) — per-camera DeepStream perception plus BEV Fusion over multiple calibrated cameras — on the bundled sample dataset, custom videos, or live RTSP, without the full warehouse agent / LLM / VLM stack.

## Instructions

Work top-to-bottom: answer the routing questions (Q0–Q3) under [Routing](#routing), then follow the reference for the chosen path. Detailed step-by-step procedures live in `references/` (deploy, calibration chain, camera configuration, verification, teardown, troubleshooting).

## Examples

- Enable multi-camera tracking on the sample dataset.
- Deploy RTVI-CV-3D on my videos here: `<path/to/videos>`.
- Run MV3DT on RTSP streams after calibration.

# VSS Deploy Detection & Tracking — 3D (RTVI-CV-3D / MV3DT)

Bring up the RTVI-CV-3D microservice as the MV3DT stack (`MODE=mv3dt`) from the warehouse blueprint: per-camera DeepStream perception (`vss-rtvi-cv-mv3dt`) + BEV Fusion (`vss-rtvi-cv-bev-fusion`) + mosquitto MQTT bus + broker + VST sensor stack — without the agent / LLM / VLM stack that comes with the full warehouse blueprint.

The actual compose machinery lives in `deploy/docker/industry-profiles/warehouse-operations/warehouse-mv3dt-app/`. This skill drives the env overrides, calibration chain, and verification.

## Routing

Ask the user **at most four questions**, then dispatch.

### Q0 — Profile size (overlays or not)

Default to **extended** unless the user explicitly asks for minimal. Extended deploys ELK + `vss-video-analytics-api-mv3dt` + `vss-kibana-init-mv3dt` + `vss-import-calibration-output-mv3dt` on top of MV3DT core — these are what the VST video wall needs to render bounding-box overlays. Without them, the video wall works but shows raw streams without overlays.

| User answer | `MINIMAL_PROFILE` | What you get | When to choose |
|---|---|---|---|
| **extended** (default) | `""` | MV3DT core + ELK + analytics API + Kibana. **Overlays work in VST video wall.** Recommended for a complete e2e experience. | "I want the full e2e experience", "I want to see bounding boxes", or no preference stated |
| **minimal** | `"true"` | MV3DT core only. ~5 fewer containers. **No overlays in VST.** Metadata still on Kafka/Redis. | "I only need the data", "edge / Thor host", "minimum footprint" |

> **Note on selective ELK:** there's no "minimal + ELK only" middle path in the current compose. Every `${MINIMAL_PROFILE:+_extended}`-gated service comes up together (ES, Logstash, Kibana, video-analytics-api, kibana-init, import-calibration). `bash`'s `:+` parameter expansion produces the `_extended` suffix when `MINIMAL_PROFILE` is set; extended switches the gating string back to plain `bp_wh_kafka_mv3dt` which the active compose profile already matches. Either you accept the full extended bundle or you stay minimal.

### Q1 — Data source

Ask this unless the source is explicit in the user's first message. A bare request
like "deploy rtvi-cv-3d" routes to this MV3DT skill (`MODE=mv3dt`), but does
**not** imply `sample`.

- **sample** — the bundled 4-camera synthetic dataset (`warehouse-4cams-20mx20m-synthetic`). Calibration ships in-tree; no AMC run needed.
- **videos** — the user has local video files (any `*.mp4` named after their cameras). Standalone AMC (`auto_calib` profile) will run if calibration is missing.
- **rtsp** — the user has live RTSP URLs. Calibration via VIOS-driven AMC; final deploy also needs a Sensor Info File (`camera_info.json`) with those RTSP URLs.

### Q2 — Calibration coverage (skip for `sample`)

For `videos` and `rtsp`, check whether calibration is already on disk at the mount path the perception container expects:

```bash
DATASET="${SAMPLE_VIDEO_DATASET:?}"          # the user's dataset slug; see Q3
CAL_DIR="${VSS_APPS_DIR}/industry-profiles/warehouse-operations/warehouse-mv3dt-app/calibration/sample-data/${DATASET}"

# Look for ANY of: calibration.json, plus camInfo/*.yml or *.yaml with either
# 'cam_*' or 'Camera*' naming (the shipped sample uses Camera*.yml, AMC may
# produce cam_*.yaml — broaden accordingly)
test -f "${CAL_DIR}/calibration.json" \
  && ls "${CAL_DIR}/camInfo/"*.{yml,yaml} 2>/dev/null
```

If the user supplied a calibration path themselves, validate that path instead — don't recompute. See `configure-cameras.md` for camera-name normalization and authoritative camera-count discovery (parses `calibration.json`).

### Q3 — Detector + dataset slug (only when Q2 triggers AMC)

- `resnet` (default, fast) or `transformer` (slower, better under occlusion) — passed to the AMC `/v1/calibrate/<id>` API at Step B (see `vss-generate-video-calibration/SKILL.md:48-62`).
- A short kebab-case dataset slug used as `SAMPLE_VIDEO_DATASET` (e.g. `customer-aisle-4cams`). This drives the calibration mount path and gets persisted in `.env`.

### Routing table

| Q1 | Q2 result | Path |
|---|---|---|
| `sample` | (cal ships in-tree and already normalized) | [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) directly |
| `videos` | cal present | [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `videos` | cal missing | [`references/calibration-workflow.md`](references/calibration-workflow.md) (videos mode) → [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `rtsp` | cal present | [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `rtsp` | cal missing | [`references/calibration-workflow.md`](references/calibration-workflow.md) (rtsp mode) → [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |

Every path converges on [`references/verify-and-view.md`](references/verify-and-view.md) once `up -d` completes. [`references/troubleshooting.md`](references/troubleshooting.md) and [`references/teardown.md`](references/teardown.md) are linked but off the happy path.

**Disambiguation rule.** In this skill, "RTVI-CV-3D" means the MV3DT microservice deployment and uses `MODE=mv3dt`. Route to [`../vss-deploy-profile/references/warehouse.md`](../vss-deploy-profile/references/warehouse.md) only when the user asks for the full warehouse blueprint, Sparse4D, `MODE=3d`, or `warehouse-3d-app`. This skill is for **MV3DT only** without the agent stack / LLM / VLM.

## Prerequisites

### 1. Repo path

Locate `video-search-and-summarization/` on disk. All compose commands run from `<repo>/deploy/docker/`. If unknown, ask the user.

### 2. NGC CLI + key

`$NGC_CLI_API_KEY` must be set and must have access to `nvidia/vss-core/*` images. See `vss-deploy-profile/references/ngc.md` for setup if missing.

If the user previously ran `ngc config set` but `$NGC_CLI_API_KEY` isn't exported in this shell, the key is already on disk:

```bash
NGC_CLI_API_KEY=$(awk -F'= ' '/^apikey/{print $2}' ~/.ngc/config 2>/dev/null)
test -n "${NGC_CLI_API_KEY}" && echo "key sourced from ~/.ngc/config"
```

Make sure the key value also lands in `industry-profiles/warehouse-operations/.env:164` (`NGC_CLI_API_KEY=...`) — compose only reads it from there at `up` time, not from your shell env.

### 3. `HARDWARE_PROFILE` slug

> The public MV3DT supported stream counts are listed in the Warehouse Quickstart Guide under "MV3DT Vision AI Profile Supported Deployment Options." Use the matching `HARDWARE_PROFILE` slug below.

Pick from `nvidia-smi --query-gpu=name --format=csv,noheader`:

| GPU name | `HARDWARE_PROFILE` | MV3DT supported streams |
|---|---|---|
| RTX PRO 6000 Blackwell | `RTXPRO6000BW` | 18 |
| H100 (NVL, SXM HBM3) | `H100` | 13 |
| L40S | `L40S` | 7 |
| IGX Thor | `IGX-THOR` | 4 |
| DGX Spark | `DGX-SPARK` | 4 |

If the user's GPU is not listed here, check `industry-profiles/warehouse-operations/.env` for available `HARDWARE_PROFILE` values, then confirm the matching profile exists in `blueprint-configurator/blueprint_config.yml` before using it. Do not infer a stream count from the slug alone.

**The per-GPU MV3DT cap is enforced at deploy time.** `vss-configurator-mv3dt` computes `final_stream_count = min(NUM_STREAMS, max_streams_supported)` and applies a `keep_count` file-management op against `${VSS_DATA_DIR}/videos/${SAMPLE_VIDEO_DATASET}/` so only `final_stream_count` `.mp4` files remain (sorted lexicographically, last N kept). If your GPU's MV3DT supported stream count (above table) is below your camera count, perception / `mdx-raw` / `mdx-bev` run with the supported stream count. Either pick a GPU with a higher supported stream count or surface the cap explicitly to the user so they're aware which streams will be processed.

### 4. App data on disk

`VSS_DATA_DIR` must point at the **extracted `vss-warehouse-app-data` directory** (separate from the repo). Pointing it at the repo's `deploy/docker/` causes the deploy to stall: the configurator can't find the dataset, redis can't open its log file, and perception stays in `Created`. Verify the path before deploy.

Pre-flight check before deploy:

```bash
DATA_DIR="${VSS_DATA_DIR:?VSS_DATA_DIR not set in .env}"
DATASET="${SAMPLE_VIDEO_DATASET:-warehouse-4cams-20mx20m-synthetic}"

for sub in videos models data_log; do
  test -d "${DATA_DIR}/${sub}" || { echo "ERROR: ${DATA_DIR}/${sub} missing"; exit 1; }
done

# For sample / videos modes — videos directory must exist
test -d "${DATA_DIR}/videos/${DATASET}" \
  || { echo "ERROR: ${DATA_DIR}/videos/${DATASET} missing — wrong slug or app-data not extracted"; exit 1; }

# Sanity: video count should match calibration count.
# Some published app-data tarballs are known to ship the sample dataset with
# fewer videos than the dataset name implies — verify and source any missing
# cams separately if your GPU's mv3dt cap is high enough to use them all.
ls "${DATA_DIR}/videos/${DATASET}/"*.mp4 2>/dev/null | wc -l

# Ensure every per-service subdir under data_log/ exists. kafka / elasticsearch /
# redis / postgres and the video-analytics API upload path (`/web-api-app/files`)
# run as non-root UIDs against these bind mounts. Without write access the daemons
# or calibration/image import can fail with permission errors.
mkdir -p \
  "${DATA_DIR}/data_log/analytics_cache" \
  "${DATA_DIR}/data_log/calibration_toolkit" \
  "${DATA_DIR}/data_log/elastic/data" \
  "${DATA_DIR}/data_log/elastic/logs" \
  "${DATA_DIR}/data_log/kafka" \
  "${DATA_DIR}/data_log/redis/data" \
  "${DATA_DIR}/data_log/redis/log" \
  "${DATA_DIR}/data_log/vss_video_analytics_api"

# Grant write access to the specific container UIDs only — scoped ACLs, NOT 777 and
# NOT chown. UIDs (per data-directory.md): postgres=70, redis=999, elasticsearch / VST /
# kafka=1000. The first call covers existing files; the second sets *default* ACLs so
# files/dirs the daemons create at runtime (e.g. postgres PGDATA) inherit the access.
ACL='u:70:rwx,u:999:rwx,u:1000:rwx'
setfacl -R    -m "$ACL" "${DATA_DIR}/data_log"
setfacl -R -d -m "$ACL" "${DATA_DIR}/data_log"
```

> **Scoped ACLs, not `chmod 777`.** This grants only the known container UIDs access — it does
> **not** make `data_log` world-writable, and it does **not** `chown` (which would break postgres /
> Elasticsearch, since they re-own their dirs on first start). Prefer this for agent-driven runs and
> shared hosts. The canonical [`../vss-deploy-profile/references/data-directory.md`](../vss-deploy-profile/references/data-directory.md)
> documents the broad `chmod -R 777` and the per-container UID table; this skill uses the scoped-ACL
> equivalent instead. **Ask the user for confirmation before changing host permissions.**
>
> Requires a POSIX-ACL filesystem (ext4 / xfs — the default) and the `acl` package (`setfacl`). If a
> daemon still logs a permission error after deploy, find its UID
> (`docker inspect <container> --format '{{.Config.User}}'`) and add `-m u:<uid>:rwx` to both calls.

If app-data isn't extracted yet: download via `ngc registry resource download-version "nvidia/vss-warehouse/vss-warehouse-app-data:<version>"` and `tar -xvf` (see [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) for tag discovery and full steps).

### 5. Pre-flight (system)

`nvidia-smi`, NVIDIA Docker runtime visible (`docker info | grep -i runtimes`), and `docker run --rm --gpus all ubuntu:24.04 nvidia-smi` all green. Full driver / kernel / sysctl checks live in `vss-deploy-profile/references/prerequisites.md`.

If any check fails, fix before continuing — don't proceed to deploy.

### 6. Browser reachability (cloud / corp-VPN hosts only)

If the user will view the VST video wall through a browser on a different network than the deploy host (cloud VM, corp VPN, ssh-tunnelled session), upstream firewall rules may block VST WebRTC (STUN to `stun.l.google.com:19302`, plus random UDP for media). See [`references/verify-and-view.md#browser-reachability`](references/verify-and-view.md) for symptoms and workarounds. Also: some hosts block the AMC microservice's default port (TCP/8010); if the user reports the AMC UI on `:5000` works but its data calls fail, retry with a different `VSS_AUTO_CALIBRATION_PORT`.

## Troubleshooting

When any deploy, calibration, or verification step fails, stop and classify the failure before retrying. The quick checks below cover the most common MV3DT errors; use [`references/troubleshooting.md`](references/troubleshooting.md) for full diagnostic commands and fixes, [`../vss-generate-video-calibration/SKILL.md`](../vss-generate-video-calibration/SKILL.md) for AMC workflow failures, and [`../vss-deploy-profile/references/warehouse-debug.md`](../vss-deploy-profile/references/warehouse-debug.md) for broader warehouse-stack issues.

| Symptom | Likely cause | First check or fix |
|---|---|---|
| `vss-rtvi-cv-bev-fusion` is unhealthy or `/tmp/fusion_ready` is missing | Broker not ready, `MAX_EXPECTED_SENSORS` mismatch, or `STREAM_TYPE` mismatch | Check `broker-health-check`, `docker inspect --format '{{.State.Health.Status}}' vss-rtvi-cv-bev-fusion`, and `mdx-raw` / `mdx-bev`; then re-run [`references/configure-cameras.md`](references/configure-cameras.md) if stream counts differ |
| Perception shows `Active sources : 0`, no FPS, or fewer cameras than expected | Stale VST sensor state, wrong dataset slug, missing calibration, or per-GPU stream cap | Verify `SAMPLE_VIDEO_DATASET`, `NUM_STREAMS`, `camInfo/`, and the VST sensor list; if old sensors remain, follow [`references/teardown.md`](references/teardown.md) before redeploying |
| `vss-rtvi-cv-mv3dt` exits with `MqttCommunicator` "invalid node" or tracker submit failures | Camera names in videos, `calibration.json`, and `camInfo/` do not match the `Camera`, `Camera_01`, ... convention | Normalize all camera names together with [`references/configure-cameras.md`](references/configure-cameras.md) Step 0, then clear stale VST state and redeploy |
| AMC project creation, upload, calibration, or MV3DT export fails | AutoMagicCalib service/API issue outside this MV3DT deploy path | Use [`../vss-generate-video-calibration/SKILL.md`](../vss-generate-video-calibration/SKILL.md) to deploy/debug AMC, then return to [`references/calibration-workflow.md`](references/calibration-workflow.md) after export succeeds |
| `vss-behavior-analytics-mv3dt` restarts with calibration schema validation errors | AMC export has empty `group`, `region`, or `place` fields | Apply the placeholder patch in [`references/calibration-workflow.md`](references/calibration-workflow.md) Step 4a, or populate those fields in AMC before export |
| Extended profile has no overlays and `vss-import-calibration-output-mv3dt` logs `imageMetadata.json not found` | AMC MV3DT export did not produce `images/Top.png` and `images/imageMetadata.json` | Synthesize both files with [`references/calibration-workflow.md`](references/calibration-workflow.md) Step 4b, then restart the one-shot importer |
| Image pulls, model load, or first-start engine build fail | Missing / expired `NGC_CLI_API_KEY`, incorrect `VSS_DATA_DIR`, missing BodyPose3DNet files, or GPU OOM | Re-check NGC auth, confirm `${VSS_DATA_DIR}/models/mv3dt/BodyPose3DNet/`, tail `vss-rtvi-cv-mv3dt` logs, and free or change `RT_CV_DEVICE_ID` if the GPU is exhausted |

Before destructive recovery (`docker compose down -v`, clearing `data_log`, deleting VST sensor state, or changing host ACLs), explain the impact and get user confirmation. Capture the failing command, relevant `.env` values, `docker compose ps`, and the last container logs before making state-reset changes.

## How it fits together

```
SKILL.md (this file — Q0/Q1/Q2/Q3 routing)
  └─ if cal missing ─> calibration-workflow.md
  │                     └─ chains to vss-generate-video-calibration (deploy + drive API)
  │                     └─ fetches /v1/result/{project_id}/mv3dt_result?result_type=amc (plus vggt when refinement is enabled)
  │                     └─ lands calibration files at warehouse-mv3dt-app/calibration/sample-data/<slug>/
  ├─> configure-cameras.md (camera-name normalization, NUM_STREAMS sync, VST sensor trim)
  └─> deploy-rtvi-cv-3d-stack.md (compose up with bp_wh_kafka_mv3dt + extended/minimal)
        └─> verify-and-view.md (FPS, fusion_ready, mdx-bev, VST video wall + WebRTC checks)
```

## Related Skills

- [`vss-generate-video-calibration`](../vss-generate-video-calibration/SKILL.md) — the AMC skill. Owns AMC deployment, RTSP capture, calibration API, and the `/v1/result/.../mv3dt_result` export hook this skill consumes. `calibration-workflow.md` chains into it.
- [`vss-deploy-profile`](../vss-deploy-profile/SKILL.md) — cross-profile umbrella. Use that instead when the user wants the **full warehouse blueprint** (with agents / LLM / VLM), not just MV3DT.
- [`vss-manage-video-io-storage`](../vss-manage-video-io-storage/SKILL.md) — VIOS / VST API skill. Useful for the VST video wall (overlay viz) and for sensor management referenced in `configure-cameras.md`.

The repo's authoritative warehouse-blueprint reference at [`../vss-deploy-profile/references/warehouse.md`](../vss-deploy-profile/references/warehouse.md) covers 2D / 3D / MV3DT inside the full warehouse stack — this skill is the **MV3DT-only** companion that trims the agent / LLM / VLM layer.

Installer vss-deploy-detection-tracking-3d

Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.

Télécharger le ZIP

Clonez le dépôt et copiez les fichiers de compétence dans votre projet.

git clone https://github.com/NVIDIA/skills/tree/main/skills/vss-deploy-detection-tracking-3d # Copy SKILL.md to your .claude/skills/ directory

Copier Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera automatiquement la compétence et l'utilisera
Dépôt NVIDIA/skills

Compétences similaires

klingai-upgrade-migration
Heure mise à jour 3 juillet 2026
Verification &amp; Quality Assurance
Heure mise à jour 29 juin 2026
base44-cli
Heure mise à jour 29 juin 2026
Railway CLI Management
Heure mise à jour 2 juillet 2026
OR