Thank You priyangshu for the architecture and API work on the package!
Free Sentinel-2 imagery of anywhere on Earth, enhanced from 10 m to 2 m resolution, on a laptop.
If it is useful to you, a ⭐ helps other people find it.
synapse-sr turns a Sentinel-2 L2A scene into a 2.0 m red / green / blue / near-infrared GeoTIFF. A physical model of the instrument pins everything the satellite measured. The network only adds what 10 m pixels cannot show, and every output says which pixels came from the measurement and which came from the learned prior.
pip install synapse-srimport synapse_sr
r = synapse_sr.super_resolve("sentinel2_l2a.tif") # progress bar, then a 5x larger result
r.save("sentinel2_2m.tif") # georeferenced, same CRS and bounds
r.summary() # size, consistency, support, timesynapse-sr sentinel2_l2a.tif sentinel2_2m.tif # the same from the shell
synapse-sr --fetch 12.92,77.50 --dates 2025-01-01:2025-03-15 out.tif --preview preview.png # download + run
synapse-sr scenes/ scenes_2m/ --cog # a whole folder, as Cloud-Optimised GeoTIFFsEvery common task on one page: cheat sheet. AI assistants
and agents can read the whole documentation from llms.txt.
![]() Bengaluru city centre |
![]() Farm fields, Punjab |
![]() Wayanad landslide, Kerala |
Each pair is the same Sentinel-2 L2A scene at its native 10 m and after synapse-sr. Run your own place with
synapse-sr --fetch LAT,LON out.tif, or watch the 5-minute explainer.
Official opensr-test protocol (Aybar et al.): Sentinel-2 L2A input, harmonised
high-resolution references, opensr_test.Metrics() defaults, mean over its five datasets (NAIP, SPOT, Spain urban,
Spain crops, VENµS; 178 scenes). Every model at its native scale, compared on the reference grid.
| Model | Improvement ↑ | Omission ↓ | Hallucination ↓ | Detail corr. ↑ | RMSE ↓ | Spectral error ↓ | Reflectance error ↓ |
|---|---|---|---|---|---|---|---|
| SYNAPSE Flash | 0.155 | 0.748 | 0.097 | 0.300 | 0.0234 | 0.401 | 0.0018 |
| SYNAPSE Pro | 0.199 | 0.631 | 0.171 | 0.289 | 0.0254 | 0.223 | 0.0011 |
| SEN2SR | 0.150 | 0.759 | 0.091 | 0.284 | 0.0235 | 0.665 | 0.0025 |
| SEN2SR-Lite | 0.152 | 0.749 | 0.099 | 0.290 | 0.0234 | 0.463 | 0.0019 |
| LDSR-S2 | 0.197 | 0.599 | 0.204 | 0.206 | 0.0240 | 1.015 | 0.0036 |
| Satlas ESRGAN | 0.129 | 0.181 | 0.690 | 0.089 | 0.0443 | 7.787 | 0.0242 |
| Bicubic | 0.102 | 0.830 | 0.068 | 0.279 | 0.0234 | 0.601 | 0.0028 |
Best in bold. SYNAPSE runs with the package defaults (synapse_sr.super_resolve). SYNAPSE is best on five of the
seven columns: Pro on improvement, spectral and reflectance error, Flash on detail correlation and (tied) RMSE. Flash processes
a 1.28 km scene in about 1 s on a laptop CPU; Pro in about 5 s on a GPU.
| One line | ||
|---|---|---|
| Crop monitoring | r.indices()["ndvi"], synapse_sr.boundaries(r, "field") |
NDVI, SAVI, EVI, red-edge NDRE, field edges at 2 m |
| Urban analysis | synapse_sr.boundaries(r, "urban"), r.indices()["ndbi"] |
buildings, roads, built-up index |
| Water and floods | synapse_sr.change(before, after, "ndwi") |
flooded area in km², shoreline strength |
| Disaster assessment | synapse_sr.change(before, after, "nbr") |
burn scars, landslides, debris; changes flagged only where both dates are trustworthy |
Worked examples for each: Applications.
| Flash (default) | Pro | |
|---|---|---|
| Network | ~0.6 M-parameter re-parameterised CNN, distilled from Pro | 14.4 M-parameter state-space (Mamba) model |
| Speed (1.28 km scene) | ~1 s on a laptop CPU; 10 km x 10 km in ~14 s | ~5 s on a GPU (Colab / Kaggle T4, workstations) |
| Runs on | any CPU, laptops, integrated graphics, Apple silicon, ARM, any GPU | GPU recommended; CPU works, slower |
| Choose it | synapse_sr.super_resolve(src) |
synapse_sr.super_resolve(src, model="pro") |
| Load | Flash.from_pretrained() |
Pro.from_pretrained() |
| Tuned for | balanced fidelity: best detail correlation, lowest RMSE (tied), measured 10 m mean reflectance restored exactly | maximum detail: best improvement, spectral and reflectance error |
| Physics, support map, calibrated uncertainty | yes | yes |
Both run the same observation-consistent pipeline. Use Flash for speed, anywhere-deployment and the most faithful
output, Pro for the most recovered detail on a GPU. synapse-sr --models lists
every published checkpoint.
import synapse_sr
r = synapse_sr.super_resolve("scene.tif")
r.x_base # what the 10 m observation determines
r.prior # what the network added (x_base + prior == image), invisible to the sensor
r.support # per pixel: 2 observation-determined, 1 medium, 0 prior-dominated or invalid
r.uncertainty() # calibrated expected error per pixel and band
r.consistency # how closely re-observing the output reproduces the input, in sensor-noise unitsx_hat = x_base + P_N(delta): P_N removes every component the sensor could have seen from the network's
output, so the network cannot contradict the measurement. See How it works.
| Platform | What you get |
|---|---|
| Colab / Kaggle GPU | Pro with a Triton scan kernel, compiled on first use (no extra installs) |
Linux GPU + mamba-ssm |
fused CUDA kernel (pip install "synapse-sr[cuda]") |
| Windows / macOS / CPU-only / ARM | exact PyTorch path; Flash recommended |
| Offline / air-gapped | Pro.from_pretrained(weights="model.safetensors") |
synapse-sr --env shows what is active on your machine.
Quick start · Colab and Kaggle · Applications · Examples · API
See CONTRIBUTING.md. Report security issues privately per SECURITY.md; accessibility barriers are tracked as bugs, see ACCESSIBILITY.md. Bug reports and feature requests use the issue templates; pull requests follow the PR template checklist.
Citation and acknowledgements
@software{synapse_sr,
title = {synapse-sr: observation-consistent super-resolution of Sentinel-2 imagery},
author = {Naidu, Sharadh},
year = {2026},
url = {https://github.com/SharadhNaidu/synapse-sr}
}- Third-party components and their licences are listed in
THIRD_PARTY_NOTICES. - The optional fused kernel comes from mamba-ssm (Apache-2.0).
- Sentinel-2 data: Copernicus programme, European Space Agency.



