Run registration

August 11, 2025 · View on GitHub

TurboReg Title
Paper PDF arXiv arXiv

Shaocheng Yan   Pengcheng Shi   Zhenjun Zhao   Kaixin Wang   Kuang Cao   Ji Wu   Jiayuan Li

Teaser
A highly efficient and robust estimator for point cloud registration (PCR), supporting both CPU and GPU platforms.

🌀 Overview

TurboReg is a highly efficient and robust estimator for point cloud registration (PCR), supporting both CPU and GPU platforms. It achieves 60+ FPS while maintaining state-of-the-art registration recall.

Highlights

  • State-of-the-art performance on 3DMatch and KITTI datasets
  • Efficient runtime (60+ FPS)
  • Learning-free, parameter-friendly design

Here's a general comparison of TurboReg with existing methods:

Comparison with Existing Methods

Method NameVenue (Year)Performance (Recall)CPU EfficiencyGPU Efficiency
SC2-PCRCVPR 2022
MACCVPR 2023
FastMACCVPR 2024
TurboReg 🎖ICCV 2025✅ (60+FPS)

📦 Installation

Python API

Note: The Python API of TurboReg is implemented in C++ and exposed via PyBind11, offering C++-level performance within Python.

Create a Python virtual environment and install PyTorch (with CUDA support):

# Python Enviroment
git clone https://github.com/Laka-3DV/TurboReg.git
cd TurboReg

conda create -n turboreg python=3.11
conda activate turboreg

pip install open3d tyro

# Install PyTorch (select the appropriate version for your CUDA setup from https://pytorch.org/)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

Install TurboReg by running:

cd bindings
pip install .
cd ..

You can try TurboReg with just a few lines of code:

import numpy as np
import torch
import turboreg_gpu  # NOTE: torch must be imported before turboreg_gpu

# Load input correspondences
kpts_src = torch.from_numpy(np.loadtxt('demo_data/000_fpfh_kpts_src.txt')).cuda().float()
kpts_dst = torch.from_numpy(np.loadtxt('demo_data/000_fpfh_kpts_dst.txt')).cuda().float()

# Initialize TurboReg with specific parameters:
reger = turboreg_gpu.TurboRegGPU(
    6000,      # max_N: Maximum number of correspondences
    0.012,     # tau_length_consis: \tau (consistency threshold for feature length/distance)
    2000,      # num_pivot: Number of pivot points, K_1
    0.15,      # radiu_nms: Radius for avoiding the instability of the solution
    0.1,       # tau_inlier: Threshold for inlier points. NOTE: just for post-refinement (REF@PointDSC/SC2PCR/MAC)
    "IN"       # eval_metric: MetricType (e.g., "IN" for Inlier Number, or "MAE" / "MSE")
)

# Run registration
trans = reger.run_reg(kpts_src, kpts_dst)

To run the demo:

cd ./demo_py
python o3d_fpfh.py

C++ Build Instructions

🔧 Dependencies

  • CMake ≥ 3.10
  • LibTorch (No independent installation required; use directly within your Python virtual environment (i.e., turboreg))

GPU version uses LibTorch from the Python virtual environment. For CPU version, you can refer to ./turboreg_cpu/ (TBD).

mkdir build_ && cd build_ 
cmake .. -DCMAKE_PREFIX_PATH=`python -c "import torch; print(torch.utils.cmake_prefix_path)"`
make -j8

# Run C++ demo
./demo_cpp/demo_corr_fpfh

🧪 Experiment Reproduction

Download the processed 3DMatch correspondences from MAC++. Expected folder structure:

DIR_3DMATCH_FPFH_FCGF
.
├── 3DMatch
   ├── all_fcgf
       ├── 7-scenes-redkitchen
       └── ...
   └── all_fpfh
       ├── 7-scenes-redkitchen
       └── ...

Then, run the folloing script

# For 3DMatch + FPFH
python -m demo_py.exp_3dmatch --desc fpfh --dataname 3DMatch --dir_dataset "DIR_3DMATCH_FPFH_FCGF" --max_N 7000 --tau_length_consis 0.012 --num_pivot 2000 --radiu_nms 0.15 --tau_inlier 0.1 --metric_str "IN"

# For 3DMatch + FCGF
python -m demo_py.exp_3dmatch --desc fcgf --dataname 3DMatch --dir_dataset "DIR_3DMATCH_FPFH_FCGF" --max_N 6000 --tau_length_consis 0.012 --num_pivot 2000 --radiu_nms 0.10 --tau_inlier 0.1 --metric_str "MAE"

📈 Registration Performance (RR ↑, RE ↓, TE ↓, FPS ↑)

DatasetDescriptorRR (%)RE (°)TE (cm)FPS
3DMatchFPFH84.102.196.8152.87
3DMatchFCGF93.592.046.4264.55
3DMatchPredator94.892.076.0463.31
3DLoMatchFPFH40.993.8510.1662.31
3DLoMatchFCGF59.743.7610.4061.43
3DLoMatchPredator73.073.289.5367.68
KITTIFPFH98.560.478.9668.93
KITTIFCGF98.380.408.1267.81

📖 Citation

If you find this code useful for your work or use it in your project, please consider citing:

@article{yan2025turboreg,
  title={TurboReg: TurboClique for Robust and Efficient Point Cloud Registration},
  author={Yan, Shaocheng and Shi, Pengcheng and Zhao, Zhenjun and Wang, Kaixin and Cao, Kuang and Wu, Ji and Li, Jiayuan},
  journal={arXiv preprint arXiv:2507.01439},
  year={2025}
}

🙏 Acknowledgements

TurboReg builds upon several excellent open-source works: