Skip to content

Commit 6143938

Browse files
committed
Release CoVIO
1 parent 4ac27f6 commit 6143938

16 files changed

Lines changed: 435 additions & 202 deletions

README.md

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
# Continual SLAM
22
[**arXiv**](https://arxiv.org/abs/2203.01578) | [**Website**](http://continual-slam.cs.uni-freiburg.de/) | [**Video**](https://youtu.be/ASEzwnV4vNk)
33

4-
This repository is the official implementation of the paper:
4+
This repository is the official implementation of the papers **Continual SLAM** and **CoVIO**:
55

6-
> **Continual SLAM: Beyond Lifelong Simultaneous Localization and Mapping through Continual Learning**
7-
>
8-
> [Niclas Vödisch](https://vniclas.github.io/), [Daniele Cattaneo](https://rl.uni-freiburg.de/people/cattaneo), [Wolfram Burgard](http://www2.informatik.uni-freiburg.de/~burgard/), and [Abhinav Valada](https://rl.uni-freiburg.de/people/valada).
9-
>
6+
> **Continual SLAM: Beyond Lifelong Simultaneous Localization and Mapping through Continual Learning** <br>
7+
> [Niclas Vödisch](https://vniclas.github.io/), [Daniele Cattaneo](https://rl.uni-freiburg.de/people/cattaneo), [Wolfram Burgard](http://www2.informatik.uni-freiburg.de/~burgard/), and [Abhinav Valada](https://rl.uni-freiburg.de/people/valada). <br>
108
> *International Symposium on Robotics Research (ISRR)*, 2022
119
10+
> **CoVIO: Online Continual Learning for Visual-Inertial Odometry** <br>
11+
> [Niclas Vödisch](https://vniclas.github.io/), [Daniele Cattaneo](https://rl.uni-freiburg.de/people/cattaneo), [Wolfram Burgard](http://www2.informatik.uni-freiburg.de/~burgard/), and [Abhinav Valada](https://rl.uni-freiburg.de/people/valada). <br>
12+
> *arXiv preprint arXiv:2303.10149*, 2023 <br>
13+
> *accepted at CVPR Workshop on Continual Learning in Computer Vision*
14+
1215
<p align="center">
13-
<img src="cl-slam_architecture.png" alt="Overview of CL-SLAM architecture" width="600" />
16+
<img src="continual_slam_teaser.png" alt="Continual SLAM teaser" width="600" />
1417
</p>
1518

16-
If you find our work useful, please consider citing our paper:
19+
If you find our work useful, please consider citing our papers:
1720
```
1821
@InProceedings{voedisch2023clslam,
1922
author="V{\"o}disch, Niclas and Cattaneo, Daniele and Burgard, Wolfram and Valada, Abhinav",
@@ -27,15 +30,36 @@ If you find our work useful, please consider citing our paper:
2730
}
2831
```
2932

33+
```
34+
@article{voedisch2023covio,
35+
title="CoVIO: Online Continual Learning for Visual-Inertial Odometry",
36+
author="V{\"o}disch, Niclas and Cattaneo, Daniele and Burgard, Wolfram and Valada, Abhinav",
37+
journal="arXiv preprint arXiv:2303.10149",
38+
year="2023"
39+
}
40+
```
41+
42+
<a href="https://github.com/opendr-eu/opendr"><img src="opendr_logo.png" alt="drawing" width="250"/></a><br>
43+
CL-SLAM and CoVIO are also featured in the [OpenDR toolkit](https://github.com/opendr-eu/opendr).
44+
3045
## 📔 Abstract
3146

47+
### Continual SLAM
3248
While lifelong SLAM addresses the capability of a robot to adapt to changes within a single environment over time, in this paper we introduce the task of continual SLAM.
3349
Here, a robot is deployed sequentially in a variety of different environments and has to transfer its knowledge of previously experienced environments to thus far unseen environments, while avoiding catastrophic forgetting.
3450
This is particularly relevant in the context of vision-based approaches, where the relevant features vary widely between different environments.
3551
We propose a novel approach for solving the continual SLAM problem by introducing CL-SLAM.
3652
Our approach consists of a dual-network architecture that handles both short-term adaptation and long-term memory retention by incorporating a replay buffer.
3753
Extensive evaluations of CL-SLAM in three different environments demonstrate that it outperforms several baselines inspired by existing continual learning-based visual odometry methods.
3854

55+
### CoVIO
56+
Visual odometry is a fundamental task for many applications on mobile devices and robotic platforms.
57+
Since such applications are oftentimes not limited to predefined target domains and learning-based vision systems are known to generalize poorly to unseen environments, methods for continual adaptation during inference time are of significant interest.
58+
In this work, we introduce CoVIO for online continual learning of visual-inertial odometry.
59+
CoVIO effectively adapts to new domains while mitigating catastrophic forgetting by exploiting experience replay.
60+
In particular, we propose a novel sampling strategy to maximize image diversity in a fixed-size replay buffer that targets the limited storage capacity of embedded devices.
61+
We further provide an asynchronous version that decouples the odometry estimation from the network weight update step enabling continuous inference in real time.
62+
We extensively evaluate CoVIO on various real-world datasets demonstrating that it successfully adapts to new domains while outperforming previous methods.
3963

4064
# 🏗 Setup
4165

@@ -138,6 +162,14 @@ Then run:
138162
python main_adapt.py
139163
```
140164

165+
## 📒 Notes
166+
167+
### Continual SLAM
168+
The originally released code for *Continual SLAM*, i.e., without the extensions of *CoVIO*, can be found under commit [4ac27f6](https://github.com/robot-learning-freiburg/CL-SLAM/tree/4ac27f62478cb8301f73bb294be07b846235fe6a).
169+
170+
### CoVIO
171+
The asynchronous variant is provided in the [OpenDR toolkit](https://github.com/opendr-eu/opendr).
172+
141173

142174
## 👩‍⚖️ License
143175

cl-slam_architecture.png

-759 KB
Binary file not shown.

config/config_adapt.yaml

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ Dataset:
1010
DepthPosePrediction:
1111
train_set: all
1212
val_set: 0
13-
resnet: 18
13+
# train_set: 2015-08-12-15-04-18
14+
# val_set: 2015-08-12-15-04-18
15+
resnet_depth: 18
16+
resnet_pose: 18
1417
resnet_pretrained: true
1518
scales: [ 0, 1, 2, 3 ] # Network size
16-
learning_rate: 1e-4
19+
learning_rate: 0.0001
1720
scheduler_step_size: 15
18-
num_workers: 12
21+
num_workers: 0
1922
num_epochs: 20
2023
min_depth: .1
2124
max_depth:
@@ -27,10 +30,17 @@ DepthPosePrediction:
2730
save_val_depth_batches: 0
2831
multiple_gpus: false
2932
gpu_ids:
30-
batch_size: 1
33+
batch_size: 3
3134
log_path: ./log/slam/c_k9
3235
load_weights_folder: ./log/cityscapes/models/weights_025
33-
use_wandb:
36+
use_wandb: False
37+
38+
ReplayBuffer:
39+
maximize_diversity: True
40+
max_buffer_size: 100
41+
similarity_threshold: .95
42+
similarity_sampling: False
43+
load_path: ./log/slam/c_k9/replay_buffer
3444

3545
LoopClosureDetection:
3646
detection_threshold: .99
@@ -39,7 +49,7 @@ LoopClosureDetection:
3949

4050
Slam:
4151
dataset_sequence: 6
42-
adaptation: true
52+
adaptation: True
4353
adaptation_epochs: 5
4454
min_distance: .2
4555
start_frame: 0 # Start mapping after this frame

config/config_parser.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from depth_pose_prediction import Config as DepthPosePrediction
1111
from loop_closure_detection import Config as LoopClosureDetection
1212
from slam import Config as Slam
13+
from slam import ReplayBufferConfig as ReplayBuffer
1314

1415

1516
class ConfigParser():
@@ -21,6 +22,7 @@ def __init__(self, config_file: Union[str, PathLike, Path]) -> None:
2122
self.depth_pose = None
2223
self.loop_closure = None
2324
self.slam = None
25+
self.replay_buffer = None
2426

2527
self.parse()
2628

@@ -93,6 +95,8 @@ def parse(self):
9395
self.loop_closure = LoopClosureDetection(**self.config_dict['LoopClosureDetection'])
9496
if 'Slam' in self.config_dict:
9597
self.slam = Slam(**self.config_dict['Slam'])
98+
if 'ReplayBuffer' in self.config_dict:
99+
self.replay_buffer = ReplayBuffer(**self.config_dict['ReplayBuffer'])
96100

97101
def __str__(self):
98102
string = ''

continual_slam_teaser.png

496 KB
Loading

depth_pose_prediction/config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ class DepthPosePrediction:
88
config_file: Path
99
train_set: Optional[Union[Tuple[int, ...], int, str]]
1010
val_set: Optional[Union[Tuple[int, ...], Tuple[str, ...], int, str]]
11-
resnet: int
11+
resnet_depth: int
12+
resnet_pose: int
1213
resnet_pretrained: bool
1314
scales: Tuple[int, ...]
1415
learning_rate: float

0 commit comments

Comments
 (0)