| """S23DR 2026 submission: rayv9_learnt_baseline_snap |
| |
| Pipeline per scene: |
| 1. v1d heatmap -> spatial NMS -> rays |
| 2. rays + SfM -> voxel volume -> RayVoxelTransformer -> hybrid NMS -> vertices |
| 3. fuse_and_sample -> learned baseline -> wireframe |
| 4. midpoint-snap baseline verts to v9, append unmatched v9 verts |
| |
| Val HSS (100 scenes): baseline=0.352 snap=0.411 (+0.059, wins=85/100) |
| Vertex F1@0.5=0.494 F1@1.0=0.685 |
| |
| Usage: |
| # local smoke-test on training split (n scenes) |
| python script.py --mode local --n_scenes 10 |
| |
| # competition submission (reads params.json, writes submission.json) |
| python script.py |
| """ |
| import argparse |
| import json |
| import time |
| from pathlib import Path |
|
|
| import numpy as np |
| import torch |
|
|
| import v9_inference as v9 |
| import baseline_inference as bl |
| from snap import snap_midpoint_plus_unmatched |
| from s23dr_2026_example.point_fusion import FuserConfig |
|
|
| SCRIPT_DIR = Path(__file__).resolve().parent |
| V1D_CKPT = SCRIPT_DIR / "v1d_checkpoint.pt" |
| V9_CKPT = SCRIPT_DIR / "v9_checkpoint.pt" |
| BASELINE_CKPT = SCRIPT_DIR / "baseline_checkpoint.pt" |
|
|
|
|
| def empty_solution(): |
| return np.zeros((2, 3)), [(0, 1)] |
|
|
|
|
| def run(dataset, v1d_model, v9_model, v9_img_size, bl_model, device, n_scenes=None): |
| cfg = FuserConfig() |
| rng = np.random.RandomState(2718) |
| solution = [] |
| processed = 0 |
| t0 = time.time() |
|
|
| for subset_name in dataset: |
| print(f"\nProcessing {subset_name}...", flush=True) |
| for sample in dataset[subset_name]: |
| if n_scenes is not None and processed >= n_scenes: |
| break |
| order_id = sample["order_id"] |
|
|
| v9_verts = np.zeros((0, 3)) |
| try: |
| v9_verts = v9.predict_vertices( |
| sample, v1d_model, v9_model, v9_img_size, device) |
| except Exception as e: |
| print(f" v9 failed {order_id}: {e}", flush=True) |
|
|
| bl_result = None |
| try: |
| fused = bl.fuse_and_sample(sample, cfg, rng) |
| if fused is not None: |
| bl_result = bl.predict(fused, bl_model, device) |
| except Exception as e: |
| print(f" baseline failed {order_id}: {e}", flush=True) |
|
|
| if bl_result is None: |
| pred_v, pred_e = empty_solution() |
| else: |
| pred_v, pred_e = snap_midpoint_plus_unmatched(bl_result[0], bl_result[1], v9_verts) |
|
|
| solution.append({ |
| "order_id": order_id, |
| "wf_vertices": pred_v.tolist(), |
| "wf_edges": [(int(a), int(b)) for a, b in pred_e], |
| }) |
| processed += 1 |
| elapsed = time.time() - t0 |
| print(f" [{processed}] {order_id} " |
| f"v9={len(v9_verts)} bl={'ok' if bl_result else 'fail'} " |
| f"{elapsed:.0f}s elapsed", flush=True) |
|
|
| return solution |
|
|
|
|
| def load_models(device): |
| print("Loading v1d...", flush=True) |
| v1d_model = v9.load_v1d(V1D_CKPT, device) |
| print("Loading v9...", flush=True) |
| v9_model, v9_img_size = v9.load_v9(V9_CKPT, device) |
| print("Loading baseline...", flush=True) |
| bl_model = bl.load_model(BASELINE_CKPT, device) |
| return v1d_model, v9_model, v9_img_size, bl_model |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--mode", choices=["local", "submit"], default="submit", |
| help="local: stream from hoho22k_2026_trainval training split; " |
| "submit: read params.json and use test data") |
| parser.add_argument("--n_scenes", type=int, default=None, |
| help="cap number of scenes (local mode)") |
| args = parser.parse_args() |
|
|
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| print(f"Device: {device}", flush=True) |
|
|
| v1d_model, v9_model, v9_img_size, bl_model = load_models(device) |
|
|
| from datasets import load_dataset |
|
|
| if args.mode == "local": |
| print("Mode: local (hoho22k_2026_trainval / train split)", flush=True) |
| dataset = load_dataset("usm3d/hoho22k_2026_trainval", split="train", |
| streaming=True, trust_remote_code=True) |
| |
| dataset = {"train": dataset} |
| else: |
| print("Mode: submit", flush=True) |
| with open("params.json") as f: |
| params = json.load(f) |
| print(f"Competition: {params.get('competition_id', '?')}", flush=True) |
| data_path = Path("/tmp/data") |
| if not data_path.exists(): |
| from huggingface_hub import snapshot_download |
| snapshot_download(repo_id=params["dataset"], local_dir="/tmp/data", |
| repo_type="dataset") |
| data_files = { |
| "validation": [str(p) for p in data_path.rglob("*public*/**/*.tar")], |
| "test": [str(p) for p in data_path.rglob("*private*/**/*.tar")], |
| } |
| dataset = load_dataset( |
| str(data_path / "hoho22k_2026_test_x_anon.py"), |
| data_files=data_files, |
| trust_remote_code=True, |
| writer_batch_size=100, |
| ) |
| print(f"Loaded: {dataset}", flush=True) |
|
|
| solution = run(dataset, v1d_model, v9_model, v9_img_size, bl_model, |
| device, n_scenes=args.n_scenes) |
|
|
| with open("submission.json", "w") as f: |
| json.dump(solution, f) |
| print(f"\nSaved submission.json ({len(solution)} entries)", flush=True) |
|
|