This repository represents the official code for paper entitled "Towards accurate instance segmentation in large-scale LiDAR point clouds". This study explores the steps of the panoptic segmentation pipeline concerned with clustering points into object instances, with the goal to alleviate that bottleneck. We find that a carefully designed clustering strategy, which leverages multiple types of learned point embeddings, significantly improves instance segmentation. Experiments on the NPM3D urban mobile mapping dataset and the FOR-instance forest dataset demonstrate the effectiveness and versatility of the proposed strategy.
The framework used in this code is torchpoints-3d, so generally the installation instructions for torchpoints-3d can follow the official ones:
https://torch-points3d.readthedocs.io/en/latest/
https://github.com/torch-points3d/torch-points3d
Here are two detailed examples for installation worked on our local computers for your reference:
Specs local computer: Ubuntu 22.04, 64-bit, CUDA version 11.7 -> but CUDA is backwards compatible, so here we used CUDA 11.1 for all libraries installed.
Commands in terminal using miniconda:
conda create -n treeins_env_local python=3.8
conda activate treeins_env_local
conda install pytorch=1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=11.1 -c pytorch -c nvidia
pip install numpy==1.19.5
conda install openblas-devel -c anaconda
export CUDA_HOME=/usr/local/cuda-11
pip install -U git+https://github.com/NVIDIA/MinkowskiEngine -v --no-deps --install-option="--blas_include_dirs=${CONDA_PREFIX}/include" –install-option="--blas=openblas"
#CHECK IF TORCH AND MINKOWSKI ENGINE WORK AS EXPECTED:
(treeins_env_local) : python
Python 3.8.13 (default, #DATE#, #TIME#)
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> import MinkowskiEngine
>>> exit()
#CHECK FINISHED
pip install torch-scatter==2.0.8 -f https://data.pyg.org/whl/torch-1.9.0+cu111.html
pip install torch-sparse==0.6.12 -f https://data.pyg.org/whl/torch-1.9.0+cu111.html
pip install torch-geometric==1.7.2
#We got the file requirements.txt from here: https://github.com/nicolas-chaulet/torch-points3d/blob/master/requirements.txt but deleted the lines containing the following libraries in the file: torch, torchvision, torch-geometric, torch-scatter, torch-sparse, numpy
pip install -r requirements.txt
pip install numba==0.55.1
conda install -c conda-forge hdbscan==0.8.27
conda install numpy-base==1.19.2
pip install joblib==1.1.0
Specs local computer: Ubuntu 22.04.1, 64-bit, CUDA version 11.3
conda create -n torchpoint3denv python=3.8
conda activate torchpoint3denv
conda install -c conda-forge gcc==9.4.0
conda install pytorch=1.9.0 torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
conda install numpy==1.19.5
mamba install libopenblas openblas
find ${CONDA_PREFIX}/include -name "cblas.h"
export CXX=g++
export MAX_JOBS=2;
git clone https://github.com/NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
python setup.py install --blas_include_dirs=${CONDA_PREFIX}/include --blas=openblas
#THE STEPS START FROM HERE ARE EXACT THE SAME AS EXAMPLE 1
#CHECK IF TORCH AND MINKOWSKI ENGINE WORK AS EXPECTED:
#...
Based on our experience, we would suggest build most of the packages from the source for a larger chance of succesful installation. Good luck to your installation!
Link for dataset download: https://doi.org/10.5281/zenodo.8118986
1: "ground", 2: "buildings", 3: "poles", 4: "bollards", 5: "trash cans", 6: "barriers", 7: "pedestrians", 8: "cars", 9: "natural"
├─ conf # All configurations for training and evaluation leave there
├─ forward_scripts # Script that runs a forward pass on possibly non annotated data
├─ outputs # All outputs from your runs
├─ scripts # Some scripts to help manage the project
├─ torch_points3d
├─ data # DATA FOLDER
└─ npm3dfused
└─ raw
├─ *_train.ply # All train files
├─ *_val.ply # All val files
└─ *_test.ply # All test files
├─ train.py # Main script to launch a training
└─ eval.py # Eval script
Updated!! Since FOR-instance dataset is open. I open the link ((https://polybox.ethz.ch/index.php/s/wVBlHgH308GRr1c)) for download:
- all .ply files
- the pretrained model for the input radius of cylinders = 8m
3 | 25 | |
20 | 30 | |
50 | 25 | |
2 | 15 | |
5 | 30 | |
2 | 35 |
Train - test split is given by NIBIO: 56 train files, 26 test files. We decided on choosing 25% of the train files randomly but fixed as validation set -> 42 train files, 14 val files, 26 test files.
├─ conf # All configurations for training and evaluation leave there
├─ forward_scripts # Script that runs a forward pass on possibly non annotated data
├─ outputs # All outputs from your runs
├─ scripts # Some scripts to help manage the project
├─ torch_points3d
├─ data # DATA FOLDER
└─ treeinsfused
└─ raw
├─ CULS
├─ *_train.ply # All train files
├─ *_val.ply # All val files
└─ *_test.ply # All test files
├─ NIBIO
├─ *_train.ply # SIMILAR AS CULS FOLDER
├─ *_val.ply
└─ *_test.ply
├─ NIBIO2
├─ *.ply # SIMILAR AS CULS FOLDER
├─ RMIT
├─ *.ply # SIMILAR AS CULS FOLDER
├─ SCION
├─ *.ply # SIMILAR AS CULS FOLDER
└─ TUWIEN
├─ *.ply # SIMILAR AS CULS FOLDER
├─ train.py # Main script to launch a training
└─ eval.py # Eval script
Choose different settings in Table 2 in the original paper | Setting I-V | Setting I: models=panoptic/area4_ablation_19, Setting II: models=panoptic/area4_ablation_14, Setting III: models=panoptic/area4_ablation_15, Setting IV: models=panoptic/area4_ablation_3heads_5 Setting V: models=panoptic/area4_ablation_3heads_6 |
Number of training iterations | 150 epochs | conf/training/#NameOfYourChosenConfigFile#.yaml, epochs |
Voxel size/subsampling size | 0.2 (m) | conf/data/panoptic/#NameOfYourChosenConfigFile#.yaml, first_subsampling |
Radius of sampling cylinder | 8 (m) | conf/data/panoptic/#NameOfYourChosenConfigFile#.yaml, radius |
The folder name of your output files | #YourOutputFolderName# | job_name=#YourOutputFolderName# |
- Create wandb account and specify your own wandb account name in conf/training/.yaml. Have a look at all needed configurations of your current run in conf/data/panoptic/.yaml, conf/models/panoptic/.yaml and conf/training/.yaml. Perform training by running:
# An example for NPM3D dataset
# Run Setting IV for test area 1, radius=16m, voxel side length=0.12m, training for 200 epoches.
python train.py task=panoptic data=panoptic/npm3d-sparseconv_grid_012_R_16_cylinder_area1 models=panoptic/area4_ablation_3heads_5 model_name=PointGroup-PAPER training=7_area1 job_name=A1_S7
# An example for FOR-instance dataset
# Run Setting IV, radius=8m, voxel side length=0.2m, training for 150 epoches.
python train.py task=panoptic data=panoptic/treeins_rad8 models=panoptic/area4_ablation_3heads_5 model_name=PointGroup-PAPER training=treeins job_name=treeins_my_first_run
- Look at "TO ADAPT" comments in conf/eval.yaml and change accordingly. Perform evaluation by running:
python eval.py
- Look at "TO ADAPT" comments in evaluation_stats.py and change accordingly, then run:
# For NPM3D dataset
python evaluation_stats_NPM3D.py
# For FOR-instance dataset
python evaluation_stats_FOR.py
If you find our work useful, please do not hesitate to cite it:
@inproceedings{
Xiang2023,
title={Towards Accurate Instance Segmentation in Large-scale LiDAR Point Clouds},
author={Binbin Xiang and Torben Peters and Theodora Kontogianni and Frawa Vetterli1 and Stefano Puliti and Rasmus Astrup and Konrad Schindler},
booktitle={2023 The ISPRS Annals of the Photogrammetry, Remote Sensing and Spatial Information Sciences},
year={2023},
url = {\url{https://arxiv.org/abs/2307.02877}}
}