File size: 2,382 Bytes
59630ba | 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 | """Check every requested case and fixed Minecraft reference cache before full evaluation."""
import argparse
import json
from pathlib import Path
import sys
import numpy as np
import torch
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "shared"))
from protocol import _scene_file, select_cases
parser = argparse.ArgumentParser()
parser.add_argument("--minecraft-root", type=Path, required=True)
parser.add_argument("--re10k-root", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
manifests = Path(__file__).resolve().parent / "manifests"
errors = []
mc = select_cases(manifests / "minecraft_test_300.csv")
for row in mc:
relative = Path(row["relative_path"])
video = args.minecraft_root / relative
feature = args.minecraft_root / "vae_features" / relative.parent / f"{relative.stem}_vae_feature.npy"
required = [video, video.with_suffix(".npz"), feature]
missing = [str(path) for path in required if not path.is_file()]
if missing:
errors.extend(missing)
continue
with np.load(video.with_suffix(".npz")) as data:
if min(len(data["actions"]), len(data["poses"])) < int(row["target_end"]):
errors.append(f"Short annotation: {video}")
z = np.load(feature, mmap_mode="r")
if z.dtype != np.float16 or z.shape[1:] != (16, 18, 32) or len(z) < int(row["target_end"]):
errors.append(f"Incompatible fixed reference cache: {feature}")
re = select_cases(manifests / "re10k_real_trajectory_h100_f399_scopes_v1.csv", "final100")
for row in re:
try:
_scene_file(args.re10k_root, "test_256", row["scene_id"], ".mp4")
path = _scene_file(args.re10k_root, "test_poses", row["scene_id"], ".pt")
pose = torch.load(path, map_location="cpu", weights_only=True)
if pose.ndim != 2 or pose.shape[1] != 18 or len(pose) < int(row["history_start"]) + 200 or not torch.isfinite(pose).all():
errors.append(f"Invalid camera annotation: {path}")
except ValueError as error:
errors.append(str(error))
result = {"minecraft_cases": len(mc), "re10k_cases": len(re), "errors": errors}
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(result, indent=2) + "\n")
print(json.dumps(result, indent=2))
sys.exit(1 if errors or len(mc) != 300 or len(re) != 100 else 0)
|