Inspiration
When a flash flood tears through a Himalayan valley, the first things to go are the roads, the bridges and the phone lines. Rescuers lose the picture of who is stranded at exactly the moment they need it most. We started PRAHAR as an early-warning system for Uttarakhand, and found a hard truth in the data: half of the state's documented floods had under 50 mm of rain at the nearest gauge, because cloudbursts fall between gauges. Satellites don't need roads, and Sentinel-1 radar sees straight through monsoon cloud. So we asked: can open satellite data tell a rescue team, within hours, where the flood hit, what was damaged and who is cut off?
What it does
Give PRAHAR any area and a flood date. From raw satellite data, in about 8 minutes, it answers three questions:
- Where did it flood? Sentinel-1 radar before vs after (same orbit), an AI U-Net trained on Kuro Siwo, Sentinel-2 where the sky is clear, and the Copernicus DEM to handle steep terrain. Floodwater and debris are mapped as separate layers, because Himalayan disasters are often debris flows, not lakes.
- What was damaged? Pre-event OpenStreetMap buildings, roads and bridges that lie on flood or debris pixels, with roads damaged stretch by stretch.
- Who is cut off? A road-network graph before vs after finds the settlements that lost their road to the nearest hospital or town.
It then writes a one-page situation report in English, Hindi and Nepali, where every number comes from the maps. It also:
- ranks cut-off villages by size;
- suggests the nearest flat, dry helicopter landing spot (ICAO Annex 14 heliport slope rules);
- lets you trace a flood path downhill from any upstream point, listing every village and bridge in its way.
Validated blind against Copernicus EMS (EMSR927, Trishuli GLOF, Nepal, Aug 2026):
- 95% area precision;
- 578 of 864 EMS-damaged buildings found (67%), and 96% of the buildings we flagged sit next to EMS-confirmed damage;
- 24 of 35 damaged roads found;
- 23 of 25 settlements found cut off from the hospital.
EMS maps were used only to check the result, never as input.
Alongside it runs our Uttarakhand early-warning console: 44 rain and river gauges, an XGBoost model on 23 features calibrated with Venn-Abers, uncertainty and top drivers for every prediction, and building-level exposure from Microsoft's AI-detected footprints, scored with official river setback zones (NGT 50/100 m, Uttarakhand High Court 200 m).
How we built it
- Inputs (all open, keyless):
- Sentinel-1 RTC (Microsoft Planetary Computer);
- Sentinel-2 L2A (Element 84 Earth Search);
- Copernicus DEM GLO-30 (AWS);
- pre-event OpenStreetMap via the ohsome full-history API.
- Flood mapping:
- UN-SPIDER change detection as the baseline. We replaced its 5% slope mask, which erased 99.6% of the Dharali valley, with ESA radar layover/shadow geometry.
- A 200 m river corridor (Uttarakhand High Court 2013).
- The HAND ≤ 15 m rule (Twele et al. 2016) for water.
- MNDWI (Xu 2006) and NDVI change (USGS ranges) from Sentinel-2.
- AI: a U-Net with a ResNet-34 encoder on 7 channels (post-event plus two pre-event radar images, VV/VH, and elevation), trained on Kuro Siwo streamed from Hugging Face in Colab, exported to ONNX for CPU inference. Threshold chosen on validation. On unseen test events: F1 0.78, precision 0.74, recall 0.82.
- Damage and cut-off: raster overlay, segment-level road damage, a NetworkX road graph with Dijkstra, Priority-Flood D8 flow routing for the path tracer, and ICAO Annex 14 slope rules for landing zones.
- App: FastAPI backend (live "map any flood" jobs, sitrep and GeoJSON/GeoTIFF downloads) and a React + Vite + MapLibre dashboard with a Sentinel-2 before/after slider, deployed on Vercel and Render.
Challenges we ran into
- Mountains break flood mapping. The standard slope mask deleted almost the whole valley, so we rebuilt the mask from radar geometry.
- Debris isn't water. Our AI correctly found no standing water at Dharali or Trishuli, both debris flows, so we built a separate debris layer from radar and optical evidence.
- False alarms. Shaded forest and monsoon soil moisture lit up hillsides, and one stray pixel could "cut" a whole highway. We fixed both with the UN-SPIDER minimum-cluster rule, the HAND rule for water, and segment-level road damage. We tested HAND on debris too and rejected it, because a glacial-lake outburst throws debris high up gorge walls.
- Practical problems: the ohsome endpoint was blocked (we switched to full history); a CUDA crash from out-of-range labels; monsoon cloud over Sentinel-2; and a 512 MB free-tier server.
Accomplishments that we're proud of
- A blind run checked against Copernicus EMS: 95% area precision, 67% of damaged buildings and 24 of 35 damaged roads found.
- An honest result: an ablation showing that radar alone fails in narrow gorges and Sentinel-2 carried the result, reported openly.
- Rescue-ready outputs: who is cut off, who to reach first, where a helicopter can land, and a sitrep in three languages.
- Everything traceable: open inputs, cited thresholds, and no number in the sitrep typed by hand.
What we learned
In the Himalaya, "flood mapping" is really debris mapping, and the standard recipes assume flat plains. Validating against an independent reference changed our method more than any model tweak did. And honest limitations ("radar can't warn minutes ahead") build more trust than bigger numbers.
What's next for Prahar : Flood Damage Mapping from Space
- A debris class in the AI model, trained on labelled Himalayan debris flows.
- Hydraulic inundation depth instead of extent only.
- Automatic triggering when a new Sentinel-1 pass lands after an alert from our early-warning console.
- Offline field packs (maps plus sitrep) for SDRF and NDRF teams, and more languages (Garhwali, Kumaoni).
- Validation on more EMS and UNOSAT activations across the Himalaya.
Built With
- aws-open-data
- copernicus-dem
- fastapi
- google-colab
- maplibre-gl
- microsoft-planetary-computer
- networkx
- numpy
- ohsome-api
- onnx
- onnxruntime
- openstreetmap
- pandas
- python
- pytorch
- rasterio
- react
- scipy
- segmentation-models-pytorch
- sentinel-1
- sentinel-2
- stac
- tailwindcss
- typescript
- vite
Log in or sign up for Devpost to join the conversation.