"""Create temporary fMoW-style temporal tensors and labels.""" import json from pathlib import Path import numpy as np import yaml ROOT = Path(__file__).resolve().parents[1] def main(): config = yaml.safe_load((ROOT / "conf/config.yaml").read_text()) d = config["data"] out = ROOT / d["root"] out.mkdir(exist_ok=True) rng = np.random.default_rng(config["seed"]) def make_split(samples): shape = (samples, d["frames"], d["channels"], d["image_size"], d["image_size"]) images = rng.random(shape, dtype=np.float32) timestamps = np.stack( ( rng.integers(0, 21, size=(samples, d["frames"])), rng.integers(0, 12, size=(samples, d["frames"])), rng.integers(0, 24, size=(samples, d["frames"])), ), axis=-1, ).astype(np.float32) order = np.argsort(timestamps[..., 0] * 12 * 24 + timestamps[..., 1] * 24 + timestamps[..., 2], axis=1) images = np.take_along_axis(images, order[:, :, None, None, None], axis=1) timestamps = np.take_along_axis(timestamps, order[..., None], axis=1) labels = rng.integers(d["num_classes"], size=samples, dtype=np.int64) return images, timestamps, labels train = make_split(d["train_samples"]) test = make_split(d["test_samples"]) np.savez_compressed(out / "train.npz", images=train[0], timestamps=train[1], labels=train[2]) np.savez_compressed(out / "test.npz", images=test[0], timestamps=test[1], labels=test[2]) (out / "format.json").write_text(json.dumps({ "format": "BTCHW", "timestamp_format": "BT3: year_offset_2002, month_zero_based, hour", "source_protocol": d["protocol"], "data_source": "synthetic", }, indent=2) + "\n") print("created", out / "train.npz", out / "test.npz") if __name__ == "__main__": main()