File size: 2,776 Bytes
1a12965
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/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()