File size: 1,701 Bytes
a8e7fe6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Generate the graded-degradation robustness set (dataset/robust).

One scam + one bill, 6 degradation kinds x 3 intensity levels + 2 clean
baselines = 38 images. Run:
    .venv\\Scripts\\python.exe scripts\\make_robust_set.py
"""

from __future__ import annotations

import json
import os
import random
import sys

sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "src"))

from guardian import letterforge  # noqa: E402

KINDS = ("blur", "dim", "rotate", "perspective", "shadow", "noise")


def main() -> None:
    out_dir = os.path.join("dataset", "robust")
    os.makedirs(out_dir, exist_ok=True)
    rng = random.Random(2026)
    cases = [("scam", letterforge.gift_card_scam(rng)),
             ("bill", letterforge.utility_bill(rng))]

    rows = []
    for tag, gold in cases:
        base, _ = letterforge.render_gold(gold, rng, degrade=False)
        variants = [("clean", 0, base)]
        variants += [(k, lvl, letterforge.degrade_graded(base, k, lvl))
                     for k in KINDS for lvl in (1, 2, 3)]
        for kind, level, img in variants:
            fname = f"{tag}_{kind}_{level}.png"
            img.convert("RGB").save(os.path.join(out_dir, fname))
            rows.append({"file": fname, "tag": tag, "kind": kind, "level": level,
                         "signal_ids": gold.signal_ids,
                         "acceptable_levels": list(gold.acceptable_levels)})

    with open(os.path.join(out_dir, "labels.jsonl"), "w", encoding="utf-8") as f:
        for row in rows:
            f.write(json.dumps(row, ensure_ascii=False) + "\n")
    print(f"wrote {len(rows)} images to {out_dir}")


if __name__ == "__main__":
    main()