geofusion-platform
🛰

Cross-modal retrieval across optical, SAR & multispectral sensors — the map isn't the territory, but the embedding might be.

Contrastive alignment trained on Sentinel-1, Sentinel-2 & Landsat-8 tiles, indexed for sub-50ms search.

// enterprise geospatial intelligence engine

geo
fusion

A research-grade retrieval platform that finds the same patch of Earth across three different satellites, three different physics, one shared latent space.

OPTICAL SAR MULTISPECTRAL

Five services,
one origin.

Frontend
geofusion-platform.vercel.app
API Gateway
geofusion-platform.onrender.com/docs
Embedding Service
geofusion-embedding.onrender.com/docs
Retrieval Service
geofusion-retrieval.onrender.com/docs
Evaluation Service
geofusion-evaluation.onrender.com/docs
admin → admin / geofusion_demo_2026
analyst (read-only) → analyst / analyst_pass

First request may take 30–60s — free-tier services cold-start from sleep.

Six microservices,
each doing one thing.

Frontend
React SPA, Vite build, served from the Vercel edge network.
React 18 · Vite · Vercel rewrites
API Gateway
Auth, rate limiting, request routing, explainability layer.
FastAPI · JWT · structlog · Prometheus client
Embedding Service
Maps each raw satellite tile into a 512-D latent vector.
PyTorch · timm ViT · ResNet50
Retrieval Service
Vector → top-K nearest matches across the shared index.
FAISS · IndexFlatIP · cosine similarity
Evaluation Service
Benchmarking, precision/recall curves, latency profiling.
F1@K · mAP · p50/p95/p99

The same patch of Earth,
seen three ways.

step 01 — shared embedding space
Modality-specific encoders, one latent space

An optical image and a SAR image of the same region are pushed through separate encoders into a common d-dimensional space, so geometry — not sensor physics — becomes the basis for comparison.

z_o = f_o(x_o; θ_o) z_s = f_s(x_s; θ_s) z_o, z_s ∈ R^d
step 02 — fusion objective
Pull matches together, push mismatches apart

Training minimizes embedding distance between images of the same location while enforcing a margin m between unrelated pairs — the core hypothesis of the whole platform.

min Σ D(f_o(x_o^i), f_s(x_s^i)) subject to D(f_o(x_o^i), f_s(x_s^j)) > m, i ≠ j
step 03 — contrastive loss
InfoNCE over cosine similarity

For a positive pair, the loss softly ranks the true match above every other candidate in the batch, tempered by τ.

L = −log[ exp(Sim(z_o,z_s)/τ) / Σ_k exp(Sim(z_o,z_k)/τ) ] Sim(z_i,z_j) = (z_i · z_j) / (‖z_i‖ ‖z_j‖)
step 04 — retrieval at scale
Search in log time, not linear time

A FAISS approximate nearest-neighbour index turns brute-force search into something that stays fast past a million tiles.

O(N·d) → O(log N) sub-50ms over 1M+ tiles

Three sensors,
one Earth.

ModalitySourceBands / Format
Optical Sentinel-2 · ESA Copernicus 10 bands (B02–B12) · 10–60m resolution
SAR Sentinel-1 · ESA Copernicus VV + VH polarisations · ~10m resolution
Multispectral Landsat-8 · USGS 11 bands · 30m resolution

The live demo index is seeded with 20 synthetic tiles across the Amazon, Sahara, Himalayas, Arctic and Pacific — the same /index/add endpoint scales to millions in production.

Four commands
to a live retrieval.

clone & install
# 1. clone the repo
git clone https://github.com/Tejaswanth2406/geofusion-platform.git
cd geofusion-platform
pip install -r requirements.txt
start the stack
# 2. gateway, embedding, retrieval, evaluation, MLflow, Prometheus, Grafana
docker-compose up --build -d
authenticate
curl -X POST http://localhost:8000/auth/token \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"geofusion_demo_2026"}'
cross-modal retrieval
curl -X POST http://localhost:8000/api/v1/retrieve \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -F "sensor=optical" \
  -F "image=@data/sentinel2/tile001/image.tiff"

Measured, not assumed.

Precision@K

Share of the top-K retrieved tiles that are actually relevant.

|Relevant ∩ Retrieved@K| / K
Recall@K

Share of all relevant tiles the system managed to surface.

|Relevant ∩ Retrieved@K| / |Relevant|
F1@K

Harmonic mean of precision and recall at K.

2·P·R / (P + R)
mAP & latency

Mean average precision plus p50/p95/p99 request latency, tracked in Prometheus.

Grafana · live dashboards
// go touch some satellite data

try it live

Sign in with the demo credentials above and run a real cross-modal search in under a minute.

Open the platform → View source on GitHub