/lamar-benchmark

Source code for the ECCV 2022 paper "Benchmarking Localization and Mapping for Augmented Reality".

Primary LanguagePythonCreative Commons Attribution 4.0 InternationalCC-BY-4.0


LaMAR
Benchmarking Localization and Mapping
for Augmented Reality

Paul-Edouard Sarlin* · Mihai Dusmanu*
Johannes L. Schönberger · Pablo Speciale · Lukas Gruber · Viktor Larsson · Ondrej Miksik · Marc Pollefeys

Logo

ECCV 2022

Logo
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:

  1. A dataset: multi-sensor data streams captured by AR devices and laser scanners
  2. scantools: a processing pipeline to register different user sessions together
  3. 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.

Overview

This codebase is composed of the following modules:

  • lamar: evaluation pipeline and baselines for localization and mapping
  • scantools: data API, processing tools and pipeline
  • ScanCapture: a data recording app for Apple devices

Data format

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.

Installation

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 .

Benchmark

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:

  1. Create a sparse 3D map using the mapping session via feature extraction, pair selection, feature matching, triangulation
  2. 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

Other evaluation options

[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

Adding your own algorithms

[Click to expand]

To add a new local feature:

To add a new global feature for image retrieval:

To add a new local feature matcher:

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):
        ...

Processing pipeline

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:

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 session
  • run_navvis_to_capture: convert a NavVis recording into a Capture Session
  • run_session_to_kapture: convert a Capture session into a Kapture instance
  • run_capture_to_empty_colmap: convert a Capture session into an empty COLMAP model
  • run_image_anonymization: anonymize faces and license plates using the Brighter.AI API
  • run_radio_anonymization: anonymize radio signal IDs
  • run_combine_sequences: combine multiple sequence sessions into a single session

Release plan

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

BibTex citation

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},
}

Legal Notices

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.