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
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| poincar3-1.0.0.tar.gz | 137.5 kB | Without provenance | Details for poincar3-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| poincar3-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for poincar3-1.0.0-py3-none-any.whl |
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}
|
Security for poincar3 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.