# panoptic-mapping
**Repository Path**: solinari/panoptic-mapping
## Basic Information
- **Project Name**: panoptic-mapping
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-07-21
- **Last Updated**: 2024-12-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# PanopticNDT: Efficient and Robust Panoptic Mapping
This repository contains the code for our paper "PanopticNDT: Efficient and Robust Panoptic Mapping" ([IEEE Xplore](https://ieeexplore.ieee.org/document/10342137), [arXiv](https://arxiv.org/abs/2309.13635) (with appendix and some minor fixes - see changelog below)).
(Click on the image to open YouTube video)
## License and Citations
The source code is published under Apache 2.0 license, see [license file](LICENSE) for details.
If you use the source code or the network weights, please cite the following paper:
> Seichter, D., Stephan, B., Fischedick, S. B., Müller, S., Rabes, L., Gross, H.-M.
*PanopticNDT: Efficient and Robust Panoptic Mapping*,
in IEEE/RSJ International Conference on Intelligent Robots and
Systems (IROS), pp. 7233-7240, 2023.
BibTeX
```bibtex
@inproceedings{panopticndt2023iros,
title = {{PanopticNDT: Efficient and Robust Panoptic Mapping}},
author = {Seichter, Daniel and Stephan, Benedict and Fischedick, S{\"o}hnke Benedikt and Mueller, Steffen and Rabes, Leonard and Gross, Horst-Michael},
booktitle = {IEEE/RSJ Int. Conf. on Intelligent Robots and Systems (IROS)},
year = {2023},
pages = {7233-7240},
}
% with appendix and some minor fixes - we recommend working with this version
@article{panopticndt2023arxiv,
title = {{PanopticNDT: Efficient and Robust Panoptic Mapping}},
author = {Seichter, Daniel and Stephan, Benedict and Fischedick, S{\"o}hnke Benedikt and Mueller, Steffen and Rabes, Leonard and Gross, Horst-Michael},
journal = {arXiv preprint arXiv:2309.13635},
year = {2023}
}
```
## Overview
Given a precise localization in the environment, our panoptic mapping approach comprises two steps.
We first apply [EMSANet](https://github.com/TUI-NICR/EMSANet/tree/release_2024_06_27) – an efficient RGB-D panoptic segmentation approach – to the current set of input images (color and depth).
Unlike other approaches, we decided in favor of an RGB-D approach as depth provides complementary information that helps segmenting cluttered indoor scenes.
Afterward, the obtained panoptic segmentation, the depth image, and the current pose are passed to the panoptic mapping stage.
We evaluate our panoptic mapping approach on [Hypersim](https://machinelearning.apple.com/research/hypersim) and [ScanNet](http://www.scan-net.org/) in 3D and 2D.
The evaluation protocol builds upon the publicly available [ScanNet benchmark pipeline](https://kaldir.vc.in.tum.de/scannet_benchmark/).
Unfortunately, the ScanNet pipeline does not feature a panoptic evaluation.
Therefore, we extend the existing pipeline with a complementary panoptic evaluation task.
### 2D evaluation
We evaluate the predictions of EMSANet as well as back-projections of our panoptic mapping approach in 2D on three tasks:
- **2D semantic task**: the original [ScanNet 2D Semantic Label Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-label2d) task with 20 semantic classes (metric: mIoU)
- **2D semantic instance task**: the original [ScanNet 2D Semantic Instance Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-instance2d) task, i.e., evaluation of foreground instances of thing classes with corresponding semantic class and segmentation mask (metric: AP_50)
- **2D panoptic task**: the proposed complementary dense panoptic evaluation taking into account both stuff and thing classes (metric: PQ and mIoU)
> The data format for our proposed **2D panoptic task** follows the same naming convention and data format as the original [ScanNet 2D Semantic Label Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-label2d) task.
Label encoding is similar to the ground-truth encoding for the [ScanNet 2D Semantic Instance Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-instance2d) task.
However, as Hypersim features much more (small) instances than ScanNet, label encoding cannot be done in grayscale png16 (uint16) with *sem\*1000+ins*. Instead, we encode panoptic labels as RGB png8 with R: semantic class (uint8), G+B: instance id (uint16), i.e., *sem\*(1<<16)+ins* is used.
We also adopt the same label encoding for encoding the ground truth for the **2D semantic instance task** to support Hypersim.
We describe the 2D ground-truth generation below in section [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation-mapping).
### 3D evaluation
Similar to the 2D evaluation, we evaluate our panoptic mapping approach in 3D on the same three tasks:
- **3D semantic task**: the original [3D Semantic Label Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-label3d) task with 20 semantic classes (metric: mIoU)
- **3D semantic instance task**: the original [ScanNet 3D Semantic Instance Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-instance3d) task, i.e., evaluation of foreground instances of thing classes with corresponding semantic class and segmentation mask (metric: AP_50)
- **3D panoptic task**: the proposed complementary dense panoptic evaluation taking into account both stuff and thing classes (metric: PQ and mIoU)
> The ground truth for all three tasks is given as txt files with each line describing the label of a corresponding point in a point-cloud representation.
For the **3D semantic instance task** and the **3D panoptic task**, similar to 2D, we change the label encoding in the txt files from *sem\*1000+ins* to *sem\*(1<<16)+ins* to support Hypersim as well.
We describe the 3D ground-truth generation below in section [Extract 3D ground truth](#extract-3d-ground-truth).
## Usage
To enable other researchers to have a similar setup and to compare to our panoptic mapping approach, we share the pipeline for data preparation and evaluation as well as the training details and weights of all neural networks involved.
Follow the steps below to reproduce results or to integrate parts in our pipeline.
- [Setup and environment](#setup-and-environment)
- [Prepare data](#prepare-data)
- [Hypersim](#hypersim)
- [ScanNet](#scannet)
- [Download pretrained models](#download-pretrained-models)
- [Mapping experiments](#mapping-experiments)
- [Application network](#application-network)
- [Fine-tuned application network](#fine-tuned-application-network)
- [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation--mapping)
- [Hypersim](#hypersim-1)
- [ScanNet](#scannet-1)
- [Reproduce reported EMSANet results](#reproduce-reported-emsanet-results)
- [Hypersim](#hypersim-2)
- [ScanNet](#scannet-2)
- [Extract 3D ground truth](#extract-3d-ground-truth)
- [Hypersim](#hypersim-3)
- [ScanNet](#scannet-3)
- [Run mapping experiments](#run-mapping-experiments)
- [Evaluate mapping results](#evaluate-mapping-results)
- [2D evaluation](#2d-evaluation-1)
- [3D evaluation](#3d-evaluation-1)
- [Changelog](#changelog)
### Setup and environment
The required source code is distributed across multiple existing repositories that have been updated along with this publication.
To make it easier to set up the environment, we provide this meta repository that contains all required repositories as submodules.
1. Clone repositories:
```bash
# do not forget the '--recursive' argument to clone all submodules
git clone --recursive https://github.com/TUI-NICR/panoptic-mapping.git
REPO_ROOT="/path/to/this/repository"
```
2. Set up anaconda environment including most relevant dependencies:
```bash
# create conda environment from YAML file
# option 1: latest tested version (Python 3.11.0, PyTorch 2.3, Open3D 0.18.0)
conda env create -f panoptic_mapping_2024.yml
conda activate panoptic_mapping_2024
# option 2: original publication (Python 3.8.16, PyTorch 1.13.0)
conda env create -f panoptic_mapping.yml
conda activate panoptic_mapping
```
3. Install remaining packages required for preparing datasets and EMSANet:
```bash
# dataset package - required for preparing the datasets and EMSANet
python -m pip install -e "${REPO_ROOT}/emsanet/lib/nicr-scene-analysis-datasets[withpreparation,with3d]"
# multi-task scene analysis package - required for EMSANet and metric calculation
python -m pip install -e "${REPO_ROOT}/emsanet/lib/nicr-multitask-scene-analysis"
```
4. Patch [ScanNet](https://github.com/ScanNet/ScanNet) submodule:
We have modified the ScanNet benchmark scripts:
- to support Python 3.X
- to support recent NumPy versions (fixes for np.bool vs bool, ...)
- to support the Hypersim dataset (requires changing label representation from *sem\*1000+ins* to *sem\*(1<<16)+ins*, as Hypersim has more than 1000 instances in a scene)
- to feature a panoptic evaluation tasks in both 2D and 3D as well
- to write results as *.json files in addition to existing *.txt files (simplifies automatic results parsing)
The patch below applies all the changes required to the original ScanNet benchmark code.
```bash
cd ${REPO_ROOT}/evaluation
patch -s -p0 < scannet_benchmark_code.patch
```
Even after the patch is applied, the code quality of the benchmark scripts is still a bit rough.
However, it is not up to us to improve on that.
5. Build Cython extension for faster 2D semantic evaluation:
The published original ScanNet benchmark script for the **2D semantic task** is very slow and cannot handle the void class.
Therefore, we re-added the Cython implementation from [cityscapesScripts](https://github.com/mcordts/cityscapesScripts/tree/master/cityscapesscripts/evaluation) for faster evaluation.
Follow the instructions below to compile the extension to get results in a fraction of the time.
```bash
# install cython
python -m pip install cython # last tested: 3.0.10
# build extension
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/2d_evaluation
rm __init__.py # this empty file needs to be removed to avoid compiler errors
python setup.py build_ext --inplace
```
### Prepare data
We provide scripts that automate dataset preparation along with our [nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/tree/v0.7.0).
#### Hypersim
```bash
HYPERSIM_DOWNLOAD_PATH=${REPO_ROOT}/datasets/hypersim_preparation
HYPERSIM_PATH=${REPO_ROOT}/datasets/hypersim
# download and extract raw dataset (2x ~1.8TB)
wget https://raw.githubusercontent.com/apple/ml-hypersim/6cbaa80207f44a312654e288cf445016c84658a1/code/python/tools/dataset_download_images.py
python dataset_download_images.py --downloads_dir ${HYPERSIM_DOWNLOAD_PATH}
# prepare dataset (~147 GB):
# - extract required data & convert to our format
# - convert non-standard perspective projection matrices (with tilt-shift photography parameters)
# - blacklist some broken scenes/trajectories
nicr_sa_prepare_dataset hypersim \
${HYPERSIM_PATH} \
${HYPERSIM_DOWNLOAD_PATH} \
--additional-subsamples 2 5 10 20 \
--n-processes 16
# just in case you want to delete the downloaded raw data (2x ~1.8TB)
# rm -rf $HYPERSIM_DOWNLOAD_PATH
```
We refer to the documentation of our [nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/tree/v0.7.0/nicr_scene_analysis_datasets/datasets/hypersim) for further details.
#### ScanNet
To be able to download the dataset fill out the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to scannet@googlegroups.com.
Once your request is approved, you will receive the `download_scannet.py` script.
```bash
SCANNET_DOWNLOAD_PATH=${REPO_ROOT}/datasets/scannet_preparation
SCANNET_PATH=${REPO_ROOT}/datasets/scannet
# download and extract raw dataset (~1.7TB, do not skip .sens files)
python download-scannet.py -o ${SCANNET_DOWNLOAD_PATH}
# prepare dataset (~293 GB):
# - extract required data & convert to our format
# - blacklist some broken images
# - important subsamples: 5 - used for mapping, 50 - used for training, 100 - required for benchmark
nicr_sa_prepare_dataset scannet \
${SCANNET_DOWNLOAD_PATH} \
${SCANNET_PATH} \
--num-processes 16 \
--subsample 5 \
--additional-subsamples 10 50 100 200 500
# just in case you want to delete the downloaded raw data (~1.7TB), however, note
# that the raw data is required later again for extracting 3D ground truth
# rm -rf $SCANNET_DOWNLOAD_PATH
```
We refer to the documentation of our [nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/tree/v0.7.0/nicr_scene_analysis_datasets/datasets/scannet) for further details.
### Download pretrained models
#### Mapping experiments
We provide the weights of our EMSANet-R34-NBt1D (enhanced ResNet34-based encoder utilizing the Non-Bottleneck-1D block) used for Hypersim and ScanNet experiments.
Download the weights for [Hypersim](https://drive.google.com/uc?id=1gbu2H9zh7-1kGW8-NI_6eU3mcW_J0j-l) and [ScanNet](https://drive.google.com/uc?id=1x0Ud6qhqfb5DNjHmhiP9xiau5snKceWb) and extract them to `./trained_models` or use:
```bash
python -m pip install gdown # last tested: 5.2.0
# Hypersim
gdown 1gbu2H9zh7-1kGW8-NI_6eU3mcW_J0j-l --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_hypersim.tar.gz -C ${REPO_ROOT}/trained_models/
# ScanNet
gdown 1x0Ud6qhqfb5DNjHmhiP9xiau5snKceWb --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_scannet.tar.gz -C ${REPO_ROOT}/trained_models/
```
> We refer to the shipped '*_argv.txt' file next to the weights file for the training command used to obtain the weights.
#### Application network
We further provide the weights for the network used for application and shown in the video above.
The network was trained simultaneously on NYUv2, Hypersim, SUNRGB-D, and ScanNet.
The best epoch was chosen based on the performance on the SUNRGB-D test split.
For more details, we refer to the appendix of our paper (available on [arXiv](https://arxiv.org/abs/2309.13635)).
Click [here](https://drive.google.com/uc?id=1oSmEPkHAFVBx7Gut6jojVTjheyQTX4S3) to download the weights and extract them to `./trained_models` or use:
```bash
python -m pip install gdown # last tested: 5.2.0
# Application network
gdown 1oSmEPkHAFVBx7Gut6jojVTjheyQTX4S3 --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application.tar.gz -C ${REPO_ROOT}/trained_models/
```
> We refer to the shipped '*_argv.txt' file next to the weights file for the training command used to obtain the weights.
> We refer to the instructions given in [./trained_models](./trained_models) for reproducing the results reported in our paper.
#### Fine-tuned application network
Finally, we also provide the weights of the application network fine-tuned on each of the four datasets above individually.
Download the weights for
[NYUv2](https://drive.google.com/uc?id=1yuahzuza5urbb8zVVgKGTqTwla38m6CK),
[SUNRGB-D (refined instance annotations proposed in this paper)](https://drive.google.com/uc?id=1jIOq29bTwe0vnzsXIldePWd3fpj42BuQ),
[Hypersim (with camera model correction presented in this paper)](https://drive.google.com/uc?id=1OSlTk3gbK0Pt3g-yt2fwtzMXoVyE4oOA),
[ScanNet (20 classes)](https://drive.google.com/uc?id=1fhZ5L9mPPeL1_JxxtbhKVPf-i3eWykDo), and
[ScanNet (40 classes)](https://drive.google.com/uc?id=1oSWcjcrNDCEB9hHdB0JJBG7NI92cP7ab)
and extract them to `./trained_models` or use:
```bash
python -m pip install gdown # last tested: 5.2.0
# Application network fine-tuned on NYUv2
gdown 1yuahzuza5urbb8zVVgKGTqTwla38m6CK --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application_nyuv2_finetuned.tar.gz -C ${REPO_ROOT}/trained_models/
# Application network fine-tuned on SUNRGB-D (refined instance annotations proposed in this paper)
gdown 1jIOq29bTwe0vnzsXIldePWd3fpj42BuQ --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application_sunrgbd_finetuned.tar.gz -C ${REPO_ROOT}/trained_models/
# Application network fine-tuned on Hypersim (with camera model correction presented in this paper)
gdown 1OSlTk3gbK0Pt3g-yt2fwtzMXoVyE4oOA --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application_hypersim_finetuned.tar.gz -C ${REPO_ROOT}/trained_models/
# Application network fine-tuned on ScanNet (20 classes)
gdown 1fhZ5L9mPPeL1_JxxtbhKVPf-i3eWykDo --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application_scannet20_finetuned.tar.gz -C ${REPO_ROOT}/trained_models/
# Application network fine-tuned on ScanNet (40 classes)
gdown 1oSWcjcrNDCEB9hHdB0JJBG7NI92cP7ab --output ${REPO_ROOT}/trained_models/
tar -xvzf ${REPO_ROOT}/trained_models/model_application_scannet40_finetuned.tar.gz -C ${REPO_ROOT}/trained_models/
```
> We refer to the shipped '*_argv.txt' file next to the weights file for the training command used to obtain the weights.
> We refer to the instructions given in [./trained_models](./trained_models) for reproducing the results reported in our paper.
> We refer to the documentation of our [nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/tree/v0.7.0/) for preparing the datasets.
### Extract 2D ground truth and EMSANet predictions for evaluation / mapping
To extract the predictions of our EMSANet model for Hypersim and ScanNet, use the `inference_dataset.py` [script](
https://github.com/TUI-NICR/EMSANet/blob/panopticndt/inference_dataset.py) provided in the EMSANet submodule in `./emsanet`.
The script supports multiple output formats, specified by the `--inference-output-format` argument:
- `scannet-semantic`: export semantic predictions of EMSANet and corresponding GT for the **2D semantic task**
- `scannet-instance`: export instance part of the panoptic predictions of EMSANet and corresponding GT for the **2D semantic instance task**
- `scannet-panoptic`: export panoptic predictions of EMSANet and corresponding GT for the proposed **2D panoptic task**
- `mapping`: export EMSANet predictions for subsequent mapping
> Adjust `--inference-batch-size` to your GPU memory. The predefined batch size of 2 enables inference on GPUs with at least 8GB VRAM.
#### Hypersim
```bash
cd ${REPO_ROOT}/emsanet
WEIGHTS_FILEPATH=${REPO_ROOT}/trained_models/hypersim/r34_NBt1D.pth
DATASET_PATH=${REPO_ROOT}/datasets/hypersim
# predict all four outputs at once:
# - valid: 0.5GB + 1.3GB + 0.7GB + 23GB
# - test: 0.6GB + 1.4GB + 0.7GB + 23GB
for SPLIT in "valid" "test"
do
python inference_dataset.py \
--dataset hypersim \
--dataset-path ${DATASET_PATH} \
--use-original-scene-labels \
--tasks semantic normal scene instance orientation \
--enable-panoptic \
--no-pretrained-backbone \
--weights-filepath ${WEIGHTS_FILEPATH} \
--input-height 768 \
--input-width 1024 \
--context-module appm-1-2-4-8 \
--instance-center-heatmap-top-k 128 \
--instance-offset-distance-threshold 40 \
--inference-batch-size 2 \
--inference-split ${SPLIT} \
--inference-input-height 768 \
--inference-input-width 1024 \
--inference-output-format scannet-semantic scannet-instance scannet-panoptic mapping \
--inference-output-write-ground-truth \
--inference-output-ground-truth-max-depth 20 \
--inference-output-semantic-instance-shift $((2**16))
done
```
By default, the outputs are stored at: `${REPO_ROOT}/trained_models/hypersim/inference_outputs_r34_NBt1D/hypersim/{valid,test}/{inference_output_format}`.
To change the output path, pass `--inference-output-path` to the script.
#### ScanNet
```bash
cd ${REPO_ROOT}/emsanet
WEIGHTS_FILEPATH=${REPO_ROOT}/trained_models/scannet/r34_NBt1D.pth
DATASET_PATH=${REPO_ROOT}/datasets/scannet
# first predict scannet outputs and then mapping outputs:
# - valid: 0.4GB + 0.5GB + 0.4GB + 510GB
# - test: 63MB + 52MB + 39MB + 217GB (no ground truth)
for SPLIT in "valid" "test"
do
for OUTPUT_FORMAT in "scannet-semantic scannet-instance scannet-panoptic" "mapping"
do
if [ "$OUTPUT_FORMAT" = "mapping" ]; then
# we use a subsample of 5 for mapping
SUBSAMPLE=5
SHIFT=$((2**16)) # does not matter for mapping
else
if [ "$SPLIT" = "valid" ]; then
# we use a subsample of 50 for back-projection and evaluation
SUBSAMPLE=50
SHIFT=$((2**16))
else
# ScanNet test split -> use parameters for submission
# -> use default benchmark subsample of 100
SUBSAMPLE=100
# -> use default benchmark semantic-instance shift of 1000
SHIFT=1000
fi
fi
python inference_dataset.py \
--dataset scannet \
--dataset-path ${DATASET_PATH} \
--scannet-semantic-n-classes 20 \
--use-original-scene-labels \
--tasks semantic scene instance orientation \
--enable-panoptic \
--no-pretrained-backbone \
--weights-filepath ${WEIGHTS_FILEPATH} \
--input-height 960 \
--input-width 1280 \
--instance-offset-distance-threshold 120 \
--inference-split ${SPLIT} \
--inference-scannet-subsample ${SUBSAMPLE} \
--inference-input-height 960 \
--inference-input-width 1280 \
--inference-output-format ${OUTPUT_FORMAT} \
--inference-batch-size 2 \
--inference-output-write-ground-truth \
--inference-output-semantic-instance-shift ${SHIFT}
done
done
```
By default, the outputs are stored at: `${REPO_ROOT}/trained_models/scannet/inference_outputs_r34_NBt1D/scannet/{valid,test}/{inference_output_format}`.
To change the output path, pass `--inference-output-path` to the script.
### Reproduce reported EMSANet results
Note that the ground truth in the correct format was extracted along with the EMSANet predictions in the previous section.
#### Hypersim
```bash
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/2d_evaluation
SPLIT="valid" # valid / test
PRED_BASEPATH=${REPO_ROOT}/trained_models/hypersim/inference_outputs_r34_NBt1D/hypersim/${SPLIT}
# 2D semantic task
python evalPixelLevelSemanticLabeling.py \
--dataset hypersim \
--gt_path ${PRED_BASEPATH}/scannet_semantic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_semantic/pred_path_semantic \
--output_file ${PRED_BASEPATH}/scannet_semantic/evaluation.txt
# 2D semantic-instance task (instance)
rm ./gtInstances.json # remove cached instances if dataset or split changes
python evalInstanceLevelSemanticLabeling.py \
--dataset hypersim \
--shift $((2**16)) \
--gt_path ${PRED_BASEPATH}/scannet_instance/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_instance/pred_path_panoptic_instance \
--output_file ${PRED_BASEPATH}/scannet_instance/evaluation.txt
# 2D panoptic task
python evalPanopticLevelSemanticLabeling.py \
--dataset hypersim \
--shift $((2**16)) \
--gt_path ${PRED_BASEPATH}/scannet_panoptic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_panoptic/pred_path \
--output_file ${PRED_BASEPATH}/scannet_panoptic/evaluation.json
```
#### ScanNet
Note, we also use a semantic-instance shift of 2^16 for the ScanNet validation split in our pipeline.
Only for the hidden test split, the default shift of 1000 is used.
```bash
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/2d_evaluation
SPLIT="valid" # ground-truth annotations for test are not available (use official evaluation sever)
PRED_BASEPATH=${REPO_ROOT}/trained_models/scannet/inference_outputs_r34_NBt1D/scannet/${SPLIT}
# 2D semantic task
python evalPixelLevelSemanticLabeling.py \
--dataset scannet \
--gt_path ${PRED_BASEPATH}/scannet_semantic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_semantic/pred_path_semantic \
--output_file ${PRED_BASEPATH}/scannet_semantic/evaluation.txt
# 2D semantic-instance task (instance)
rm ./gtInstances.json # remove cached instances if dataset or split changes
python evalInstanceLevelSemanticLabeling.py \
--dataset scannet \
--shift $((2**16)) \
--gt_path ${PRED_BASEPATH}/scannet_instance/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_instance/pred_path_panoptic_instance \
--output_file ${PRED_BASEPATH}/scannet_instance/evaluation.txt
# 2D panoptic task
python evalPanopticLevelSemanticLabeling.py \
--dataset scannet \
--shift $((2**16)) \
--gt_path ${PRED_BASEPATH}/scannet_panoptic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_panoptic/pred_path \
--output_file ${PRED_BASEPATH}/scannet_panoptic/evaluation.json
```
### Extract 3D ground truth
In the ScanNet benchmark, evaluation in 3D is done by mapping created representations to annotated ground-truth representations.
While ScanNet provides annotated meshes as ground truth, such ground-truth representations are missing for Hypersim.
Therefore, we generated them ourselves for Hypersim.
#### Hypersim
Ground-truth point clouds for Hypersim are created by applying a voxel-grid filter with a voxel size of 1cm to the point cloud of each camera trajectory.
The most frequent annotation is used to assign a ground-truth annotation to each voxel.
We further limit the maximum distance to a reasonable value of 20m.
Use the `nicr_sa_prepare_labeled_point_clouds` entry point provided in our [nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/blob/v0.7.0/nicr_scene_analysis_datasets/scripts/prepare_labeled_point_clouds.py) to create the 3D ground truth.
```bash
DATASET_PATH=${REPO_ROOT}/datasets/hypersim
OUTPUT_PATH=${REPO_ROOT}/datasets/hypersim_3d
# valid: 15GB, test: 15GB
for SPLIT in "valid" "test"
do
nicr_sa_prepare_labeled_point_clouds \
hypersim \
${DATASET_PATH} \
${OUTPUT_PATH} \
--split ${SPLIT} \
--voxel-size 0.01 \
--max-depth 20 \
--write-scannet-benchmark-ground-truth
done
```
You can use the `nicr_sa_labeled_pc_viewer` entry point in our
[nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/blob/v0.7.0/nicr_scene_analysis_datasets/scripts/prepare_labeled_point_clouds.py) to browse the generated ground-truth data.
Note that the point clouds already contain RGB and label information.
However, the viewer can also be used to visualize mapped predictions.
See the `--semantic-label-filepath` and `--panoptic-label-filepath` arguments in the example below. Replace the given ground-truth files with our predicted files to visualize results.
```bash
# e.g., valid/ai_003_010/cam_00
nicr_sa_labeled_pc_viewer \
${OUTPUT_PATH}/valid/ply/ai_003_010/cam_00/voxel_0_01_maxdepth_20_0.ply \
--semantic-colormap nyuv2_40 \
--instance-colormap visual_distinct \
--semantic-label-filepath ${OUTPUT_PATH}/valid/scannet_benchmark_gt/semantic/ai_003_010_cam_00.txt \
--panoptic-label-filepath ${OUTPUT_PATH}/valid/scannet_benchmark_gt/semantic_instance/ai_003_010_cam_00.txt \
--use-panoptic-labels-as-instance-labels \
--enumerate-instances
```
#### ScanNet
For ScanNet, we provide a script that automates 3D ground-truth generation and copies the existing ply files to the same folder structure as for Hypersim.
```bash
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/3d_helpers
DATASET_PATH=${REPO_ROOT}/datasets/scannet
OUTPUT_PATH=${REPO_ROOT}/datasets/scannet_3d
SPLIT_FILES_PATH=`python -c 'import os; from nicr_scene_analysis_datasets.datasets import scannet; print(os.path.dirname(scannet.__file__))'`
# valid: 2.3GB, test: 0.7GB (no ground truth)
for SPLIT in "valid" "test"
do
python extract_scannet_ground_truth.py \
${SCANNET_DOWNLOAD_PATH} \
${SPLIT_FILES_PATH} \
${SCANNET_DOWNLOAD_PATH}/scannetv2-labels.combined.tsv \
${OUTPUT_PATH} \
--split ${SPLIT} \
--shift $((2**16))
done
```
You can use the `nicr_sa_labeled_pc_viewer` entry point in our
[nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/blob/v0.5.2/nicr_scene_analysis_datasets/scripts/prepare_labeled_point_clouds.py) to browse the generated ground-truth data.
Note that the original ScanNet point clouds only contain RGB information.
The viewer can be used to further visualize labels and mapped predictions.
See the `--semantic-label-filepath` and `--panoptic-label-filepath` arguments in the example below. Replace the given ground-truth files with our predicted files to visualize results.
```bash
# e.g., valid/scene0019_00
nicr_sa_labeled_pc_viewer \
${OUTPUT_PATH}/valid/ply/scene0019_00/scene0019_00_vh_clean_2.ply \
--semantic-colormap nyuv2_40 \
--instance-colormap visual_distinct \
--semantic-label-filepath ${OUTPUT_PATH}/valid/scannet_benchmark_gt/semantic/scene0019_00.txt \
--panoptic-label-filepath ${OUTPUT_PATH}/valid/scannet_benchmark_gt/semantic_instance/scene0019_00.txt \
--use-panoptic-labels-as-instance-labels \
--enumerate-instances
```
### Run mapping experiments
Our panoptic mapping approach is implemented using the middleware for robotic
applications (MIRA).
However, integrating our pipeline for data processing in ROS workflows is
straightforward.
We refer to the dataset reader classes in our
[nicr-scene-analysis-datasets python package](https://github.com/TUI-NICR/nicr-scene-analysis-datasets/tree/v0.7.0/nicr_scene_analysis_datasets/mira).
Once mapping is done, store the results in the following format and folder structure:
**2D (i.e., for back-projections):**
- **2D semantic task**: create prediction files similar to EMSANet predictions in `${REPO_ROOT}/trained_models/{hypersim,scannet}/inference_outputs_r34_NBt1D/{hypersim,scannet}/{valid,test}/scannet_semantic/pred_path_semantic` (see section [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation-mapping))
- **2D semantic instance task**: create prediction files similar to EMSANet predictions in `${REPO_ROOT}/trained_models/{hypersim,scannet}/inference_outputs_r34_NBt1D/{hypersim,scannet}/{valid,test}/scannet_instance/pred_path_panoptic_instance` (see section [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation-mapping))
- **2D panoptic task**: create prediction files similar to EMSANet predictions in `${REPO_ROOT}/trained_models/{hypersim,scannet}/inference_outputs_r34_NBt1D/{hypersim,scannet}/{valid,test}/scannet_panoptic/pred_path` (see section [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation-mapping))
**3D:**
- **3D semantic task**: create prediction files similar to the ground-truth files in `${REPO_ROOT}/datasets/{hypersim_3d,scannet_3d}/{valid,test}/scannet_benchmark_gt/semantic` folder (see section [Extract 3D ground truth](#extract-3d-ground-truth))
- **3D semantic instance task**: create prediction files as described for the original [ScanNet 3D Semantic Instance Prediction](https://kaldir.vc.in.tum.de/scannet_benchmark/documentation#format-instance3d) task
- **3D panoptic task**: create prediction files similar to the ground-truth files in `${REPO_ROOT}/datasets/{hypersim_3d,scannet_3d}/{valid,test}/scannet_benchmark_gt/semantic_instance` folder (see section [Extract 3D ground truth](#extract-3d-ground-truth))
### Evaluate mapping results
#### 2D evaluation
Note that the ground truth in the correct format was extracted along with the EMSANet predictions in section [Extract 2D ground truth and EMSANet predictions for evaluation / mapping](#extract-2d-ground-truth-and-emsanet-predictions-for-evaluation-mapping).
```bash
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/2d_evaluation
DATASET="hypersim" # hypersim / scannet
SPLIT="valid" # valid / test for hypersim, test for scannet
GT_BASEPATH=${REPO_ROOT}/trained_models/${DATASET}/inference_outputs_r34_NBt1D/${DATASET}/${SPLIT}
PRED_BASEPATH="/path/to/your/2d_results"
# 2D semantic task
python evalPixelLevelSemanticLabeling.py \
--dataset ${DATASET} \
--gt_path ${GT_BASEPATH}/scannet_semantic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_semantic/pred_path \
--output_file ${PRED_BASEPATH}/scannet_semantic/evaluation.txt
# 2D semantic-instance task (instance)
rm ./gtInstances.json # remove cached instances if dataset or split changes
python evalInstanceLevelSemanticLabeling.py \
--dataset ${DATASET} \
--shift $((2**16)) \
--gt_path ${GT_BASEPATH}/scannet_instance/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_instance/pred_path \
--output_file ${PREDICTION_PATH}/scannet_instance/evaluation.txt
# 2D panoptic task
python evalPanopticLevelSemanticLabeling.py \
--dataset ${DATASET} \
--shift $((2**16)) \
--gt_path ${GT_BASEPATH}/scannet_panoptic/gt_path \
--pred_path ${PRED_BASEPATH}/scannet_panoptic/pred_path \
--output_file ${PRED_BASEPATH}/scannet_panoptic/evaluation.json
```
#### 3D evaluation
Note that 3D evaluation in the ScanNet benchmark is done by comparing *.txt files containing the labels assigned to each point of the ground-truth representation.
Therefore, it is important that prediction and ground truth are aligned.
An easy way to double-check this is to visualize the prediction over the ground-truth representation using our `nicr_sa_labeled_pc_viewer` entry point (see instructions in section [Extract 3D ground truth](#extract-3d-ground-truth)).
```bash
cd ${REPO_ROOT}/evaluation/ScanNet/BenchmarkScripts/3d_evaluation
DATASET="hypersim" # hypersim / scannet
SPLIT="valid" # valid / test for hypersim, test for scannet
GT_BASEPATH=${REPO_ROOT}/datasets/${DATASET}_3d/${SPLIT}/scannet_benchmark_gt
PRED_BASEPATH="/path/to/your/3d_results"
# 3D semantic task - might be quite slow for hypersim
python evaluate_semantic_label.py \
--dataset ${DATASET} \
--pred_path ${PRED_BASEPATH}/semantic \
--gt_path ${GT_BASEPATH}/semantic \
--output_file ${PRED_BASEPATH}/evaluation_semantic.txt
# 3D semantic-instance task (instance) - might be quite slow for hypersim
python evaluate_semantic_instance.py \
--dataset ${DATASET} \
--shift $((2**16)) \
--pred_path ${PRED_BASEPATH}/semantic_instance \
--gt_path ${GT_BASEPATH}/semantic_instance \
--output_file ${PRED_BASEPATH}/evaluation_semantic_instance.txt
# 3D panoptic task - much faster than the other two benchmarks
python evaluate_panoptic.py \
--dataset ${DATASET} \
--shift $((2**16)) \
--pred_path ${PRED_BASEPATH}/panoptic \
--gt_path ${GT_BASEPATH}/semantic_instance \
--output_file ${PRED_BASEPATH}/evaluation_panoptic.json
```
## Changelog
**Jun 29, 2024**
- update EMSANet submodule to latest version:
- with `lib/nicr-scene-analysis-datasets` v0.7.0
- with`lib/nicr-multitask-scene-analysis` v0.2.3
- there is no need anymore to use a specific branch in EMSANet repository
- add more recent environment file (Python 3.11.0, PyTorch 2.3, Open3D 0.18.0)
- small fix in proposed `ScanNet/BenchmarkScripts/2d_evaluation/evalPanopticLevelSemanticLabeling.py`
- update ScanNet patch file to fix some NumPy issues in the original evaluation
script: `ScanNet/BenchmarkScripts/2d_evaluation/evalInstanceLevelSemanticLabeling.py`
- some other minor fixes
- update paper on arXiv:
- fixed small issue in Eq. 5: order was not respected
- fixed small issue in Eq. 10: second branch was limted to stuff classes only
- fixed noted CPU name in tables: Intel i7-1165G7 to Intel i7-1165G7
- some other minor fixes (appendix only)
**Sep 26, 2023**
- initial public release