Skip to content

SiMoM0/LIDO

Repository files navigation

Learning to Identify Out-of-Distribution Objects for 3D LiDAR Anomaly Segmentation

Simone Mosco, Daniel Fusaro, Alberto Pretto

University of Padova

CVPR 2026

Paper PDF Project Page HF Model YouTube Video

teaser

LIDO is a novel approach for 3D LiDAR anomaly segmentation that directly works on the feature space to distinguish between inlier known classes and anomalous objects, relying on a combination of training losses and inference scores to produce both semantic and anomaly segmentation. We also introduce three new mixed real-synthetic OoD datasets for 3D LiDAR anomaly segmentation, based on established autonomous driving benchmarks. We design a pipeline to insert and geometrically align synthetic 3D objects into real LiDAR scans, including realistic intensities computation.

News

  • 2026-04-29: Code is released.
  • 2026-02-21: LIDO is accepted to CVPR 2026.

Installation

Create an environment and install the required packages with pip install -r requirements.txt.

We also provide a pre-built singularity image for quick usage.

Please refer to INSTALL.md for further details and step-by-step guide to setup the environment.

Data Preparation

STU

Download STU dataset from the official webiste.

SemanticKITTI

Download SemanticKITTI dataset from the official website.

SemanticPOSS

Download SemanticPOSS dataset from the official website.

nuScenes

Download nuScenes dataset from the official website. Convert it into KITTI format using the script nuscenes2kitti.

OoD Datasets

Please refer to DATA.md for the details to prepare SemanticKITTI-OoD, SemanticPOSS-OoD and nuScenes-OoD datasets.

Training

Run the following commands to train, specifying the dataset and log paths:

### SemanticKITTI
python train.py --dataset /path/to/semantickitti/ --data ./config/labels/semantic-kitti.yaml --config ./config/MinkowskiNet-semantickitti.yaml --log ./log/kitti [--fp16]

### nuScenes
python train.py --dataset /path/to/nuscenes/ --data ./config/labels/nuscenes.yaml --config ./config/MinkowskiNet-nuscenes.yaml --log ./log/nuscenes [--fp16]

### SemanticPOSS
python train.py --dataset /path/to/semanticposs/ --data ./config/labels/semantic-poss.yaml --config ./config/MinkowskiNet-poss.yaml --log ./log/poss [--fp16]

Testing

Run the following scripts to infer on a specific dataset:

### STU
python infer.py --dataset /path/to/stu/ --data ./config/labels/stu.yaml --config ./config/MinkowskiNet-semantickitti.yaml --log /path/to/predictions --model /path/to/modeldir/ --split train/valid/test [--save] [--fp16]

### SemanticKITTI-OoD
python infer.py --dataset /path/to/kitti-ood/ --data ./config/labels/semantic-kitti.yaml --config ./config/MinkowskiNet-semantickitti.yaml --log /path/to/predictions --model /path/to/modeldir/ --split train/valid/test [--save] [--eval] [--fp16]

### nuScenes-OoD
python infer.py --dataset /path/to/nuscenes-ood/ --data ./config/labels/nuscenes.yaml --config ./config/MinkowskiNet-nuscenes.yaml --log /path/to/predictions --model /path/to/modeldir/ --split train/valid/test [--save] [--eval] [--fp16]

### SemanticPOSS-OoD
python infer.py --dataset /path/to/poss-ood/ --data ./config/labels/semantic-poss.yaml --config ./config/MinkowskiNet-semanticposs.yaml --log /path/to/predictions --model /path/to/modeldir/ --split train/valid/test [--save] [--eval] [--fp16]

### E.g. for STU and pretrained model
# python infer.py --dataset /STU_dataset/ --data ./config/labels/stu.yaml --config ./config/MinkowskiNet-semantickitti.yaml --log ./stu_preds --model /path/to/modeldir/ --split valid --save --fp16

### E.g. for SemanticKITTI-OoD (multi)
# python infer.py --dataset /kitti-ood-multi/ --data ./config/labels/semantic-kitti.yaml --config ./config/MinkowskiNet-semantickitti.yaml --log ./kitti_ood_preds --model /path/to/modeldir/ --split valid --save --fp16

Specify the --save argument to save both semantic predictions and anomaly scores to the log path. Use --eval to run also the semantic segmentation evaluation (be aware that this works only for the proposed OoD datasets as STU does not provide full semantic labels for the validation and test splits).

Anomaly Evaluation

To run the OoD evaluation we provide an adapted script from the official STU repo. For further details please refer to their original implementation.

python3 compute_point_level_ood.py --data-dir /ood-dataset/sequences/ --pred-dir /ood-predictions/

### E.g. for SemanticKITTI-OoD (multi)
# python3 compute_point_level_ood.py --data-dir /kitti-ood-multi/sequences/ --pred-dir /kitti-ood-predictions/

Model Zoo

Pretrained models are available on Hugging Face.

Checklist

  • Update README
  • Release code
  • Upload models
  • Upload data

Citation

If you find our work useful please cite our paper:

@inproceedings{mosco2026learning,
    title={Learning to Identify Out-of-Distribution Objects for 3D LiDAR Anomaly Segmentation},
    author={Mosco, Simone and Fusaro, Daniel and Pretto, Alberto},
    booktitle={IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
    year={2026}
}

Acknowledgment

Code is built upon TorchSparse, STU, ContMAV, RangeRet, 2DPASS.

Releases

No releases published

Packages

 
 
 

Contributors

Languages