Venket / scripts /generate_verification_suite.py
venki101's picture
Add files using upload-large-folder tool
1a12965 verified
Raw History Blame Contribute Delete
2.78 kB
#!/usr/bin/env python
"""Generate a labeled sample batch covering all 12 verification test-case types.
For each ``case_type`` in ``src.verification.case_types.CASE_TABLE`` (1a
through 5b), generates a couple of samples via ``GeneratorContext`` directly
(bypassing ``DatasetGenerator`` since each case needs its own config
override), writes the rendered PNGs + metadata JSONs to
``output/verification_suite/``, and prints a verdict/reject_code summary
table.
Usage:
python scripts/generate_verification_suite.py [--per-case N]
"""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from src.config.loader import load_config
from src.generator import GeneratorContext
from src.metadata.metadata_exporter import MetadataExporter
from src.utils.image_io import save_image_rgb
from src.verification.case_types import CASE_TABLE
ROOT = Path(__file__).resolve().parents[1]
OUT_DIR = ROOT / "output" / "verification_suite"
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--per-case", type=int, default=2, help="Samples to generate per case type.")
parser.add_argument("--seed", type=int, default=4242, help="Master seed.")
args = parser.parse_args()
OUT_DIR.mkdir(parents=True, exist_ok=True)
exporter = MetadataExporter()
summary_rows = []
sample_index = 1
for code in CASE_TABLE:
config = load_config(
config_path=str(ROOT / "configs" / "examples" / "verification_cases.yaml"),
overrides=[f"quality.case_type={code}", f"seed={args.seed}"],
)
ctx = GeneratorContext(config)
for _ in range(args.per_case):
sample_id = f"case_{sample_index:03d}"
metadata, final_image, _ = ctx.run_sample(sample_index)
metadata["document_id"] = sample_id
save_image_rgb(OUT_DIR / f"{sample_id}.png", final_image)
exporter.export(metadata, OUT_DIR / f"{sample_id}.json")
v = metadata["verification"]
summary_rows.append({
"sample_id": sample_id, "case_type": code, "template": metadata["template"],
"box_id": v["target_box_id"], "verdict": v["verdict"], "reject_code": v["reject_code"],
})
print(f"[{sample_id}] case_type={code:<3} template={metadata['template']:<12} "
f"box={v['target_box_id']:<5} -> {v['verdict']:<7} {v['reject_code'] or '-'}")
sample_index += 1
(OUT_DIR / "summary.json").write_text(json.dumps(summary_rows, indent=2), encoding="utf-8")
print(f"\nWrote {len(summary_rows)} samples to {OUT_DIR}")
if __name__ == "__main__":
main()