File size: 7,002 Bytes
3a34048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
---
language: en
license: other
library_name: pytorch
tags:
  - remote-sensing
  - satellite-imagery
  - earth-observation
  - change-detection
  - visual-grounding
  - image-captioning
  - visual-question-answering
  - optical-sar-fusion
  - lora
  - peft
pipeline_tag: image-to-text
config_hash: 78f1e3700da15aa1
---

# Model Card — SatQuery AI

SatQuery AI answers natural-language questions about satellite imagery using a **router + specialists**
design. This card covers the **six trained artifacts** released by the project. It is deliberately
explicit about what is measured, what is not, and what was rejected.

> **The six trained artifacts are small modules on top of frozen, publicly-pinned backbones. No
> backbone weights are redistributed by this release** — they are fetched from the Hugging Face Hub at
> run time, pinned by revision.

Machine-readable identities (byte counts and sha256) are in
[`models/manifest.json`](models/manifest.json) and [`models/checksums.sha256`](models/checksums.sha256),
**generated by reading the files**. Where this card and the generated manifest disagree, the manifest
wins.

---

## 1. Artifacts in this release

| # | Task | Kind | File | Bytes | sha256 (first 16) |
|---|---|---|---|---|---|
| 1 | `change` | trained head | `head.pt` | 63,231,009 | `c5ef31277b67aa01` |
| 2 | `change_vqa` | trained head | `head.pt` | 5,822,809 | `cfae5e43b97ca930` |
| 3 | `optical_sar` | trained head | `head.pt` | 14,427,457 | `785815729a3a39fc` |
| 4 | `grounding` | trained head | `head.pt` | 12,639,041 | `93432f7034be91a8` |
| 5 | `router` | trained adapter | `adapter.pt` | 211,961 | `8527c3ed28a293e1` |
| 6 | `vlm` | LoRA adapter | `adapter_model.safetensors` | 34,798,048 | `07c76a75fa046248` |

Two of these hashes (`change_vqa`, `vlm`) **agree exactly** with hashes recorded independently at
promotion time — an external cross-check, not a self-consistency claim.

## 2. Backbone dependencies (frozen, pinned by revision)

| Role | Repository | Revision |
|---|---|---|
| Router encoder | `sentence-transformers/all-MiniLM-L6-v2` | `1110a243fdf4` |
| VLM | `HuggingFaceTB/SmolVLM-500M-Instruct` | `a7da5b986cb5` |
| Grounding | `chendelong/RemoteCLIP` (`RemoteCLIP-ViT-B-32.pt`) | `bf1d8a3ccf2d` |
| Optical-SAR | `antofuller/CROMA` (`CROMA_base.pt`) | `0dd28e3d633b` |
| Change | STANet-style (ResNet-18 + PAM) | trained in-project |

## 3. Intended use

- **Research and demonstration** of a modular, CPU-first remote-sensing QA system.
- **Routing and dispatch** of natural-language queries to the appropriate specialist.
- **Reproducible evaluation** of each specialist on its own documented split.

## 4. Out-of-scope use

- **Safety-, legal- or life-critical decisions.** No accuracy, calibration or robustness guarantee is
  offered for any high-stakes use.
- **Operational geospatial production** without independent validation.
- **Any use of the VLM adapter as a production model** — it is acceptance-rejected (§6).
- **Treating per-specialist metrics as system-level accuracy.** No end-to-end benchmark exists (§7).

## 5. Measured performance

| Task | Metric | Value | Split / protocol |
|---|---|---|---|
| change | pooled IoU / macro IoU / pooled F1 | **0.8122 / 0.8457 / 0.8964** | LEVIR-CD-256 test, n = 2048 |
| grounding | mean best IoU / recall@0.5 | **0.2838 / 0.2198** canonical; **0.2566 / 0.1938** matched6 | VRSBench, n = 16159 |
| grounding | head-argmax / zero-shot baseline IoU | **0.1215 / 0.0972** | canonical |
| optical_sar | accuracy / macro F1 | **0.931 / 0.434161** | held-out test, n = 4000, 19 classes |
| change_vqa | accuracy / macro F1 | **0.697626 / 0.378373** (test); **0.651469 / 0.372309** (test2) | two test sets |
| vlm | exact_match / F1 | **0.963 / 0.96432** | frozen 1000-question subset |
| router | overall **ungated** accuracy | **0.965116** | val, n = 86 — **TEST NOT RUN** |

**Every value is checked against its artifact** by `tools/verify_readme_metrics.py`.

### 5.1 Calibration — reported as a negative result

Temperature scaling is enabled (T = 0.9772732, fit on val n = 16,441). **ECE worsened**:
0.013755 → **0.014929**. It is retained because it is part of the frozen configuration, not because it
helped.

## 6. Acceptance status

| Artifact | Metrics | Acceptance |
|---|---|---|
| change | VERIFIED | accepted (shipped) |
| grounding | measured (2 protocols) | shipped |
| optical_sar | measured | **ruling OPEN** |
| change_vqa | measured (2 test sets) | **ruling OPEN** |
| router | measured (val only) | shipped; test NOT RUN |
| **vlm** | usable (exact_match 0.963) | **ACCEPTANCE-REJECTED** |

**`USABLE_VERIFIED` ≠ `ACCEPTANCE-ACCEPTED`.** The VLM adapter works and is not promoted; the deployed
caption/VQA path uses the **unadapted** model.

## 7. Evaluation gaps (stated, not hidden)

- **No system-level end-to-end benchmark exists.** None is claimed.
- **Router test split: NOT RUN.**
- **Benchmark adapters: NOT RUN.**
- **Cross-dataset generalisation: NOT RUN.**
- **Human and robustness evaluation: NOT RUN.**

## 8. Limitations

- Grounding absolute IoU is low (0.28) and protocol-sensitive.
- Optical-SAR accuracy is carried by common classes (macro-F1 0.434161).
- The BigEarthNet local subset is **100 % single-label** vs the official 1–11 multi-label scheme, so
  its metrics are **not comparable** to published numbers.
- The optical-SAR service returns a bare class index, not a label.
- Known router residuals exist (e.g. *"What is the new runway?"* reads `change`).
- No `LICENSE` file exists in the source repository.

See [`docs/LIMITATIONS.md`](docs/LIMITATIONS.md) for the full catalogue.

## 9. Training summary

Small modules on frozen backbones; seed 42; every artifact records the frozen config hash
`78f1e3700da15aa1`. Router and change/grounding/fusion heads train on CPU; the VLM LoRA adapter and
the change-VQA head were trained on **external GPUs** (the latter via a documented Kaggle run). Full
detail in [`docs/TRAINING.md`](docs/TRAINING.md).

## 10. Provenance and verification

| Item | Location |
|---|---|
| Byte-exact manifest | `models/manifest.json` |
| Checksums | `models/checksums.sha256` |
| Metric verification tool | `tools/verify_readme_metrics.py` |
| Metric verification output | `tools/readme_metrics_report.txt` |
| Full documentation | `docs/` |
| Release manifest | `RELEASE_MANIFEST.md` |

## 11. Licence

The project ships **no licence file**; a licence must be selected by the owner before public release
of the *code*. **Model weights carry the terms of their backbone licences** — consult each backbone's
Hugging Face page. Backbones are not redistributed here.

## 12. Citation

If you use this work, cite the project repository:

```bibtex
@misc{satquery_ai_2026,
  title  = {SatQuery AI: A Modular Router-and-Specialists System for Satellite Imagery Question Answering},
  author = {SatQuery AI},
  year   = {2026},
  note   = {Public release: https://github.com/Anish-lab-blip/SatQuery-AI}
}
```