[Project Webpage] [Paper] [Demo]
We adapt the codebase of Mix3D which provides a highly modularized framework for 3D Semantic Segmentation based on the MinkowskiEngine.
├── mix3d
│ ├── main_instance_segmentation.py <- the main file
│ ├── conf <- hydra configuration files
│ ├── datasets
│ │ ├── preprocessing <- folder with preprocessing scripts
│ │ ├── semseg.py <- indoor dataset
│ │ └── utils.py
│ ├── models <- Mask3D modules
│ ├── trainer
│ │ ├── __init__.py
│ │ └── trainer.py <- train loop
│ └── utils
├── data
│ ├── processed <- folder for preprocessed datasets
│ └── raw <- folder for raw datasets
├── scripts <- train scripts
├── docs
├── README.md
└── saved <- folder that stores models and logs
The main dependencies of the project are the following:
python: 3.10.9
cuda: 11.3
You can set up a conda environment as follows
# Some users experienced issues on Ubuntu with an AMD CPU
# Install libopenblas-dev (issue #115, thanks WindWing)
# sudo apt-get install libopenblas-dev
export TORCH_CUDA_ARCH_LIST="6.0 6.1 6.2 7.0 7.2 7.5 8.0 8.6"
conda env create -f environment.yml
conda activate mask3d_cuda113
pip3 install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip3 install torch-scatter -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip3 install 'git+https://github.com/facebookresearch/detectron2.git@710e7795d0eeadf9def0e7ef957eea13532e34cf' --no-deps
mkdir third_party
cd third_party
git clone --recursive "https://github.com/NVIDIA/MinkowskiEngine"
cd MinkowskiEngine
git checkout 02fc608bea4c0549b0a7b00ca1bf15dee4a0b228
python setup.py install --force_cuda --blas=openblas
cd ..
git clone https://github.com/ScanNet/ScanNet.git
cd ScanNet/Segmentator
git checkout 3e5726500896748521a6ceb81271b0f5b2c0e7d2
make
cd ../../pointnet2
python setup.py install
cd ../../
pip3 install pytorch-lightning==1.7.2
After installing the dependencies, we preprocess the datasets.
First, we apply Felzenswalb and Huttenlocher's Graph Based Image Segmentation algorithm to the test scenes using the default parameters.
Please refer to the original repository for details.
Put the resulting segmentations in ./data/raw/scannet_test_segments
.
python -m datasets.preprocessing.scannet_preprocessing preprocess \
--data_dir="PATH_TO_RAW_SCANNET_DATASET" \
--save_dir="data/processed/scannet" \
--git_repo="PATH_TO_SCANNET_GIT_REPO" \
--scannet200=false/true
The S3DIS dataset contains some smalls bugs which we initially fixed manually. We will soon release a preprocessing script which directly preprocesses the original dataset. For the time being, please follow the instructions here to fix the dataset manually. Afterwards, call the preprocessing script as follows:
python -m datasets.preprocessing.s3dis_preprocessing preprocess \
--data_dir="PATH_TO_Stanford3dDataset_v1.2" \
--save_dir="data/processed/s3dis"
python -m datasets.preprocessing.stpls3d_preprocessing preprocess \
--data_dir="PATH_TO_STPLS3D" \
--save_dir="data/processed/stpls3d"
Train Mask3D on the ScanNet dataset:
python main_instance_segmentation.py
Please refer to the config scripts (for example here) for detailed instructions how to reproduce our results. In the simplest case the inference command looks as follows:
python main_instance_segmentation.py \
general.checkpoint='PATH_TO_CHECKPOINT.ckpt' \
general.train_mode=false
We provide detailed scores and network configurations with trained checkpoints.
Following PointGroup, HAIS and SoftGroup, we finetune a model pretrained on ScanNet (config and checkpoint). | Dataset | AP | AP_50 | AP_25 | Config | Checkpoint :floppy_disk: | Scores :chart_with_upwards_trend: | Visualizations :telescope: |
---|---|---|---|---|---|---|---|---|
Area 1 | 69.3 | 81.9 | 87.7 | config | checkpoint | scores | visualizations | |
Area 2 | 44.0 | 59.5 | 66.5 | config | checkpoint | scores | visualizations | |
Area 3 | 73.4 | 83.2 | 88.2 | config | checkpoint | scores | visualizations | |
Area 4 | 58.0 | 69.5 | 74.9 | config | checkpoint | scores | visualizations | |
Area 5 | 57.8 | 71.9 | 77.2 | config | checkpoint | scores | visualizations | |
Area 6 | 68.4 | 79.9 | 85.2 | config | checkpoint | scores | visualizations |
Dataset | AP | AP_50 | AP_25 | Config | Checkpoint :floppy_disk: | Scores :chart_with_upwards_trend: | Visualizations :telescope: |
---|---|---|---|---|---|---|---|
Area 1 | 74.1 | 85.1 | 89.6 | config | checkpoint | scores | visualizations |
Area 2 | 44.9 | 57.1 | 67.9 | config | checkpoint | scores | visualizations |
Area 3 | 74.4 | 84.4 | 88.1 | config | checkpoint | scores | visualizations |
Area 4 | 63.8 | 74.7 | 81.1 | config | checkpoint | scores | visualizations |
Area 5 | 56.6 | 68.4 | 75.2 | config | checkpoint | scores | visualizations |
Area 6 | 73.3 | 83.4 | 87.8 | config | checkpoint | scores | visualizations |
Dataset | AP | AP_50 | AP_25 | Config | Checkpoint :floppy_disk: | Scores :chart_with_upwards_trend: | Visualizations :telescope: |
---|---|---|---|---|---|---|---|
ScanNet val | 55.2 | 73.7 | 83.5 | config | checkpoint | scores | visualizations |
ScanNet test | 56.6 | 78.0 | 87.0 | config | checkpoint | scores | visualizations |
Dataset | AP | AP_50 | AP_25 | Config | Checkpoint :floppy_disk: | Scores :chart_with_upwards_trend: | Visualizations :telescope: |
---|---|---|---|---|---|---|---|
ScanNet200 val | 27.4 | 37.0 | 42.3 | config | checkpoint | scores | visualizations |
ScanNet200 test | 27.8 | 38.8 | 44.5 | config | checkpoint | scores | visualizations |
Dataset | AP | AP_50 | AP_25 | Config | Checkpoint :floppy_disk: | Scores :chart_with_upwards_trend: | Visualizations :telescope: |
---|---|---|---|---|---|---|---|
STPLS3D val | 57.3 | 74.3 | 81.6 | config | checkpoint | scores | visualizations |
STPLS3D test | 63.4 | 79.2 | 85.6 | config | checkpoint | scores | visualizations |
@article{Schult23ICRA,
title = {{Mask3D: Mask Transformer for 3D Semantic Instance Segmentation}},
author = {Schult, Jonas and Engelmann, Francis and Hermans, Alexander and Litany, Or and Tang, Siyu and Leibe, Bastian},
booktitle = {{International Conference on Robotics and Automation (ICRA)}},
year = {2023}
}