Skip to main content

Emergent Multi-View Geometry Through Self-Distillation

arXiv PyPI Project Page

David Nordström1, Thibaut Loiseau2, Vincent Lepetit2,
Michael Felsberg3, Guillaume Bourmaud4, Fredrik Kahl1

1 Chalmers University of Technology, 2 Ecole Nationale des Ponts et Chaussées, IP Paris,
3 Linköping University, 4 University of Bordeaux, CNRS

Emerging matching capabilities from self-supervision. Henri Poincaré
Left: Emerging matching capabilities from self-supervision. Simply using Poincar3's attention map reliable tracks can be created. Produced by demo.py. Right: Henri Poincaré argued that a being without motion cannot understand 3D space.

Overview

We release a model, Poincar3, that learns multi-view geometry from only training on image sequences. Poincar3 uses a multi-view transformer and a self-distillation objective giving strong zero-shot features and attention maps.

Install

uv add poincar3          # or: pip install poincar3

The model itself needs only torch. Extras pull in what the scripts need:

uv add "poincar3[demo]"     # demo.py
uv add "poincar3[train]"    # training, mvcorr and SeeSE3 evals
uv add "poincar3[eval]"     # + matchbench and feed-forward reconstruction

To work from a clone instead (tested on Linux with Python 3.12):

uv sync --extra eval

Usage

The checkpoint auto-downloads on first use:

import torch
from poincar3 import Poincar3

model = Poincar3().eval().cuda()

# A multi-view batch: [batch, frames, 3, H, W], RGB in [0, 1], H and W multiples of 16.
images = torch.rand(1, 4, 3, 448, 448).cuda()

with torch.no_grad():
    patch_logits, patch_features, global_logits, camera_tokens = model(images)

# patch_features:  [1, 4, 784, 1024]  dense per-frame tokens, cross-view attended
# camera_tokens:   [1, 4, 1024]       one per-frame scene/pose token

Demo

We illustrate how to create attention tracks by simply running:

uv run python demo.py

We also provide code for plotting the raw feature correlations in cross_correlations.py.

Pretrained weights

Auto-downloaded on first use. To fetch it directly:

Evaluation

All evaluations, except feed-forward reconstruction, can be accessed through the experiments/eval.py endpoint. You can get ScanNet and NAVI following these instructions. To get the possible configurations, simply run it with the flag --help. For example, you run multi-view correspondence estimation on scannet by:

uv run python experiments/eval.py --evaluation mvcorr --mvcorr.dataset scannet

Feed-forward reconstruction

Camera-pose and per-pixel-depth heads on top of the backbone, under two protocols:

# full finetune
torchrun --nproc-per-node 4 experiments/ffrecon/train.py --name finetune-poincar3

# frozen backbone + a small adapter
torchrun --nproc-per-node 4 experiments/ffrecon/train_adapter.py --backbone poincar3

# relative pose evaluation
uv run python experiments/ffrecon/eval.py --checkpoint <path> --evaluation relpose --relpose.dataset megadepth
# point-cloud estimation
uv run python experiments/ffrecon/eval.py --checkpoint <path> --evaluation pointcloud --pointcloud.dataset eth3d

Training

torchrun --nproc-per-node 4 experiments/train.py --name my-run

Training data

While we trained on large collection of 3D datasets, we illustrate our training protocol on ScanNet++ and RealEstate10K. You can download them using their official download links.

License

MIT, except where a file notes otherwise. src/poincar3/layers/ and parts of heads/ derive from DINOv3 and VGGT and carry their original licenses; benchmarks/mv_consistency/ is adapted from probe3d (MIT).

Acknowledgement

Built on DINOv3, DINOv2, VGGT, probe3d and RoMa.

BibTeX

TBD

Release files for poincar3 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for poincar3 1.0.0
File Size Uploaded
poincar3-1.0.0.tar.gz 137.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for poincar3 1.0.0
File Interpreter ABI Platform
poincar3-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 317.6 kB

Release files / poincar3-1.0.0.tar.gz

Download URL poincar3-1.0.0.tar.gz
Size 137.5 kB
Tags Source
SHA-256 checksum
How to use checksums
01a8b986db568116c1c0c564d9dd84b699c8f6932c57036408707a1279648fcd
BLAKE2b-256 checksum
How to use checksums
01ea95575a8d49ff8749d82fd11e68f1133bdfb9854333c450163d04633f2a54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / poincar3-1.0.0-py3-none-any.whl

Download URL poincar3-1.0.0-py3-none-any.whl
Size 180.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c32e54acfa1a4ab61969f95bb761db42ee02849628938d5e1f957fdf7dd663f3
BLAKE2b-256 checksum
How to use checksums
d510a20656c36dcdc3d6d0a1573d8a43849268481b781c8c75480380afa5a4f0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page