Skip to content

v1.4.0 — zero-shot BUFFER-X seed: 6.4× low-overlap recall on official 3DLoMatch

Latest

Choose a tag to compare

@Archerkattri Archerkattri released this 02 Jul 02:22
· 9 commits to main since this release

Added

  • init="bufferx": a zero-shot learned seed via BUFFER-X (ICCV 2025, "Towards Zero-Shot
    Point Cloud Registration in Diverse Scenes", MIT-SPARK/BUFFER-X) — a single generalist model
    that registers across sensors/scales with no per-dataset training — refined by the same
    overlap-aware ICP (+ Sim(3) scale) as "learned"/"robust". Optional and lazily loaded
    (mirrors the GeoTransformer backend); falls back to "robust" with a logged note when its
    built CUDA extensions / Hugging Face weights are absent. Setup:
    splatreg/third_party_models/README-BUFFERX.md; full modern-stack build recipe
    (CUDA 12.8 / sm_120 / torch 2.11 / numpy 2.x) in docs/BUFFERX_BUILD_MODERN_CUDA.md. Added to
    the register/splatreg align --init choices.
  • register(init="learned", seed_gate=True): an opt-in (default off) Decision-PCR-style
    (arXiv 2507.14965) confidence gate that scores the learned seed (mutual-NN inlier ratio + SC²
    spatial consistency, reusing the mac rigidity machinery) and rejects/reseeds a low-confidence
    hypothesis from the classical "robust" path before LM refinement, instead of blindly refining
    the top seed. Scores surface in result.info["seed_gate"]. Tests:
    tests/test_bufferx_seedgate.py (fallback path + gate accepts good seed / rejects planted decoy).

Fixed

  • BUFFER-X weight loading: the pretrained checkpoints are full-model state_dicts (keys
    prefixed Desc./Pose.), so loading them into the .Desc/.Pose submodules under
    strict=False matched nothing and silently ran on random weights (garbage seeds). Now loaded
    into the whole model, so init="bufferx" produces real seeds (commit c54d8c9).

Changed

  • Declared minimum dependency floors in pyproject.toml (torch>=2.1, numpy>=1.24) instead of
    unpinned torch/numpy, so a fresh install resolves an interpreter with the tensor APIs the
    package actually uses.
  • tests/test_cli.py::test_console_script_registered now skips (was a hard failure) when the
    splatreg console-script entry point is not installed in the environment, with a note to run
    pip install -e .; the assertion still runs and is meaningful once the package is installed.

Verified

  • init="bufferx" built and run on real 3DMatch, both seeds pushed through the identical
    splatreg refine so the comparison isolates the seed. Complete official gt.log pair sets
    (recall = RRE < 15° and RTE < 0.3 m): 3DMatch (8/8 scenes, n=1619) BUFFER-X seed recall
    0.962 (median RRE 1.46°) vs the classical robust FPFH seed 0.630 (2.12°);
    official 3DLoMatch (n=1781) BUFFER-X 0.777 (2.77°) vs classical 0.122 (103.4°) —
    6.4× the recall where the classical seed's median error is effectively random. BUFFER-X wins
    every scene on both splits.
  • Earlier GT-derived run (pairs derived from the fragments' .info.txt poses, 50/scene, all 8
    scenes): high-overlap (overlap ≥ 0.3, n=371) BUFFER-X 0.965 (median RRE 1.70°) vs 0.569 (3.04°);
    low-overlap 3DLoMatch regime (overlap 0.10–0.30, n=400) 0.752 (3.23°) vs 0.092 (107.9°) — an 8×
    recall lift where classical FPFH collapses to ~random. BUFFER-X wins all 8 scenes in both regimes.
  • Caveat: both seeds share the lighter feature_align refine — a fair head-to-head that isolates
    the seed, but not the full-pipeline absolute numbers.

Removed

  • The ScanNet-GSReg (GaussReg ECCV'24) benchmark harness and all references to it.
    The dataset is not readily available, so the real-data validation anchor is the
    controlled-capture harness (realdata_bench.py / bundle_real_bench.py) instead.