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)