Skip to content

Batched probabilistic Camera–LiDAR refinement

The CPU implementation captures invariant correspondence distributions once per solve and evaluates points with NumPy arrays. It avoids repeatedly normalizing the same pose quaternion and dispatching Python geometry for each point of every candidate. Candidate generation, stopping, confidence gates, fit-only acceptance and disjoint holdout remain unchanged. No optional accelerator dependency is needed.

Scope Previous median Current median Observed ratio
Complete fresh worker 29.920 s 10.352 s 2.890x
Artifact-backed API, including schema validation 21.965 s 2.005 s 10.954x

Two alternating fresh-process pairs use one BLAS thread and retain all four workers. The two complete pair ratios are 2.913x and 2.867x on an unreserved host. These measurements establish neither a portable speed guarantee nor a speedup for feature extraction, D2D initialization or the complete raw-sensor calibration stack. Whole-worker time includes imports, artifact parsing, capture, optimization, holdout, saving, schema validation and frozen-import verification. No warmup is discarded.

The workload uses nine original KITTI raw scans from 2011_09_30_drive_0018_sync, selecting 1,024 points per scan. Image means are generated by projecting those points through declared pinhole, MEI and double-sphere cameras with fixed pixel noise and anisotropic covariance. This is an execution control with public geometry, not independently measured image correspondences or extrinsic accuracy evidence. All 9,216 selected points remain in both variants: 7,168 train and 2,048 hold out. Both variants converge and accept the candidate after exactly 325 evaluations.

Every complete result field matches exactly, including all candidate objectives, acceptance, selected pose and holdout metrics. Only source commit provenance and creation timestamps differ. The implementation retains the scalar normalization, Hamilton-product and projection arithmetic order; distortion powers still use Python float power. It preserves native sum order and scalar handling of ambiguous nonfinite covariance expressions. Captures belong to the current solve, with a conservative 128 MiB capture estimate. Larger inputs and sets whose frames all contain fewer than 64 correspondences retain scalar evaluation. This avoids array-dispatch overhead on tiny problems.

Correctness checks cover all camera models and uncertainty ablations, near-plane gates, invalid optical denominators, snapshots, bounded-memory fallback, overflowed covariance, the small-input boundary, complete optimization traces, rollback and holdout-only changes. The measured runtime passes 73 tests. Public APIs and all core schemas retain their signatures and definitions.

The complete indexed archive contains every successful result, measurement and log, source capsules/manifests, launcher, input hashes and correctness receipt. The earlier dense-only candidate's four-worker cohort (4.065x whole, with substantial baseline variation) remains in earlier-dense-v2; it is not pooled with this final-runtime comparison. The archive also retains the initial failed schema-kind validation attempt, which contributes no successful timing. Raw KITTI coordinates and generated correspondence files are not redistributed.

Reproduce

Install the ordinary development dependencies and obtain the original KITTI raw scans under their upstream terms. The prior runtime is 2c82d9ef625673d9c236320af75b60b7dab6765f; the measured candidate is 0ea59903716ab2e269abf8f7d9e8f93444137fb7.

python -m tools.benchmark_probabilistic_refinement \
  --build-kitti-fixture path/to/2011_09_30_drive_0018_sync \
  --points-per-frame 1024 --output-dir outputs/projected-control
python -m tools.benchmark_probabilistic_refinement \
  --correspondence outputs/projected-control/correspondence.json \
  --problem outputs/projected-control/problem.json \
  --baseline-commit 2c82d9ef625673d9c236320af75b60b7dab6765f \
  --repetitions 2 --max-evaluations 400 --output-dir outputs/refinement-pairs
python -m tools.audit_probabilistic_refinement_benchmark \
  docs/assets/probabilistic_pose_batching

Use fresh output directories. The builder processes the scans present in the supplied directory; use the nine archived raw input identities to reproduce this workload. Arbitrary schema-valid correspondence/problem artifacts can also be compared directly without the generated fixture. The audit checks published results and source capsules on CPU without importing CuPy or Numba.