Oliver Lemke1,2, Alexander Liniger1, Abel Gawel1, Marco Hutter1,2
1Robotics and AI Institute Β Β 2ETH Zurich
We present Vernata, a multi-modal, multi-teacher distillation framework for self-supervised learning on outdoor LiDAR point clouds. Building upon the Sonata architecture, we introduce sparse view augmentation, a memory bank mechanism, and cross-modal distillation using dense, high-resolution 2D image features to enable fine-grained semantic guidance and robust inference across varying point densities.
Overview of the Framework. We present a multi-modal multi-teacher distillation architecture for self-supervised point cloud learning. Building upon the Sonata framework, highlighted in gray, our model is anchored by two teachers processing global views of the scene: A 3D teacher (top), employing a PTv3 encoder and updated via EMA, and a frozen 2D teacher (bottom), producing DINOv2-S features, which are upsampled with LoftUp and backprojected into the point cloud. In contrast, the student receives three variations of the global view: masked views, local crops, and sparse subsampled views. The student embeddings are aligned with the 3D teacher via cross-entropy loss and with the 2D teacher via cosine similarity.
For lightweight inference without the full training pipeline, see our standalone inference repository: vernata-inference (coming soon). It provides minimal dependencies and pre-trained model loading out of the box.
We use two separate conda environments. Follow the linked READMEs for step-by-step instructions:
- Main environment (Python 3.12, CUDA 12.4) β covers training, evaluation, and all model code.
See
install/vernata/README.md. - Waymo parsing environment (Python 3.10) β only needed if you work with the Waymo Open Dataset, which requires older TensorFlow dependencies.
See
install/waymo/README.md.
Download and preprocess the datasets you want to train on. Each dataset has its own processing pipeline and README under source/scripts/datasets/. See the dataset processing README for an overview.
Before launching any training or evaluation run, open the script you want to use and update the paths marked with !! MUST change before running at the top of each file. The key fields are:
| Field | Where to set it | Description |
|---|---|---|
paths.resources |
All scripts | Root directory containing your datasets. |
dataset.*.data_root |
All scripts | Path to the WebDataset shards for each dataset (relative to paths.resources or absolute). |
trainer.devices |
All scripts | Number of GPUs on your machine. |
trainer.strategy |
All scripts | ddp for multi-GPU, auto for single GPU. |
model.inference.local.model_path |
Downstream & validation scripts | Path to the downloaded checkpoint (see Pre-trained Models). Passed automatically via the $1 positional argument. |
model.inference.local.config_path |
Downstream & validation scripts | Path to the downloaded config YAML. Passed automatically via the $1 positional argument. |
The scripts/ directory contains ready-to-use shell scripts for reproducing our results. The pipeline is split into three sequential stages:
| Stage | Directory | Description |
|---|---|---|
| Self-supervised pre-training | scripts/ssl/ |
Trains the Vernata multi-teacher distillation model on unlabelled LiDAR data. This is the main pre-training step. |
| Downstream evaluation | scripts/downstream/ |
Freezes the pre-trained backbone and trains a linear segmentation head on labelled data to evaluate representation quality. |
| Validation | scripts/validate/ |
Runs inference on a trained checkpoint and reports metrics (e.g., mIoU). |
Each script documents the required and optional configuration overrides at the top of the file. See the scripts/README.md for more details.
We release a pre-trained checkpoint that was self-supervised on Grand Tour + TartanGround and then downstream fine-tuned with linear probing on TartanGround.
| Model | Pre-training data | Downstream data | Backbone | TartanGround mIoU | Download |
|---|---|---|---|---|---|
| Vernata (base) | Grand Tour + TartanGround | TartanGround (small split) | PTv3-base | 0.5471 | checkpoint + config |
# Download the checkpoint and config into a local directory
mkdir -p checkpoints/vernata-base
wget -O checkpoints/vernata-base/checkpoint.ckpt "https://huggingface.co/theaiinstitute/vernata_ttg_SpSkCmd/resolve/main/ssl/checkpoint.ckpt"
wget -O checkpoints/vernata-base/unresolved-config.yaml "https://huggingface.co/theaiinstitute/vernata_ttg_SpSkCmd/resolve/main/ssl/unresolved-config.yaml"The checkpoint contains both the pre-trained backbone and the TartanGround segmentation head. You can use it in two ways:
Validation β evaluate the released checkpoint on TartanGround (uses the included segmentation head):
# Pass the checkpoint folder as the first argument:
bash scripts/validate/validate_ttg.sh /path/to/checkpoints/vernataDownstream fine-tuning on a new dataset β load only the backbone and train a fresh segmentation head (e.g., on your own dataset):
# Pass the checkpoint folder as the first argument:
bash scripts/downstream/downstream_way.sh /path/to/checkpoints/vernataNote: The downstream and validation scripts expect the path to the local checkpoint folder as the first positional argument. The folder should contain
checkpoint.ckptandunresolved-config.yaml.
As part of this work, we introduce a standardized evaluation protocol for TartanGround, including a custom 7-class semantic taxonomy, curated train/val splits, and scene-specific label corrections. This enables consistent, reproducible benchmarking across methods. See TARTANGROUND_EVAL.md for the full specification.
vernata/
βββ install/ # Environment setup (conda + pip)
β βββ vernata/ # Main environment (Python 3.12, CUDA 12.4)
β βββ waymo/ # Separate Waymo TFRecord parsing env (Python 3.10)
βββ resources/
β βββ configs/ # Hydra / OmegaConf configuration pipeline
β βββ config.yaml # Root config (merged at runtime)
β βββ dataset_configs/ # Per-dataset configs (Waymo, Grand Tour, TartanGround, β¦)
β βββ model_configs/ # Backbone & head architecture definitions
β βββ stage_configs/ # Training stage overrides (SSL, downstream, validation, β¦)
βββ scripts/ # Shell scripts for launching training & evaluation
β βββ ssl/ # Self-supervised pre-training jobs
β βββ downstream/ # Linear-probe downstream evaluation jobs
β βββ validate/ # Standalone validation jobs
βββ source/ # Python source code
βββ main.py # Entry point β initialises Hydra config & runs the Orchestrator
βββ orchestrator/ # Stage-based training orchestrator
βββ models/ # Model definitions
β βββ model/ # Vernata Lightning modules
β βββ blocks/ # Shared components (clustering, Sinkhorn-Knopp, β¦)
β βββ point_transformer/ # PointTransformerV3 backbone (serialization, modules)
βββ dataset_manager/ # Dataset & DataModule implementations
β βββ data_module.py # PyTorch Lightning DataModule
β βββ *_dataset.py # Per-dataset classes (Waymo, Grand Tour, TartanGround)
βββ callbacks/ # Lightning callbacks (logging, profiling, β¦)
βββ optimizer/ # Optimizer & LR scheduler construction
βββ vernata_utils/ # Shared utilities
β βββ core/ # Config manager, registry, auto-instantiation, logging
β βββ data/ # Point cloud data structures, transforms, rigid-body math
β βββ training/ # Dataloader helpers, W&B logging, rank utilities
β βββ metrics/ # Loss functions & evaluation metrics
β βββ vis/ # Point cloud & similarity visualization
β βββ inference/ # Inference utilities
βββ scripts/ # Standalone Python scripts
β βββ datasets/ # Dataset download & processing pipelines (per-dataset READMEs)
β βββ vis/ # WebDataset inspection & visualization
βββ third_party/ # Vendored / submoduled external code
βββ loftup/ # LoftUp β 2D feature upsampling & backprojection
βββ pointcept/ # Pointcept β point cloud learning toolkit
βββ tartanairpy/ # TartanAir download API
| Topic | Location |
|---|---|
| Installation (main environment) | install/vernata/README.md |
| Installation (Waymo parsing) | install/waymo/README.md |
| Configuration pipeline | resources/configs/README.md |
| Training & evaluation scripts | scripts/README.md |
| Dataset processing pipelines | source/scripts/datasets/README.md |
source/main.pyinitialises the Hydra configuration and launches the Orchestrator.- The Orchestrator (
source/orchestrator/) handles the stages defined in the config (e.g. self-supervised pre-training β downstream evaluation). - Models (
source/models/) implement the Vernata multi-teacher distillation architecture on top of a PointTransformerV3 backbone, wrapped as PyTorch Lightning modules. - Datasets (
source/dataset_manager/) provide WebDataset-backed data loading for Waymo, Grand Tour, and TartanGround, with configurable transform pipelines. - Configuration (
resources/configs/) is fully declarative β dataset, model, and stage configs are composed by Hydra at runtime. See the configuration README for a detailed guide.
- [2026-08] We released the code, our pre-trained models, and the standardized TartanGround evaluation protocol. Check out our paper and website.
If you find this work useful, please consider citing:
@article{lemke2026vernata,
author = {Lemke, Oliver and Liniger, Alexander and Gawel, Abel and Hutter, Marco},
title = {Vernata: Self-Supervised Learning of LiDAR Point Representations},
journal = {arXiv preprint arXiv:2608.06919},
year = {2026}
}Thank you to the creators and maintainers of the following projects that helped make this work possible:
- LoftUp for the feature upsampler.
- Pointcept / Sonata for their point cloud research code base.
- TartanGround / tartanairpy for the dataset and processing pipeline and support regarding dataset access.
- GrandTour for the dataset and support regarding dataset access.
- Waymo for the dataset.