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.