OpenMask3D / openmask3d

MIT License
184 stars 13 forks source link

OpenMask3DπŸ›‹: Open-Vocabulary 3D Instance Segmentation

Ayça Takmaz1*, Elisabetta Fedele1*
Robert W. Sumner1, Marc Pollefeys1,2, Federico Tombari1,3, Francis Engelmann1,3
1ETH Zurich, 2Microsoft, 3Google
*equal contribution

NeurIPS 2023

Code | Paper | Project Page

Logo

OpenMask3D is a zero-shot approach for 3D instance segmentation with open-vocabulary queries. Guided by predicted class-agnostic 3D instance masks, our model aggregates per-mask features via multi-view fusion of CLIP-based image embeddings.



Setup πŸ› 

Clone the repository, create conda environment and install the required packages as follows:

conda create --name=openmask3d python=3.8.5 # create new virtual environment
conda activate openmask3d # activate it
bash install_requirements.sh  # install requirements
pip install -e .  # install current repository in editable mode

Note: If you encounter any issues in the bash install_requirements.sh step, we recommend you to run the commands in that script one-by-one, especially for performing the MinkowskiEngine installation manually.


Run the pipeline on a single scene πŸ›‹

In this section we provide some information about how to run the pipeline on a single scene. In particular, we divide this section into four parts:

  1. Download checkpoints
  2. Check the format of scene's data
  3. Set-up configurations
  4. Run OpenMask3D

Step 1: Download the checkpoints πŸ“

Create a folder resources in the main directory of the repository. Then, add to this folder the checkpoints for:

Step 2: Check the folder structure of the data for your scene πŸ›’

In order to run OpenMask3D you need to have access to the point cloud of the scene as well to the posed RGB-D frames.

We recommend creating a folder scene_example inside the resources folder where the data is saved with the following structure (here we provide a scene as an example).

scene_example
      β”œβ”€β”€ pose                            <- folder with camera poses
      β”‚      β”œβ”€β”€ 0.txt 
      β”‚      β”œβ”€β”€ 1.txt 
      β”‚      └── ...  
      β”œβ”€β”€ color                           <- folder with RGB images
      β”‚      β”œβ”€β”€ 0.jpg (or .png/.jpeg)
      β”‚      β”œβ”€β”€ 1.jpg (or .png/.jpeg)
      β”‚      └── ...  
      β”œβ”€β”€ depth                           <- folder with depth images
      β”‚      β”œβ”€β”€ 0.png (or .jpg/.jpeg)
      β”‚      β”œβ”€β”€ 1.png (or .jpg/.jpeg)
      β”‚      └── ...  
      β”œβ”€β”€ intrinsic                 
      β”‚      └── intrinsic_color.txt       <- camera intrinsics
      └── scene_example.ply                <- point cloud of the scene

Please note the followings:

Step 3: Set-up the paths to data and to output folders πŸ›€

Before running OpenMask3D make sure to fill all the required parameters in this script. In particular, if you have followed the structure provided in Step 2, you should adapt only the following fields:

Step 4: Run OpenMask3D πŸš€

Now you can run OpenMask3D by using the following command.

bash run_openmask3d_single_scene.sh

This script first extracts and saves the class-agnostic masks, and then computes the per-mask features. Masks and mask-features are saved into the directory specified by the user at the beginning of this script. In particular, the output has the following structure.

OUTPUT_FOLDER_DIRECTORY
      └── date-time-experiment_name                           <- folder with the output of a specific experiment
             β”œβ”€β”€ crops                                        <- folder with crops (if SAVE_CROPS=true)
             β”œβ”€β”€ hydra_outputs                                <- folder with outputs from hydra (config.yaml files are useful)
             β”œβ”€β”€ scene_example_masks.pt                       <- class-agnostic instance masks - dim. (num_points, num_masks) indicating the masks in which a given point is included
             └── scene_example_openmask3d_features.npy        <- per-mask features for each object instance - dim. (num_masks, num_features), the mask-feature vecture for each instance mask. 

Note: For the ScanNet validation, we use available segments on ScanNet and obtain more robust and less noisy masks compared to directly running the mask predictor on the point cloud. Therefore, the results we obtain for a single scene from ScanNet directly using the point cloud can be different then the masks obtained during the overall ScanNet evaluation described in the section below.


Other Configs βš™οΈ

Other configuration parameters can be modified from this file. Here we provide some clarifications of other configuration parameters:


Closed-vocabulary 3D instance segmentation evaluation on ScanNet200 πŸ“Š

In this section we outline the steps to take in order to reproduce our results on the ScanNet200 validation set. In particular, we divide this section into four parts:

  1. Download and preprocess the ScanNet200 dataset
  2. Check the format of ScanNet200 dataset
  3. Set-up the paths to data and to output folders
  4. Run evaluation

Step 1: Download and pre-process the ScanNet200 dataset πŸ“

First, you need to download the ScanNet200 dataset as explained here.

Once you have the dataset, you have to clone the ScanNet repository and process the dataset by using the following command.

cd class_agnostic_mask_computation
python -m datasets.preprocessing.scannet_preprocessing preprocess \
--data_dir="PATH_TO_ORIGINAL_SCANNET_DATASET" \
--save_dir="data/processed/scannet" \
--git_repo="PATH_TO_SCANNET_GIT_REPO" \
--scannet200=true

Step 2: Check the format of ScanNet200 dataset πŸ›’

Make sure to have the data in the following form.

scans                                       <- out folder          
 β”œβ”€β”€ scene_0011_00
 β”‚     β”œβ”€β”€ data 
 β”‚     β”‚      β”œβ”€β”€ intrinsic                 <- folder with the intrinsics
 β”‚     β”‚      └── pose                      <- folder with the poses
 β”‚     β”œβ”€β”€ data_compressed                 
 β”‚     β”‚      β”œβ”€β”€ color                     <- folder with the color images
 β”‚     β”‚      └── depth                     <- folder with the depth images
 β”‚     └── scene_0011_00_vh_clean_2.ply     <- path to the point cloud/mesh ply file
 β”œβ”€β”€ scene0011_01
 β”‚     β”œβ”€β”€ data 
 β”‚     β”‚      β”œβ”€β”€ intrinsic
 β”‚     β”‚      └── pose     
 β”‚     β”œβ”€β”€ data_compressed                 
 β”‚     β”‚      β”œβ”€β”€ color
 β”‚     β”‚      └── depth  
 β”‚     └── scene_0011_01_vh_clean_2.ply 
 ...

Step 3: Set-up paths to data and to output folders πŸ›€

Modify the paths and parameters in this script, following the instructions provided there.

Step 4: Run OpenMask3D on ScanNet200 πŸš€

Now you can compute the per-mask scene features and run the evaluation of OpenMask3D on the whole ScanNet200 dataset by using the following command:

bash run_openmask3d_scannet200_eval.sh

This script first extracts and saves the class-agnostic masks, and then computes the mask features associated with each extracted mask. Afterwards, the evaluation script automatically runs in order to obtain 3D closed-vocabulary semantic instance segmentation scores.


Citation :pray:

@inproceedings{takmaz2023openmask3d,
  title={{OpenMask3D: Open-Vocabulary 3D Instance Segmentation}},
  author={Takmaz, Ay{\c{c}}a and Fedele, Elisabetta and Sumner, Robert W. and Pollefeys, Marc and Tombari, Federico and Engelmann, Francis},
  booktitle={Advances in Neural Information Processing Systems (NeurIPS)},
year={2023}
}