Préparer les entrées d'AnomalyGenNext
La première action fige les identités de faux-négatifs éligibles, isole chaque masque FN dans sa boîte englobante, sélectionne un masque du même type déterministe, et émet les specs d'embedding propre et FN. La deuxième action consomme ces résultats d'embedding, préserve chaque paire FN-propre, et exécute le placement automatique natif de masque (AMP) du conteneur AnomalyGenNext. L'action finale accepte uniquement les paires pour lesquelles les deux branches de masque ont réussi l'AMP, puis fige les entrées de génération exactes et leurs hashs.
Contrat d'entrée
Commencez par assets/default_filtering.yaml. Le parquet gap doit contenir :
image_id filepath gap_type bbox class split
dataset_id texture_id defect_class anomaly_type fn_mask_source
L'identité est explicite : anomaly_type doit égaler
texture_id+defect_class. La préparation n'a intentionnellement aucune inférence de nom de fichier ou de disposition de répertoire. Un appelant adaptant un dataset inconnu doit normaliser ces champs avant cette limite.
Les références propres sont résolues indépendamment pour chaque FN/type routé. Un répertoire manquant ou un répertoire sans images supportées ignore uniquement les FNs affectés avec la raison no_clean_reference_images ; cela ne désactive pas les autres types.
Chaque dataset sélectionné mappe à un checkpoint et une recipe affinés existants. La recipe doit déclarer le type d'anomalie exact, et defect_spec.jsonl doit contenir sa définition de placement. Les définitions routées par texte exigent un roi_prompt_defect_location non vide. La disposition du pool est :
POOL/TEXTURE/clean_image/*
POOL/TEXTURE/mask/DEFECT/*
Action
Exécutez via la plateforme sélectionnée après l'examen de lancement commun :
scripts/prepare_anomalygennext_inputs.py \
--config /path/to/filtering.yaml \
--pool-dataset-root /path/to/anomalygen_pool \
--output-dir /new/result/root
La racine de sortie ne doit pas exister. L'action émet fn_queries.parquet,
selected_fn_queries.parquet, mask_selection.parquet, clean_pool.parquet,
deux specs tao-generate-image-embeddings, la config de filtrage copiée, et
input_contract.json. L'éligibilité du masque est évaluée par FN. Le contrat énumère les ID FN éligibles ainsi que les ID FN ignorés stables et les raisons lisibles par machine ; les FNs ignorés sont absents de chaque requête, embedding, masque et entrée AMP. Les masques donneurs sont essayés dans un ordre déterministe jusqu'à ce qu'un donneur du même type valide soit trouvé.
Si aucun FN ne survit, la préparation émet uniquement un input_contract.json SKIPPED
avec raison no_eligible_false_negatives. Des skip_counts détaillés, des enregistrements par FN et des preuves d'avertissement distinguent les références propres manquantes des échecs d'éligibilité du masque. N'exécutez pas d'embeddings ou d'AMP pour cette non-opération typée, et ne la représentez pas comme un succès de génération. Un saut partiel émet des preuves d'avertissement tandis que les specs contiennent uniquement les FNs éligibles.
pool_dataset_root est une entrée de dossier au niveau utilisateur pour le workflow. La plateforme l'étage une fois et conserve la liaison entre sa source et le chemin visible au calcul transmis à la préparation. La préparation fige ce chemin de calcul dans filtering_config.yaml, chaque chemin de fichier propre dans clean_pool.parquet, et input_contract.json. Le contrat déclare le même dossier typé comme entrée en aval en lecture seule pour l'embedding d'image propre et l'AMP. Chaque conteneur ultérieur doit remonter la source d'origine à ce chemin de calcul exact ; les arguments de script générés sont la plomberie de plateforme, pas de nouveaux choix utilisateur.
Exécutez les deux specs émises via tao-generate-image-embeddings, en préservant le même encodeur. L'action d'embedding d'image propre doit consommer
input_contract.json.downstream_inputs.clean_embeddings pour que les chemins du pool dans son parquet se résolvent. L'action d'embedding FN a pareillement besoin de montages pour les chemins d'image source déjà portés par son parquet d'entrée. Placez les deux sorties sous embeddings/ nommées par les specs, puis soumettez l'action run_amp :
scripts/run_anomalygennext_amp.py \
--prepared-root /temporary/execution/root \
--published-root /persistent/result/root \
--pool-dataset-root /path/to/anomalygen_pool \
--checkpoint-root /workspace/paidf-anomalygen/checkpoints
run_amp charge toujours la config figée en dessous de --prepared-root ; il n'accepte pas de second config. Son argument de pool typé confirme que la plateforme a remonté le dossier au chemin déjà figé dans la config et les parquets.
Cela écrit knn_candidates.parquet, la requête AMP native, et
amp/testcase.jsonl. Quand l'exécution utilise le stockage temporaire, --published-root
enregistre les emplacements persistants qui contiendront les résultats sauvegardés. La racine de checkpoint complète est une entrée typée requise montée au chemin canonique /workspace/paidf-anomalygen/checkpoints de l'image. Avant le travail GPU,
run_amp vérifie le cache Qwen épinglé, le amp.model_id configuré comme un modèle local direct complet ou un snapshot Hugging Face, et
facebook/sam2.1-hiera-large/sam2.1_hiera_large.pt ; un fichier SAM2 monté séparément ne satisfait pas
le contrat de runtime natif. La plateforme sélectionnée doit honorer le
checkpoint_root.container_path déclaré ; la feuille refuse un point de montage différent.
Finalisez la sortie sauvegardée dans cette racine de résultat persistant :
scripts/finalize_anomalygennext_inputs.py --prepared-root /existing/result/root
Le finaliseur écrit le statut de paire, les paires sélectionnées, les masques alignés copiés, les JSONL testcase et provenance par dataset, et un plan de génération plus manifeste d'intégrité. Une image propre est unique uniquement au sein d'un FN ; les FNs séparés peuvent la réutiliser. Les skills de plateforme possèdent l'étage et le placement en cache.
Portes
- Préservez chaque FN au niveau de la boîte comme un
fn_iddistinct. - Produisez exactement deux masques par FN : FN isolé et même-type déterministe.
- Ignorez un FN invalide sans interrompre les autres FNs éligibles.
- Intégrez une image source répétée une fois tout en préservant chaque ligne de requête FN.
- Exigez des masques alignés réussis, non vides et non-pleine-image pour les deux branches.
- Ne déduisez jamais un type d'anomalie ou un prompt de placement.
- Refusez la réutilisation de sortie et ne mutez jamais un pool d'entraînement.
- Les skills de plateforme possèdent l'étage transitoire, les caches et la copie-retour.
Lisez references/input-contract.md lors de l'édition du parquet normalisé ou
du mapping de dataset.