Skip to content

Releases: rsasaki0109/visual-map-localizer

v0.2.1 — corrected Cambridge eval numbers

01 May 08:03

Choose a tag to compare

Patch release. No localizer code changed — this only fixes the evaluation methodology and the documented numbers.

What happened

While auditing the v0.2.0 release ("did our localizer actually estimate correctly?") we found that the Sim(3) alignment between our SfM and the NVM ground-truth frame was being biased by a handful of train images that our own SfM happened to misregister (2 / 231 on ShopFacade, 13 / 895 on Old Hospital). Those train poses had multi-metre residuals against NVM and dragged the least-squares Sim(3) fit, which then inflated the test errors we computed against the (slightly off) reference frame.

scripts/evaluate_cambridge.py score now defaults to a robust IRLS Sim(3) fit (drop pairs whose residual exceeds 5× median, refit, repeat). The legacy LS behaviour is still available via --no-robust-sim3.

Corrected numbers

Success Median rot Median trans (% of scene)
south-building (unchanged) 10/10 0.066° 0.034 %
Cambridge ShopFacade 103 / 103 0.61° (was 0.93°) 0.23 % (was 0.49 %)
Cambridge Old Hospital 182 / 182 1.11° (unchanged) 1.37 % (was 1.42 %)

ShopFacade is now in Active Search (~0.12 m / 0.4°) territory — the v0.2.0 numbers were conservative, not overstated.

Notes

  • The successful localization rate is unchanged because that came from the localizer's own success flag, not from the alignment.
  • Users on v0.2.0 are not operationally affected — only the documented expectation changes.

See the CHANGELOG for the full diff vs v0.2.0.

v0.2.0 — outlier-rejection gate + two more Cambridge scenes

01 May 06:48

Choose a tag to compare

This release caps two main improvements over v0.1.0.

ROS2 outlier-rejection gate

VPS occasionally returns confident-but-wrong poses (the matcher latches onto a different floor of the same building). inliers / reproj_error alone cannot tell those apart from good poses, so vps_node now feeds every accepted localization through a velocity-based gate before publishing it. New parameters:

Param Default Meaning
outlier_max_linear_velocity_mps 10.0 poses implying > N m/s wrt the last accepted pose are rejected
outlier_max_angular_velocity_dps 60.0 poses implying > N deg/s wrt the last accepted pose are rejected
outlier_state_timeout_sec 30.0 gate state self-resets after a long quiet gap so the node can re-anchor

Set either threshold to <= 0 to disable. The gate logic lives in pose_gate.PoseGate (rclpy-free) and is covered by 8 new unit tests.

More public-dataset evidence

Two extra Cambridge Landmarks scenes were verified end-to-end with the same evaluate_cambridge.py harness:

Success Median rot Median trans (% of scene)
south-building (v0.1.0) 10/10 0.066° 0.034 %
Cambridge ShopFacade 103 / 103 0.93° 0.49 %
Cambridge Old Hospital 182 / 182 1.11° 1.42 %

100% query success across both scenes.

Other changes

  • README no longer cites hardware-specific wall times or GPU model names; the latency section is now a short prose explanation of the architectural levers.
  • pytest testpaths extended so CI also collects the ros2 helper tests (rclpy-touching tests skip cleanly when ROS isn't installed).

See the full CHANGELOG.

Install

pip install -e ".[deep]"
pip install git+https://github.com/cvg/Hierarchical-Localization.git@master

(Or skip [deep] for the lightweight non-DL surface — see README.)

v0.1.0 — first public release

30 Apr 20:57

Choose a tag to compare

First public release of visual-map-localizer — a single-image 6DoF Visual Positioning System on top of COLMAP / hloc.

demo

Highlights

  • CLI: visual-map-localizer build-map / localize / inspect
  • Python API: VisualMapLocalizer().localize(path or np.ndarray) for persistent servers
  • ROS2 node: /camera/image_raw/vps_pose (PoseWithCovarianceStamped)
  • Two pipelines: SuperPoint+LightGlue (default) or DISK+LightGlue (Apache-2.0 friendly)
  • PnP: pycolmap primary path, OpenCV solvePnPRansac fallback
  • Lightweight install: lazy imports keep the test surface usable without torch / hloc

Verified on South-Building (118 db / 10 query)

Metric Value
Success rate 10 / 10
Rotation error median 0.066°, max 0.174°
Translation error median 0.034 % of scene extent, max 0.043 %
Reprojection error 1.25 – 2.99 px
Steady-state latency 1.4 s / frame (RTX 4070 Ti SUPER, ndarray API)

Install

Lightweight (PnP / I/O / tests only):

pip install -e .

Full retrieval + matching pipeline:

pip install -e .[deep]
pip install git+https://github.com/cvg/Hierarchical-Localization.git@master

See the README
for the Quick Start block, the CHANGELOG for the full list of items in this release.

Caveats

  • Outdoor strong illumination / seasonal change is hard for NetVLAD + SuperPoint — see docs/limitations.md.
  • SuperPoint / SuperGlue weights are research-licensed; use DISK + LightGlue for commercial settings.