vss-evaluate-caption-accuracy

Par nvidia-ai-blueprints · video-search-and-summarization

Mesurez si une modification de configuration d'un RT-VLM a altéré la qualité des légendes — capturez des légendes de référence et candidates pour un ensemble de vidéos, évaluez-les toutes deux par rapport à une vérité terrain à l'aide d'un juge LLM, et produisez un tableau de précision et de temps de traitement. À utiliser lors de modifications des paramètres de sélection de frames, de décodage ou de modèle, lorsque vous avez besoin de preuves qu'il n'y a pas de régression de précision.

npx skills add https://github.com/nvidia-ai-blueprints/video-search-and-summarization --skill vss-evaluate-caption-accuracy

Objectif

Répondre à une seule question avec preuves : ce changement RT-VLM a-t-il dégradé les sous-titres ?

Un changement de configuration qui économise du temps de traitement n'est utile que si la qualité des sous-titres se maintient. Cette compétence capture les sous-titres deux fois sur les mêmes vidéos — une fois avec le changement (HYP) et une fois sans (REF) — note les deux contre une vérité terrain utilisant un juge LLM, et rapporte le delta de précision aux côtés du temps économisé.

Prérequis

Tout sauf le juge s'exécute à l'intérieur du conteneur RT-VLM. Le conteneur a besoin d'un GPU, du modèle sur disque, et du plugin DeepStream nvdsframeselector (fourni avec DeepStream dans l'image RT-VLM).

Prérequis Notes
Conteneur RT-VLM en cours d'exécution Nom par défaut rtvi_vlm-$USER. Démarrez-le avant d'exécuter une étape
Poids du modèle Définissez MODEL_PATH dans le .env du déploiement. Les exécutions ici ont utilisé Qwen3-VL-32B-Instruct ; tout VLM compatible vLLM fonctionne
VLM_MODEL_TO_USE=vllm-compatible Dans le .env du déploiement
Vidéos sources Un répertoire de fichiers .mp4. Pointez DEDUP_DIR vers celui-ci
OPENAI_API_KEY Dans le .env du déploiement. Nécessaire uniquement pour l'étape gt (la vérité terrain est gpt-4.1)
claude CLI sur l'hôte Le juge l'exécute. Il n'est pas installé dans le conteneur

Chemins vidéo et carte de scènes

scripts/run_captioning.py mappe un nom de fichier à un nom de scène court dans son dictionnaire SCENES. Ajoutez vos propres vidéos :

SCENES = {
    "warehouse.mp4":               "warehouse",
    "GoPro5_10min_compressed.mp4": "new_warehouse",
    # "<your-file>.mp4":           "<scene-name>",
}

Les noms de scènes sont ce que vous passez sur la ligne de commande ; les fichiers sont résolus à l'intérieur de DEDUP_DIR. Une scène dont le fichier manque est ignorée avec un avertissement.

Configuration du modèle

La compétence ne choisit pas de modèle — elle hérite de la configuration du conteneur, et ne définit que les paramètres testés. Les deux bras exécutent le même modèle pour que la comparaison isole le changement de configuration, pas le checkpoint.

Étapes

Elles s'exécutent à différents endroits, invoquez-les séparément :

Étape Quoi
gt conteneur Vérité terrain de gpt-4.1. Coûteux — exécutez une fois par ensemble de vidéos et réutilisez via GT_SRC
capture conteneur Paires REF + HYP par scène, dos à dos
judge hôte claude-opus-4-8 note REF et HYP contre GT, par chunk
table l'un ou l'autre Précision + temps économisé en markdown, optionnellement contre une exécution baseline
# 0. vérité terrain (une fois par ensemble de vidéos)
docker exec -e DESC=my-run -w /workspace rtvi_vlm-$USER \
  bash skills/benchmarking/vss-evaluate-caption-accuracy/scripts/run_eval.sh gt scene-a scene-b

# 1. capture — paires REF + HYP
docker exec -e DESC=my-run -w /workspace rtvi_vlm-$USER \
  bash skills/benchmarking/vss-evaluate-caption-accuracy/scripts/run_eval.sh capture scene-a scene-b

# 2. judge — sur l'hôte, pas dans le conteneur
DESC=my-run bash skills/benchmarking/vss-evaluate-caption-accuracy/scripts/run_eval.sh judge scene-a scene-b

# 3. table
DESC=my-run bash skills/benchmarking/vss-evaluate-caption-accuracy/scripts/run_eval.sh table scene-a scene-b

Remplacez -w /workspace par le chemin où le référentiel est monté dans votre conteneur.

Paramètres

Var Par défaut Signification
DESC eval-<date> Nom de l'exécution. Tout se termine dans results/<DESC>/
VSS_REPO_DIR /workspace Chemin où le référentiel est monté à l'intérieur du conteneur
RTVI_CONTAINER rtvi_vlm-$USER Nom du conteneur où exécuter
MODEL_PATH non défini Épinglez un checkpoint pour les deux bras. Non défini hérite du .env propre du conteneur. Quand défini, il est aussi utilisé comme RTVI_MODEL_PATH_ALLOWLIST, que VLM_TRUST_REMOTE_CODE=true requiert
DEDUP_DIR <repo>/videos Répertoire contenant les vidéos sources
SFC non défini NVDS_FSELECT_STATIC_FRAME_COUNT — frames émis pour un chunk classé STATIC. Non défini laisse le plugin par défaut
GT_SRC $DESC Exécution à partir de laquelle copier gt.txt, pour qu'une vérité terrain serve plusieurs exécutions
BASELINE aucun Exécution à comparer dans table
RESULTS_ROOT <skill>/results Où les dossiers d'exécution vivent
HYP_VER v1 Lequel de hyp_<desc>_vN.txt juger
MAX_WORKERS 32 Concurrence du juge

Pourquoi REF et HYP sont capturés par paires

La génération de sous-titres REF est non-déterministe d'une exécution à l'autre. Juger HYP contre un REF capturé dans une session différente a modifié les deltas par scène jusqu'à 0,05 — plus grand que la plupart des effets mesurés. capture exécute donc HYP et REF dos à dos par scène en une seule session. Seul GT est réutilisé, car il est coûteux et provient d'un modèle différent.

Lecture du résultat

table écrit results/<DESC>/summary.md : précision et temps de traitement par scène, détail du F1 entité/événement du juge LLM, et — avec BASELINE — l'effet supplémentaire par rapport à cette exécution. Les totaux sont pondérés par chunk, donc une scène à 60 chunks n'a pas le même poids qu'une à 14 chunks.

Deux mises en garde :

  • Vérifiez d'abord le plancher de bruit. Les exécutions répétées d'une configuration identique ont varié ~0,01 sur une seule scène, et le delta REF/HYP a changé de signe entre elles. Un delta plus petit que cela est « inchangé », pas « amélioré ». Si un résultat importe, répétez-le.
  • Un score combiné plat peut masquer des axes compensatoires. combined_score_macro_0_1 moyenne les F1 d'entité, événement, événement critique et interaction. Le F1 d'interaction est souvent quelques échantillons et porte peu de signal, il peut donc masquer un mouvement d'entité-F1 réel. Lisez le bloc détail F1, pas seulement la colonne combinée.

Vérifier qu'un changement était neutre au comportement

La traçabilité au niveau frame est une preuve plus forte que les totaux correspondants. Quand la sélection de frames est active, le plugin enregistre une ligne par chunk :

grep -oE 'EOS OF-only -> [0-9]+' results/<DESC>/server_logs/hyp_<scene>.log \
  | grep -oE '[0-9]+$' | tail -n <chunks> | sort -n | uniq -c

Les comptes de frames identiques par chunk sur deux exécutions signifient que le sélecteur a choisi les mêmes frames. Les comptes de chunks correspondants seuls ne suffisent pas. Les premières valeurs appartiennent au préchauffage du pipeline plutôt qu'à la scène, prenez donc les <chunks> dernières entrées.

Contenu

  • scripts/run_eval.sh — les quatre étapes
  • scripts/run_captioning.py — moteur de capture (gt / ref / hyp)
  • scripts/multi_judge.py — moteur de juge ; utilise le CLI claude local, donc aucune ANTHROPIC_API_KEY n'est nécessaire
  • scripts/score.py — notation par chunk dans summary.csv
  • scripts/aggregate_table.py — le rapport

Skills similaires