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).

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support