Inspiration

When a mountain valley floods, roads, bridges, and phone lines go first, and the people who most need to know who is cut off have the least information. Sentinel-1 radar sees through monsoon cloud, but a raw radar image is not an answer for a rescue coordinator. We wanted to build the missing step: from free satellite data to three plain answers, for any valley and date.

  1. Where did the flood hit?
  2. What was exposed? (buildings, roads, bridges)
  3. Which settlements lost their road to the nearest town or hospital?

The August 2026 Bhote Koshi–Trishuli flood in Nepal was our case study. We treat it with respect. We use no victim imagery, we print no casualty figures, and everything here is an educational prototype, not an operational tool.

What It Does

Cutoff takes a bounding box and an event datetime and runs end to end from raw Sentinel-1/2 imagery, the Copernicus DEM, and pre-event OpenStreetMap data to a map dashboard and a one-page situation report. Every number in the report comes from a single results.json file, so nothing is invented.

  • Same-track pairing: A post-event scene is compared only with pre-event scenes from the same relative orbit and direction. If none exists, the system says so and names the next pass instead of falling back silently.
  • Hazard map: A U-Net, a scene-adaptive change rule, and terrain gating are combined into five categories: high, possible, rule-only, permanent water, and no observation.
  • Exposure: Hazard polygons are overlaid on pre-event OpenStreetMap data. Assets are reported as exposed, never "destroyed".
  • Access: A properly noded road graph is evaluated under three closure scenarios. Each settlement is classified as connected, degraded, cut_off, or unknown. Unknown means unmapped, which is not the same as safe.
  • Bonus: A downstream flow-path trace from any upstream point.

How We Built It

1. Radar Physics First

Backscatter is analysed in decibels (dB), where multiplicative speckle becomes additive. The conversion is:

$$ \sigma^0_{\mathrm{dB}} = 10\log_{10}(\sigma^0) $$

For example, a linear backscatter value of 0.1 corresponds to −10 dB.

The model input has seven channels:

  • Pre-event mean VV and VH.
  • Post-event VV and VH.
  • Post-minus-pre differences for VV and VH.
  • Terrain slope.

The slope channel is held at its training mean in the final model because it gave no measurable benefit and could silently delete real flooded valley floors in gorges.

2. The Model

We trained a U-Net with a ResNet-34 encoder using Kuro Siwo's official event split: 27 training events, 6 validation events, and 10 test events. One validation event is missing from the published archives.

Model logits are temperature-scaled using:

$$ p = \mathrm{softmax}(z/T) $$

The decision threshold was 0.50, and the temperature was 1.037. Both were selected using validation events only.

Flood-class performance is measured using Intersection over Union (IoU) and the F1 score:

$$ \mathrm{IoU} = \frac{TP}{TP+FP+FN} $$

$$ F_1 = \frac{2TP}{2TP+FP+FN} $$

Here, TP means true positives, FP means false positives, and FN means false negatives.

3. The Change Rule

Kuro Siwo does not provide labels for debris and scoured channels. To identify possible changes in these areas, we flag pixels in the near-river corridor where HAND is at most 60 metres and the standardized backscatter change exceeds 3.

The standardized change is calculated as:

$$ |z| = \left|\frac{\Delta-\mathrm{med}}{\sigma}\right| > 3 $$

The noise estimate is:

$$ \sigma = 1.4826 \times \mathrm{MAD} $$

Here, Δ is the backscatter change, med is the median change, and MAD is the median absolute deviation. Sigma is estimated from terrain in the same scene that cannot have flooded, where HAND is greater than 100 metres.

4. Terrain Gating

Radar shadow and layover can make terrain unobservable. These areas are labelled no observation, rather than being treated as dry or flooded.

Detections on slopes steeper than 15° or where HAND exceeds 30 metres are downgraded to possible instead of being deleted.

This is important in Himalayan valleys, where steep terrain and radar geometry can create misleading observations.

5. Access Analysis

Roads are split at intersections, with bridge and tunnel grade separation respected.

A settlement is classified as degraded when its travel time after road closures exceeds 1.5 times its original travel time:

$$ t_1 > 1.5 \times t_0 $$

Here, t₀ is the travel time to the nearest target before closures, and t₁ is the travel time after closures.

We evaluate three closure scenarios:

  • Scenario A: Closes any road within 15 metres of mapped hazard.
  • Scenario B: Closes roads with at least 50 metres inside high-confidence hazard.
  • Scenario C: Closes only bridges, including their approaches.

We show the range across scenarios instead of presenting one falsely certain number.

Technology Stack

Python, PyTorch, segmentation-models-pytorch, rasterio/GDAL, GeoPandas, pyflwdir, NetworkX, Sentinel Hub Process API on CDSE, ESA SNAP, the ohsome API, Streamlit, folium, Jinja2/WeasyPrint, pydantic, and pytest.

Four people built the project in parallel against a frozen contract, with a validator checking every stage's files.

Results (Measured)

1. Held-Out Kuro Siwo Test Events

Evaluation was conducted on 10 held-out test events comprising 4,250 patches.

Model Precision Recall F1 IoU
Classic Otsu change rule (non-learned) 0.720 0.640 0.678 0.512
Published Kuro Siwo SNUNet (zero-shot) 0.849 0.768 0.807 0.676
Post-only U-Net (ablation) 0.650 0.800 0.717 0.559
Cutoff U-Net (final, seed 42) 0.813 0.819 0.816 0.689
Cutoff U-Net (seed 7, variance check) 0.839 0.793 0.815 0.688

Using the pre-event image improves IoU by 0.130 compared with the post-only model. Our final model is comparable to the published SNUNet, with a pooled IoU improvement of 0.013 and higher recall: 0.819 versus 0.768.

2. Performance by Terrain Slope

The final model's performance was evaluated separately across terrain slopes.

Slope IoU Support (pixels)
0°–5° 0.692 10,887,913
5°–15° 0.556 164,760
15° and above 0.351 8,742

Every model degrades on slopes, and the steep-slope group is too small to rank models reliably. Himalayan-gorge performance cannot be measured using Kuro Siwo alone.

3. Trishuli: Same-Track vs Cross-Track

The event date was August 26, 2026, and the post-event scene was acquired on August 28, 2026.

Pairing method False positives on stable steep terrain Flood area (classes 1–2) Stable-terrain noise (dB)
Same-track (track 85, ascending) 2.1 × 10⁻⁶ 0.005 km² 1.31
Cross-track (19D pre-event, 85A post-event) 0.295 87.3 km² 14.71

Same-track pairing keeps the false-alarm rate about five orders of magnitude lower. This is why matching the relative orbit and direction is a hard rule in Cutoff.

4. Real Trishuli Run

The following results are from the north area of interest (AOI), using same-track pairing and frozen thresholds.

Layer Area
Model flood (high + possible) 0.005 km²
Change rule: backscatter decrease 0.164 km²
Change rule: backscatter increase 0.076 km²
Permanent water 9.77 km²
No observation (radar shadow/layover) 1.59 km²

The post-event scene was acquired 57.5 hours after the event. Therefore, the map represents the situation at the time of that satellite pass, not the flood's peak.

5. Backend Consistency and Calibration

Sentinel Hub vs ESA SNAP

On stable terrain, the fast Sentinel Hub processing path and the SNAP reference pipeline differed by a median absolute value of 0.59 dB for VV and 0.58 dB for VH. Both narrowly missed the 0.5 dB target.

When comparing 50-metre block means, the difference falls to approximately 0.25 dB.

Flood-score calibration

The flood-class Expected Calibration Error (ECE) was:

  • 0.139 at temperature T = 1.
  • 0.130 at the fitted temperature T = 1.037.

The score is therefore not a calibrated probability. Cutoff labels it as a model score rather than presenting it as a probability of flooding.

6. EMSR927 Comparison (Check-Only)

The official Copernicus Emergency Management Service maps were never used as model inputs. The comparison is run once against the frozen system, and the results and disagreement analysis are reported in the written report without subsequent retuning.

Challenges

  • Mountains lie to radar. Radar shadow can look like water, and Kuro Siwo is dominated by lowland events. Only 8,742 test pixels have slopes steeper than 15°. We could not measure Himalayan-gorge performance reliably on this dataset, so we use terrain gating and explicitly communicate the limitation.
  • Speckle is not optional. Without Lee-Sigma filtering, the model's flood score in a test corridor fell from approximately 0.82 to 0.05.
  • A silent missing-data bug. Mapping missing data to −30 dB made satellite footprint gaps look like water. We corrected the pipeline so missing data remains missing.
  • Cross-track pairs break change detection. The stable-terrain noise estimate jumped from 1.3 dB to 14.7 dB, and the change rule stopped working. This demonstrated why same-track pairing must be enforced.
  • Strict data rules. Several tempting datasets are derived from Copernicus EMS maps and could risk disqualification. We therefore trained on Kuro Siwo only. We also guard the OpenStreetMap snapshot date and keep EMSR927 files out of src/ using a leak test.
  • Latency vs fidelity. SNAP takes 10–25 minutes per scene, so we built a faster Sentinel Hub path and retained SNAP as the reference. Their median difference is 0.59 dB, but the rule-based layer is sensitive to the processing choice, with only 0.31 IoU between backends.
  • Honest gaps. On Trishuli, the model alone identifies very little flood area, and the change rule does most of the work. Radar back-slopes can also be mislabelled as permanent water, which we have flagged for future improvement.

What We Learned

  • The hardest part of a satellite-to-decision system is deciding which observations can validly be compared and clearly identifying what was not observed. Model architecture alone is not enough.
  • A pre-registered hypothesis, frozen thresholds, and a check-only reference help keep evaluation honest, even when the results are less impressive than expected.
  • Reporting ranges and explicitly allowing an unknown state is safer than presenting one falsely confident answer.
  • Satellite imagery becomes more useful for decision support when combined with terrain, infrastructure, and road-network analysis.
  • A model's limitations must remain visible in the final product, particularly when the consequences of misinterpretation could be serious.

What's Next

  • Combine ascending and descending satellite passes at the polygon level to reduce radar-shadow gaps.
  • Add a terrain-based check to improve permanent-water classification.
  • Add class-conditional uncertainty estimation with an abstain class.
  • Add a reviewed Nepali-language situation report.

Acknowledgements and Data Attribution

Contains modified Copernicus Sentinel data 2026.

Produced using Copernicus WorldDEM-30, © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018, provided under COPERNICUS by the European Union and ESA. All rights reserved.

© OpenStreetMap contributors.

Training data: Bountos et al., NeurIPS 2024 (Kuro Siwo).

EMSR927: European Union, Copernicus Emergency Management Service data (check only).

Built With

  • copernicus-data-space
  • copernicus-dem
  • esa-snap
  • folium
  • gdal
  • geopandas
  • jinja
  • kuro-siwo
  • networkx
  • ohsome-api
  • openstreetmap
  • pydantic
  • pyflwdir
  • python
  • pytorch
  • rasterio
  • segmentation-models-pytorch
  • sentinel-1
  • sentinel-2
  • sentinel-hub
  • shapely
  • streamlit
  • u-net
  • weasyprint
Share this project:

Updates

Submission history