minih33-smoothloopv3 / configs /pick_samples.py
AdwolfCzar's picture
Upload configs/pick_samples.py with huggingface_hub
787b29f verified
Raw History Blame Contribute Delete
2.06 kB
#!/usr/bin/env python3
"""Sorteia 3 clipes para os previews de acompanhamento do treino.
Criterios (decididos com o usuario):
- primeiro frame como imagem de condicao (a caption H3 ancora "<Picture 1> em 0.00s");
- tres aspect ratios visualmente diferentes, para o preview cobrir paisagem,
retrato e algo intermediario/quadrado;
- pixels quadrados de verdade: o preparador rejeita SAR anamorfico, entao so
entram clipes com SAR 1:1 / N/A;
- >= 124 frames, para o preview de 124f nao sair de um clipe mais curto.
"""
from __future__ import annotations
import argparse, json, random
from pathlib import Path
OK_SAR = {"1:1", "0:1", "N/A"}
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--inventory", required=True, type=Path)
ap.add_argument("--seed", type=int, default=42)
a = ap.parse_args()
rows = [r for r in json.loads(a.inventory.read_text()) if "error" not in r]
rows = [r for r in rows if r["caption"] and r["frames"] >= 124
and r["sar"] in OK_SAR and r["w"] and r["h"]]
# Faixas de aspect: paisagem larga, quadrado-ish, retrato.
faixas = {
"paisagem": lambda ar: ar >= 1.3,
"quadrado": lambda ar: 0.8 <= ar < 1.3,
"retrato": lambda ar: ar < 0.8,
}
rng = random.Random(a.seed)
escolhidos = []
for nome, teste in faixas.items():
pool = [r for r in rows if teste(r["w"] / r["h"])]
if not pool:
print(f"# sem candidatos para {nome}")
continue
r = rng.choice(pool)
escolhidos.append(r)
cap = Path(r["path"]).with_suffix(".txt").read_text(encoding="utf-8-sig")
gatilho = next((g for g in ("A static", "A slow", "A smooth", "An intense",
"A turntable", "A chroma-key") if g + " looping" in cap), "?")
print(f"# {nome:9s} {r['w']}x{r['h']} ar={r['w']/r['h']:.2f} "
f"{r['frames']}f tipo={r['folder']} gatilho='{gatilho}'")
for r in escolhidos:
print(r["path"])
if __name__ == "__main__":
main()