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 | Où | 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_1moyenne 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 étapesscripts/run_captioning.py— moteur de capture (gt / ref / hyp)scripts/multi_judge.py— moteur de juge ; utilise le CLIclaudelocal, donc aucuneANTHROPIC_API_KEYn'est nécessairescripts/score.py— notation par chunk danssummary.csvscripts/aggregate_table.py— le rapport