File size: 4,609 Bytes
9d76c6b
 
 
 
 
 
 
 
 
 
 
 
 
d33bf6e
9d76c6b
d33bf6e
 
9d76c6b
d33bf6e
dd050ff
d33bf6e
 
 
 
 
b8b66cc
d33bf6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d76c6b
d33bf6e
9d76c6b
 
 
d33bf6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d76c6b
 
 
 
 
 
 
 
 
d33bf6e
9d76c6b
 
d33bf6e
 
 
 
 
 
9d76c6b
 
 
d33bf6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d76c6b
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
---
license: mit
tags:
  - remote-sensing
  - flood-mapping
  - segmentation
  - earth-observation
  - planetscope
pipeline_tag: image-segmentation
---

# FloodDuo

**A Dual Foundation-Encoder Architecture for Generalizable High-Resolution Flood Mapping**

Saurabh Kaushik, Beth Tellman, Qihao Weng — *ISPRS Journal of Photogrammetry and Remote Sensing*, 2026
· [Code](https://github.com/Sk-2103/FloodDuo) · [Paper](https://github.com/Sk-2103/FloodDuo#citation)

FloodDuo maps open water in high-resolution (3 m, 4-band B/G/R/NIR PlanetScope)
post flood imagery by pairing two **frozen** vision foundation-model encoders that carry
complementary information:

- **DINOv3-L** (RGB) — sharp spatial / boundary detail.
- **Clay v1.5** (all four bands) — wavelength-conditioned spectral discrimination.

FloodDuo is a flood segmentation model which excel at local spatial nuances while keeping global context. It use dual encoder architechture, adapted with
lightweight trainable modules (an in-block frequency-domain Earth-Adapter,
plus post-hoc atrous-convolution and pyramid-pooling adapters), and their
branch predictions are merged by a **disagreement-gated fusion** whose
per-pixel Jensen-Shannon divergence doubles as a label-free reliability map,
before a LinkNet decoder produces the full-resolution mask. Only ~65M
parameters are trained against ~614M frozen.

![FloodDuo architecture](figure_01_architecture.png)

## Results (leave-one-region-out, region-mean water IoU)

| Model | FloodPlanet | UFO |
|---|---|---|
| **FloodDuo (ours)** | **0.728** | **0.819** |
| TerraMind-L | 0.700 | 0.789 |
| Prithvi-EO-2 | 0.678 | 0.774 |
| DOFA-L | 0.687 | 0.766 |
| Clay v1.5-L | 0.675 | 0.773 |
| CROMA-L | 0.672 | 0.715 |
| SSL4EO-S12 DINO | 0.650 | 0.767 |
| U-Net (from scratch) | 0.648 | 0.782 |

FloodDuo significantly outperforms U-Net (+8.0 / +3.7 pp) and the strongest
single-encoder foundation model (+2.8 / +3.0 pp, paired Wilcoxon on both).
Every table (matched single-encoder controls, the fusion ablation,
boundary-resolved analysis, D-reliability calibration) is in
[results.md](https://github.com/Sk-2103/FloodDuo/blob/main/results.md) in the
code repo.

## This checkpoint vs. the numbers above

This is the **release model**: trained on all FloodPlanet + UFO data pooled
together (not held out by region), for actual use on new imagery. Its
validation IoU (0.80, on a random held-out 15% of tiles) is a different
measurement from the table above — that table is leave-one-region-out
cross-validation, a much stricter protocol specifically designed to measure
generalization to *unseen* regions. This release checkpoint is the practical
model to run on your own data, not the benchmark artifact; don't quote its
validation score as the paper's headline result.

## Files

- `floodduo_full.pt` (1.36 GB) — self-contained: model config + full state
  dict, frozen DINOv3-L and Clay v1.5 backbones included. One download, no
  other weights needed.
- `examples/sample_tile.tif`, `examples/sample_mask.tif` — one held-out
  FloodPlanet test tile (Oklahoma) for a no-setup demo, from the public
  [FloodPlanet benchmark](https://zenodo.org/records/19698577).

## Quick start

```python
from huggingface_hub import hf_hub_download
from src.inference import load_model, predict_file  # from the GitHub repo

ckpt = hf_hub_download("Sk-21/FloodDuo", "floodduo_full.pt")
model = load_model(ckpt)
prob, mask, profile = predict_file(model, "your_tile.tif")  # 4-band B,G,R,NIR
```

`predict_file` auto-detects and converts scaled integer DN (e.g. Planet's own
Surface Reflectance product or Sentinel-2 L2A, both uint16 x10000) to
reflectance automatically. Full walkthrough, including a no-setup example and
an explicit normalization step:
[`notebook/inference_demo.ipynb`](https://github.com/Sk-2103/FloodDuo/blob/main/notebook/inference_demo.ipynb)
in the code repo.

## Input format

4-band (B, G, R, NIR) PlanetScope-style imagery, single tile, roughly
512-1024 px per side (the size the model was evaluated at in the paper;
larger scenes should be tiled by the caller). Raw DN or reflectance both
work — see above.

## Citation

```bibtex
@article{kaushik2026floodduo,
  title   = {FloodDuo: A Dual Foundation-Encoder Architecture for Generalizable High-Resolution Flood Mapping},
  author  = {Kaushik, Saurabh and Tellman, Beth and Weng, Qihao},
  journal = {ISPRS Journal of Photogrammetry and Remote Sensing},
  year    = {2026}
}
```

## License

MIT (code and this checkpoint). The underlying FloodPlanet and UFO benchmarks
have their own licenses — see their Zenodo records.