Paul-Edouard Sarlin*
·
Mihai Dusmanu*
Johannes L. Schönberger
·
Pablo Speciale
·
Lukas Gruber
·
Viktor Larsson
·
Ondrej Miksik
·
Marc Pollefeys
LaMAR includes multi-sensor streams recorded by AR devices along hundreds of unconstrained trajectories captured over 2 years in 3 large indoor+outdoor locations.
This repository hosts the source code for LaMAR, a new benchmark for localization and mapping with AR devices in realistic conditions. The contributions of this work are:
- A dataset: multi-sensor data streams captured by AR devices and laser scanners
- scantools: a processing pipeline to register different user sessions together
- A benchmark: a framework to evaluate algorithms for localization and mapping
See our ECCV 2022 tutorial for an overview of LaMAR and of the state of the art of localization and mapping for AR.
This codebase is composed of the following modules:
lamar
: evaluation pipeline and baselines for localization and mappingscantools
: data API, processing tools and pipeline- ScanCapture: a data recording app for Apple devices
We introduce a new data format, called Capture, to handle multi-session and multi-sensor data recorded by different devices. A Capture object corresponds to a capture location. It is composed of multiple sessions and each of them corresponds to a data recording by a given device. Each sessions stores the raw sensor data, calibration, poses, and all assets generated during the processing.
from scantools.capture import Capture
capture = Capture.load('data/CAB/')
print(capture.sessions.keys())
session = capture.sessions[session_id] # each session has a unique id
print(session.sensors.keys()) # each sensor has a unique id
print(session.rigs) # extrinsic calibration between sensors
keys = session.trajectories.key_pairs() # all (timestamp, sensor_or_rig_id)
T_w_i = sessions.trajectories[keys[0]] # first pose, from sensor/rig to world
More details are provided in the specification document.
1️⃣ Install the core dependencies:
- Python >= 3.8
- hloc and its dependencies, including COLMAP built from source
- everything listed in
requirements/lamar.txt
installed with
python -m pip install -r requirements/lamar.txt
2️⃣ Optional: the processing pipeline additionally relies on heavier dependencies not required for benchmarking:
- Pip dependencies:
python -m pip install -r requirements/scantools.txt
- raybender for raytracing
- pcdmeshing for pointcloud meshing
3️⃣ Optional: install lamar
and scantools
as libraries for external use via
python -m pip install -e .
1️⃣ Obtain the evaluation data: visit the dataset page and place the 3 scenes in ./data
:
data/
├── CAB/
│ └── sessions/
│ ├── map/ # mapping session
│ ├── query_hololens/ # HoloLens test queries
│ ├── query_phone/ # Phone test queries
│ ├── query_val_hololens/ # HoloLens validation queries
│ └── query_val_phone/ # Phone validation queries
├── HGE
│ └── ...
└── LIN
└── ...
Each scene contains a mapping session and queries for each device type. We provide a small set of validation queries with known ground-truth poses such that they can be used for developing algorithms and tuning parameters. We keep private the ground-truth poses of the test queries.
2️⃣ Run the single-frame evaluation with the strongest baseline:
python -m lamar.run \
--scene $SCENE --ref_id map --query_id $QUERY_ID \
--retrieval fusion --feature superpoint --matcher superglue
where $SCENE
is in {CAB,HGE,LIN}
and $QUERY_ID
is in {query_phone,query_hololens}
for testing and in {query_val_phone,query_val_hololens}
for validation. All outputs are written to ./outputs/
by default. For example, to localize validation Phone queries in the CAB scene:
python -m lamar.run \
--scene CAB --ref_id map --query_id query_val_phone \
--retrieval fusion --feature superpoint --matcher superglue
This executes two steps:
- Create a sparse 3D map using the mapping session via feature extraction, pair selection, feature matching, triangulation
- Localize each image of the sequence via feature extraction, pair selection, feature matching, absolute pose estimation
3️⃣ Obtain the evaluation results:
- validation queries: the script print the localization recall.
- test queries: until the benchmark leaderboard is up and running, please send the predicted pose files to lamar-benchmark@sympa.ethz.ch
⚠️ we will only accept at most 2 submissions per user per week.
4️⃣ Workflow: the benchmarking pipeline is designed such that
- the mapping and localization process is split into modular steps listed in
lamar/tasks/
- outputs like features and matches are cached and re-used over multiple similar runs
- changing a configuration entry automatically triggers the recomputation of all downstream steps that depend on it
[Click to expand]
Using radio signals for place recognition:
python -m lamar.run [...] --use_radios
Localization with sequences of 10 seconds instead of single images:
python -m lamar.run [...] --sequence_length_seconds 10
[Click to expand]
To add a new local feature:
- add your feature extractor to hloc in
hloc/extractors/myfeature.py
- create a configuration entry in
lamar.tasks.feature_extraction.FeatureExtraction.methods
To add a new global feature for image retrieval:
- add your feature extractor to hloc in
hloc/extractors/myfeature.py
- create a configuration entry in
lamar.tasks.feature_extraction.RetrievalFeatureExtraction.methods
To add a new local feature matcher:
- add your feature matcher to hloc in
hloc/matchers/mymatcher.py
- create a configuration entry in
lamar.tasks.feature_matching.RetrievalFeatureMatching.methods
To add a new pose solver: create a new class that inherits from lamar.tasks.pose_estimation.SingleImagePoseEstimation
:
class MyPoseEstimation(SingleImagePoseEstimation):
method = {'name': 'my_estimator'}
def run(self, capture):
...
Each step of the pipeline corresponds to a runfile in scantools/run_*.py
that can be used as follow:
- executed from the command line:
python -m scantools.run_phone_to_capture [--args]
- imported as a library:
from scantools import run_phone_to_capture
run_phone_to_capture.run(...)
We provide pipeline scripts that execute all necessary steps:
pipelines/pipeline_scans.py
aligns multiple NavVis sessions and merge them into a unique reference sessionpipelines/pipeline_sequence.py
aligns all AR sequences to the reference session
The raw data will be released soon such that anyone is able to run the processing pipeline without access to capture devices.
Here are runfiles that could be handy for importing and exporting data:
run_phone_to_capture
: convert a ScanCapture recording into a Capture sessionrun_navvis_to_capture
: convert a NavVis recording into a Capture Sessionrun_session_to_kapture
: convert a Capture session into a Kapture instancerun_capture_to_empty_colmap
: convert a Capture session into an empty COLMAP modelrun_image_anonymization
: anonymize faces and license plates using the Brighter.AI APIrun_radio_anonymization
: anonymize radio signal IDsrun_combine_sequences
: combine multiple sequence sessions into a single session
We are still in the process of fully releasing LaMAR. Here is the release plan:
- LaMAR evaluation data and benchmark
- Ground truthing pipeline
- iOS capture app
- Full raw data
- Leaderboard and evaluation server
- 3D dataset viewer
Please consider citing our work if you use any code from this repo or ideas presented in the paper:
@inproceedings{sarlin2022lamar,
author = {Paul-Edouard Sarlin and
Mihai Dusmanu and
Johannes L. Schönberger and
Pablo Speciale and
Lukas Gruber and
Viktor Larsson and
Ondrej Miksik and
Marc Pollefeys},
title = {{LaMAR: Benchmarking Localization and Mapping for Augmented Reality}},
booktitle = {ECCV},
year = {2022},
}
Microsoft and any contributors grant you a license to the Microsoft documentation and other content in this repository under the Creative Commons Attribution 4.0 International Public License, see the LICENSE file, and grant you a license to any code in the repository under the MIT License, see the LICENSE-CODE file.
Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation may be either trademarks or registered trademarks of Microsoft in the United States and/or other countries. The licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks. Microsoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653.
Privacy information can be found at https://privacy.microsoft.com/en-us/
Microsoft and any contributors reserve all other rights, whether under their respective copyrights, patents, or trademarks, whether by implication, estoppel or otherwise.