File size: 2,114 Bytes
80c945e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
# Copyright 2026 Everpaper. Licensed under the Apache License, Version 2.0 (see ../LICENSE).
"""Write `preprocess-cases.json`: for every image in tests/images/, the SHA-256 of the decoded 8-bit RGB buffer and
of the resized buffer, plus the sizes and the soft-token count, computed with the Python reference preprocessing
(python/eg2_image.py, itself bit-identical to torchvision's uint8 bicubic). `eg2-cli pixcheck` compares the Swift
decoder + resampler against it. Lossy (JPEG) cases are flagged: decoders differ by a few values per sample there.

    python3 make_preprocess_cases.py [--images images] [--out preprocess-cases.json]
"""
from __future__ import annotations

import argparse
import hashlib
import json
import sys
from pathlib import Path

HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE.parent / "python"))
import eg2_image  # noqa: E402


def main() -> None:
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument("--images", default=str(HERE / "images"))
    ap.add_argument("--out", default=str(HERE / "preprocess-cases.json"))
    args = ap.parse_args()
    items = json.loads((Path(args.images) / "manifest.json").read_text())
    cases = []
    for it in items:
        rgb = eg2_image.load_rgb(Path(args.images) / it["file"])
        th, tw = eg2_image.target_size(rgb.shape[0], rgb.shape[1])
        res = eg2_image.resize_bicubic_aa_u8(rgb, th, tw)
        vi = eg2_image.patchify_cell_major(res)
        cases.append(dict(file=f"{Path(args.images).name}/{it['file']}", width=int(rgb.shape[1]), height=int(rgb.shape[0]),
                          resized_width=tw, resized_height=th, n_soft=vi.n_soft, lossy=bool(it.get("lossy", False)),
                          decoded_sha256=hashlib.sha256(rgb.tobytes()).hexdigest(), resized_sha256=hashlib.sha256(res.tobytes()).hexdigest()))
        print(cases[-1]["file"], f"{rgb.shape[1]}x{rgb.shape[0]} -> {tw}x{th}, n={vi.n_soft}")
    Path(args.out).write_text(json.dumps(cases, indent=1) + "\n")
    print("wrote", args.out)


if __name__ == "__main__":
    main()