"""Geometric baselines: exact reprojection, z-buffer, hole filling and the evidence labels.""" import importlib.util from pathlib import Path import numpy as np import torch from mcss.dynamic.types import OnlineObservation from mcss.geometry import generate_rays from mcss.mechanism_pilot.rgbd_evidence_carrier import RGBDContext from mcss.types import Cameras def script(): path = Path(__file__).parents[1] / "scripts" / "run_rgbd_geometric_baselines.py" spec = importlib.util.spec_from_file_location("run_rgbd_geometric_baselines", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def camera(tx=0.0, height=24, width=32, focal=20.0): intrinsics = torch.tensor( [[focal, 0.0, (width - 1) / 2], [0.0, focal, (height - 1) / 2], [0.0, 0.0, 1.0]] ) c2w = torch.eye(4) c2w[0, 3] = tx return Cameras(intrinsics, c2w, (height, width)) def plane_distance(cam, z): """Ray distance from `cam` to the plane Z = z (cameras look along +Z).""" origins, rays = generate_rays(cam.to(dtype=torch.float64)) return (z - origins[..., 2]) / rays[..., 2] def test_reprojection_recovers_a_plane_seen_from_a_shifted_camera(): m = script() source, target = camera(0.0), camera(0.15) depth = plane_distance(source, 3.0).to(torch.float32) context = RGBDContext([OnlineObservation("s", 0, torch.zeros(3, 24, 32), source)], depth[None]) reprojected, hit = m.reproject(m.context_points(context), target) truth = plane_distance(target, 3.0).numpy() assert hit.mean() > 0.8 assert (np.abs(reprojected[hit] - truth[hit]) / truth[hit]).max() < 0.02 def test_zbuffer_keeps_the_nearest_sample_and_the_fill_rules(): m = script() points = torch.tensor([[0.0, 0.0, 2.0], [0.0, 0.0, 5.0]], dtype=torch.float64) depth, hit = m.reproject(points, camera()) assert hit.sum() == 1 and np.isclose(depth[hit][0], 2.0) assert np.allclose(m.fill_nearest(depth, hit, 9.0), 2.0) constant = m.fill_constant(depth, hit, 9.0) assert np.isclose(constant[hit][0], 2.0) and np.allclose(constant[~hit], 9.0) empty = np.full((4, 4), np.inf) assert np.allclose(m.fill_nearest(empty, np.zeros((4, 4), bool), 9.0), 9.0) def test_labels_follow_the_frozen_evidence_rule(): m = script() base = { "mean": 0.1, "ci95": [0.05, 0.15], "positive": 8, "tied": 0, "negative": 0, "n_scenes": 8, } assert m.label(base) == "ABOVE" worse = {**base, "mean": -0.1, "ci95": [-0.15, -0.05], "positive": 0, "negative": 8} assert m.label(worse) == "BELOW" assert m.label({**base, "ci95": [-0.01, 0.2]}) == "NOT_DISTINGUISHABLE"