Releases: rsasaki0109/visual-map-localizer
v0.2.1 — corrected Cambridge eval numbers
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
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
testpathsextended 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
First public release of visual-map-localizer — a single-image 6DoF Visual Positioning System on top of COLMAP / hloc.
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
solvePnPRansacfallback - 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@masterSee 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.
