BRKMYR/ AI Builder Portfolio/ SAR VLM
A natural-language console over synthetic-aperture radar satellite imagery. Ask "how many vessels?" and get a number, a confidence, and the raw scores backing it.
Problem
NewSpace SAR constellations image the whole earth daily at sub-meter resolution, day or night, through clouds. But radar backscatter doesn't look like a photograph. It looks like static with structure. The people who care about the data (port managers, defense analysts, commodity desks, insurers) don't want to look at it. They want to ask questions.
Two failure modes are equally bad: a specialist takes days to answer, or a generic vision-language model hallucinates a plausible-sounding count that isn't grounded in the physics of what the sensor can actually see.
Solution
Questions are parsed into (task, target) intents. The scene is tiled and passed through SARCLIP (a SAR-native CLIP variant); each tile gets a score against a positive and a negative prompt. A capability gate checks whether the requested target is resolvable at the scene's band and pixel size, and refuses the query if not. Positive tiles are grouped into clusters, and the count is the number of clusters. There is no LLM in the answer path, so the number can only come from the encoder scores.
Every query and response is persisted to a local SQLite audit log with the full score vector, the threshold, and the prompt strings. Nothing about an answer is opaque.
Live capture · supported query
Live capture · refused query
large_vessel, port_activity.
Success criteria
Metrics, KPIs, evals
| KPI | Value | What it means |
|---|---|---|
| Capability-gate precision | 1.00 | The gate refused the aircraft query on a 10 m/px scene. It did not refuse the vessel query on the 0.5 m/px scene. This is the KPI the whole system is designed around. |
| Answer confidence | 0.887 | Vessel query on S0101. Composite of cluster scores and positive-tile ratio. Human-readable rendering: 9 of 10 confidence segments filled. |
| Latency P50 | 51 ms / 28 ms | Supported query (full inference) vs refused query (short-circuit before inference). CPU only. |
| Audit completeness | 4 / 4 queries | Every response, including refusals, persisted to SQLite with the full payload. See the audit log JSON below. |
| Determinism | byte-identical | Scene generator seeded with a fixed SeedSequence. Two runs produce the same PNGs and the same scores. |
| Test coverage | 47 tests | Backend, generator, audit store, and frontend all green. Ruff clean. |
synthetic model variant; the SARCLIP swap-in is a config toggle.Raw artefacts
Every element on this page comes from a real API call captured during the demo run: scenes.json · query_S0101_vessels.json · query_S0104_aircraft.json · audit.json · health.json