File size: 3,004 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 76 77 78 79 80 81 82 83 | #!/usr/bin/env python
"""Generate plain full-page images (no dashboard overlay) for normal vs. extreme
multi-degradation cases, for slides.
Reuses the same two configurations as scripts/generate_multiple_degradation_gallery.py
("normal": configs/generate.yaml's realistic per-effect probabilities, unmodified)
and scripts/generate_multiple_degradation_extreme_gallery.py ("extreme": every
effect pushed to high probability/strength plus worst-case placement/rendering),
but writes the bare rendered page instead of the multi-panel debug figure, since
slides just need the document image plus a short caption.
Usage:
python scripts/generate_case_assets.py
"""
from __future__ import annotations
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from PIL import Image
from src.config.loader import load_config
from src.generator import GeneratorContext
from scripts.generate_multiple_degradation_extreme_gallery import build_overrides as extreme_overrides
ROOT = Path(__file__).resolve().parents[1]
TEMPLATE_ID = "bank_doc_05"
N_SAMPLES = 2
def _run_case(out_dir: Path, config_path, overrides: list[str]) -> None:
out_dir.mkdir(parents=True, exist_ok=True)
config = load_config(config_path=config_path, overrides=overrides)
ctx = GeneratorContext(config)
manifest = {}
for i in range(1, N_SAMPLES + 1):
meta, final_image, _ = ctx.run_sample(i)
Image.fromarray(final_image).save(out_dir / f"case_{i}.png")
effects = meta["augmentation"]["effects"]
applied = [n for n, r in effects.items() if r["applied"]]
manifest[f"case_{i}"] = {
"applied_effects": applied,
"n_applied": len(applied),
"n_total": len(effects),
"difficulty_score": meta["difficulty"]["score"],
"difficulty_tier": meta["difficulty"]["tier"],
"placement": {
"rotation_deg": meta["placement"]["rotation_deg"],
"scale_factor": meta["placement"]["scale_factor"],
"misplaced": meta["placement"]["misplaced"],
},
}
print(f"[{out_dir.parent.name}/case_{i}] {len(applied)}/{len(effects)} effects, "
f"difficulty={meta['difficulty']['score']:.3f} ({meta['difficulty']['tier']})")
(out_dir / "case_manifest.json").write_text(json.dumps(manifest, indent=2), encoding="utf-8")
def main() -> None:
# Normal: configs/generate.yaml's realistic "varied batch" probabilities, unmodified.
_run_case(
ROOT / "multiple_degradation" / "case_assets",
ROOT / "configs" / "generate.yaml",
[f"document.template={TEMPLATE_ID}", "generation.run_validation=false"],
)
# Extreme: every effect pushed high, worst-case placement/rendering.
_run_case(
ROOT / "multiple_degradation_extreme" / "case_assets",
None,
extreme_overrides(),
)
print("\nDone.")
if __name__ == "__main__":
main()
|