SAT-RoMa
Decoder-only weights for SAT-RoMa, an inference-only release of a satellite/aerial dense-matching model built on a frozen DINOv3 backbone. SAT-RoMa localizes a small query image (e.g. a UAV/drone frame) inside a larger reference map covering the same ground, at the same ground sample distance β a small aerial view searched against a preloaded, wider map.
Code, quickstart, and full documentation: https://github.com/macnack/sat_roma_infer
What's here
Three checkpoints' decoder weights only β the frozen DINOv3 ViT-L/16
backbone is not included. It's fetched separately by timm at model-build
time (governed by Meta's own DINOv3 licence terms, not this repo's MIT
licence β see Backbone dependency below). Each
checkpoint here is <name>_decoder.safetensors (~322 MB) plus
<name>_config.json recording its exact preprocessing configuration.
| File | Regime | Corner error | Notes |
|---|---|---|---|
sat_roma_4adxis71_decoder.safetensors |
Drone-in-preloaded-map (~4x query:reference) | ~4.27 m mean (planar test split) | The ACIVS-2026 paper checkpoint. Not tilt-invariant. |
sat_roma_hir0vdf6_decoder.safetensors |
Drone-in-preloaded-map (~4x) | ~4.83 m mean planar, ~4.86 m at Β±30Β° tilt | Degrades gracefully under camera tilt. |
sat_roma_0t1q66hy_decoder.safetensors |
Large-area aerial search (500β1500 m reference, 1:2β1:8 scale ratio) | ~14.2 m median, 51.4 m mean (heavy tail; 67% within 20 m) | A different search regime β not comparable to the other two's numbers. |
All three: frozen DINOv3 ViT-L/16, sat_normalize=True, inference resolution
fixed at im_A 224px / im_B 896px. Full per-checkpoint detail, scope/limits,
and citation are in the GitHub README.
Usage
from sat_roma import SatRoMaMatcher
matcher = SatRoMaMatcher.from_pretrained("hir0vdf6") # downloads from this repo
result = matcher.match("query.png", "reference.png")
Requires pip install -e . from the GitHub repo,
which also has the CLI (sat-roma-match) and a runnable demo with a bundled
example pair.
Backbone dependency
The DINOv3 ViT-L/16 backbone is fetched by timm
(vit_large_patch16_dinov3.sat493m) the first time a matcher is built. It is
not redistributed with these decoder weights and is governed by Meta's
own DINOv3 licence terms:
facebookresearch/dinov3/LICENSE.md.
No Hugging Face login is required β that specific weight tag downloads
anonymously.
Validation status
Each checkpoint's export was verified against a training-run sidecar
recording its actual preprocessing configuration where one exists
(hir0vdf6, 0t1q66hy); 4adxis71 has no sidecar on disk, so its export
config is asserted rather than automatically verified, though it has been
independently cross-checked against the checkpoint's own documentation.
The public inference code path (this repo's weights + the linked GitHub
code) has been validated end-to-end on one held-out query/reference pair
against ground truth: 10.25 m mean corner error on 0t1q66hy, consistent
with that checkpoint's documented ~14.2 m median. A full multi-pair
numerical parity check between the research codebase and this public
inference path has not yet been run β treat results as consistent with
the checkpoints' documented performance rather than bit-exact-certified
against the research implementation.
Licence
These decoder weights are released under the MIT licence β see LICENSE in the linked repository. This does not cover the DINOv3 backbone (see above).
Citation
@inproceedings{krupka2026satroma,
title = {Implicit-semantic Multi-Hypothesis Dense Matching for
GPS-Denied Localization in Cross-Temporal Overhead Imagery},
author = {Krupka, Maciej and Wegrzynowski, Jan and Skrzypczy{\'n}ski, Piotr},
booktitle = {Advanced Concepts for Intelligent Vision Systems (ACIVS)},
year = {2026},
note = {To appear},
}
This code builds on RoMa (Edstedt et al., CVPR 2024).