Skip to content

splatreg 1.3.0: MAC seed, the honest verdict, and the production sweep

Choose a tag to compare

@Archerkattri Archerkattri released this 10 Jun 12:35
· 19 commits to main since this release

splatreg 1.3.0

The production-sweep release: the MAC maximal-clique seed with its honest measured verdict, the align-without-merge workflow, and a full code/docs audit. Every claim below traces to a recorded run or a test (RESULTS.md).

init="mac": maximal-clique correspondence seed (Zhang et al., CVPR 2023)

Pure torch + networkx reimplementation (pip install "splatreg[mac]"): SC2-weighted rigidity compatibility graph, Bron-Kerbosch maximal cliques as consensus hypotheses, weighted SVD per clique, plus a Sim(3) extension via the median pairwise-distance-ratio scale. Measured (tests/test_mac.py):

  • matches the fast-init RANSAC engine at 30/60/90% random outliers (rot err <= 0.2 deg);
  • decisively wins the structured-decoy regime: on a 90%-contaminated set with a reflection-consistent decoy cluster the greedy-prefilter+RANSAC engine fails at ~78 deg while MAC stays < 0.2 deg;
  • all-outlier sets return an honest success=False identity, never a silent wrong pose;
  • 500 correspondences run in ~0.1 s on a 2-thread CPU.

The official-split verdict, stated honestly

seed_selector="mac" runs MAC over GeoTransformer's learned correspondences on the full official 3DMatch/3DLoMatch splits (same forward, same native 0.025 voxel, same residual-gated refine; only the hypothesis stage differs). Result: a wash, not a lift. 3DLoMatch 72.1% mean / 74.6% pooled (MAC) vs 72.5% / 74.4% (LGR); 3DMatch 91.7% / 93.8% vs 91.5% / 93.5%; every delta within plus or minus 4 pairs, at ~+50% runtime. At native voxel the learned correspondences are already consensus-dominated (median 600-800 MAC inliers), so seed_selector="lgr" stays the default and "mac" remains the tool for genuinely contaminated correspondence sets (RESULTS.md section 5k).

Carried forward from 1.2.0 (same-day release)

  • SH Wigner rotation: higher-order SH bands (f_rest) now rotate with the splat in apply_transform / merge / the align CLI (Ivanic-Ruedenberg real-basis Wigner-D, 3DGS sign convention); rotated-coefficient evaluation matches an independent basis evaluator to ~2.4e-15 in float64.
  • Public apply_transform() and the single-forward align-without-merge workflow: register two scans, bake the recovered SE(3)/Sim(3) into the source, keep both scans as separate registered PLYs.
  • Photometric exposure compensation (default ON) and the coarse-to-fine render ladder: a x1.3 tint that absorbed into the Sim(3) scale (0.10% -> 3.99% scale error) recovers to 0.47% with compensation; the 32-64-96 ladder lands 2.55 deg where a cold single rung stalls at 5.61 deg.
  • Pose covariance: builtin-LM solves expose info["information"] / info["covariance"] for pose-graph weighting (None when singular, never faked).

Production sweep

  • Dead code removed, ruff clean across package/tests/benchmarks; CLI and the Colab notebook now use the public apply_transform.
  • README restructured as a storefront: capability matrix vs the alternative splat tools, results table with per-row provenance.
  • Docs refreshed: https://archerkattri.github.io/splatreg/ (MAC verdict, SH rotation, covariance, align-without-merge).
  • CHANGELOG.md added.

Gate

143 tests passing (CPU, CUDA_VISIBLE_DEVICES=""), validate_recovery.py --fast 6/6 cells within gate, mkdocs build --strict clean.

Install: pip install splatreg==1.3.0 · Docs: https://archerkattri.github.io/splatreg/ · Cite: DOI 10.5281/zenodo.20618389