File size: 1,886 Bytes
355f250 | 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 | """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()
|