This repository contains a Python implementation of the S-RobOT (Smooth Robust Optimal Transport) algorithm for 2D and 3D point cloud registration.
The approach leverages Unbalanced Optimal Transport accelerated by KeOps to achieve robust alignment against noise and outliers without relying on deep learning.
Below are examples of the registration pipeline, showing the progression from the initial state to the global Affine alignment.
| 3D Cube Registration | Lung Vascular Tree (PVT1010) |
|---|---|
![]() |
![]() |
The algorithm recovers large displacements and fine details using geometric constraints.
Below is an example demonstrating the robustness of RobOT compared to a Wasserstein flow : the raw Wasserstein gradient flow succeeds in minimizing the transport cost, it fails to preserve the topological integrity of the shape
| 2D Moon Wasserstein flow | 2D Moon RobOT |
|---|---|
![]() |
![]() |
-
Robustness: Effectively handles noise and large outliers by allowing mass destruction through the marginal relaxation parameter
$\rho$ . -
Scalability: Utilizes KeOps symbolic computation to perform transport on dense point clouds (
$N > 10^4$ ) with linear memory complexity ($O(N)$). -
Geometric Pipeline: Implements a two-stage registration process:
- Global: Iterative Affine/Rigid normalization.
- Local: Non-linear refinement using Anisotropic Splines (Nadaraya-Watson estimator).
Ensure you have a CUDA-enabled GPU to leverage KeOps acceleration.
Dependencies
pip install torch numpy matplotlib pykeops pyvistaRunning the Demo Launch the main notebook to reproduce the experiments.
If you find this code useful, please refer to the original paper:
Accurate Point Cloud Registration with Robust Optimal Transport
Zhengyang Shen, Jean Feydy, et al. (2021)
Click to copy BibTeX
@misc{feydy,
title={Accurate Point Cloud Registration with Robust Optimal Transport},
author={Zhengyang Shen and Jean Feydy and Peirong Liu and Ariel Hernán Curiale and Ruben San Jose Estepar and Raul San Jose Estepar and Marc Niethammer},
year={2021},
eprint={2111.00648},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={[https://arxiv.org/abs/2111.00648](https://arxiv.org/abs/2111.00648)},
}


