"""Create small BCHW data with the multi-scale SatMAE++ protocol.""" import json from pathlib import Path import numpy as np import torch from torch.nn import functional as F import yaml import argparse ROOT = Path(__file__).resolve().parents[1] def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--config", type=Path, default=ROOT / "conf/config.yaml") parser.add_argument("--output", type=Path, default=None) args = parser.parse_args() cfg = yaml.safe_load(args.config.read_text()) d, rng = cfg["data"], np.random.default_rng(cfg["seed"]) out = args.output or ROOT / d["root"]; out.mkdir(parents=True, exist_ok=True) shape = (d["train_samples"], d["channels"], d["image_size"], d["image_size"]) test_shape = (d["test_samples"], d["channels"], d["image_size"], d["image_size"]) def make_split(split_shape): images = rng.random(split_shape, dtype=np.float32) payload = { "images": images, "labels": rng.integers(d["num_classes"], size=split_shape[0], dtype=np.int64), } tensor = torch.from_numpy(images) for scale in d["scales"]: if scale != 1: payload[f"images_{scale}x"] = F.interpolate( tensor, scale_factor=scale, mode="bilinear", align_corners=False ).numpy() return payload np.savez_compressed(out / "train.npz", **make_split(shape)) np.savez_compressed(out / "test.npz", **make_split(test_shape)) (out / "format.json").write_text(json.dumps({ "format": "BCHW", "high_resolution_fields": [f"images_{scale}x" for scale in d["scales"] if scale != 1], "scales": d["scales"], "protocol": d["protocol"], "data_source": "synthetic", }, indent=2) + "\n") print("created", out / "train.npz", out / "test.npz") if __name__ == "__main__": main()