Emergent Multi-View Geometry Through Self-Distillation
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
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:
- Poincar3 ViT-L/16 — Download
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)
| File | Size | Uploaded | |
|---|---|---|---|
| poincar3-1.0.0.tar.gz | 137.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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}
|