Piscine leaderboard
This Hugging Face leaderboard evaluates swimming pool detection from aerial images using binary semantic segmentation.
- Input: RGB aerial image tiles (test set)
- Output: binary masks where 1 = pool and 0 = background
- Evaluation metric: F1-score (pixel-wise) computed on a hidden ground-truth dataset
To submit results, participants must upload a ZIP archive containing one .npz file
per test image. Each .npz file must include a single array named mask with values
in {0, 1}.
{
- "headers": [
- "Eval Name",
- "Result Name",
- "Submission Date",
- "f1"
- "data": [
- [
- "Achille44_Soumission4",
- "Soumission4",
- "2026-01-05T12:54:21Z",
- 73.72
- [
- "NolFe_Soumission5_NF_JZ",
- "Soumission5_NF_JZ",
- "2026-01-04T21:08:29Z",
- 73.61
- [
- "Achille44_Soumission6",
- "Soumission6",
- "2026-01-07T07:44:32Z",
- 73.55
- [
- "NolFe_Soumission4_NF_JZ",
- "Soumission4_NF_JZ",
- "2026-01-04T13:04:14Z",
- 73.22
- [
- "Viviroro8642_Test_6_VR_DR",
- "Test_6_VR_DR",
- "2026-01-04T11:48:36Z",
- 73.22
- [
- "Viviroro8642_Test_7_VR_DR",
- "Test_7_VR_DR",
- "2026-01-05T09:20:34Z",
- 72.76
- [
- "Viviroro8642_Test_8_VR_DR",
- "Test_8_VR_DR",
- "2026-01-05T19:08:42Z",
- 72.14
- [
- "Achille44_Soumission5",
- "Soumission5",
- "2026-01-06T11:39:06Z",
- 71.68
- [
- "Celien9_TEST_ROULIN_BENAIN",
- "TEST_ROULIN_BENAIN",
- "2026-01-06T11:38:05Z",
- 70.25
- [
- "JeremBoillat_Soumission_4",
- "Soumission_4",
- "2026-01-06T17:15:52Z",
- 69.55
- [
- "NolFe_Soumission3_NF_JZ",
- "Soumission3_NF_JZ",
- "2025-12-31T15:26:09Z",
- 69.38
- [
- "Celien9_ROULIN_BENAIN_SOUMISSION",
- "ROULIN_BENAIN_SOUMISSION",
- "2026-01-06T20:15:26Z",
- 67.94
- [
- "Achille44_Soumission3",
- "Soumission3",
- "2026-01-04T17:05:45Z",
- 66.84
- [
- "JeremBoillat_Soumission_3",
- "Soumission_3",
- "2026-01-06T17:15:36Z",
- 66.79
- [
- "Achille44_Soumission_nยฐ2",
- "Soumission_nยฐ2",
- "2026-01-01T14:34:48Z",
- 66.22
- [
- "RomainOz_Romain_soumission_1",
- "Romain_soumission_1",
- "2026-01-06T10:18:27Z",
- 65.73
- [
- "NolFe_Soumission2_NF_JZ",
- "Soumission2_NF_JZ",
- "2025-12-22T18:22:23Z",
- 64.42
- [
- "Antoine1091_test",
- "test",
- "2025-12-18T08:22:20Z",
- 56.09
- [
- "Antoine1091_Baseline-HEIG",
- "Baseline-HEIG",
- "2025-12-17T22:27:44Z",
- 56.09
- [
- "Viviroro8642_Test_5_VR_DR",
- "Test_5_VR_DR",
- "2026-01-03T22:10:48Z",
- 51.16
- [
- "JeremBoillat_Soumission_1",
- "Soumission_1",
- "2026-01-06T17:15:07Z",
- 48.17
- [
- "Achille44_AchilleB_Soumission1",
- "AchilleB_Soumission1",
- "2025-12-22T16:00:59Z",
- 47.09
- [
- "NolFe_Soumission1-NF-JZ",
- "Soumission1-NF-JZ",
- "2025-12-22T15:44:34Z",
- 45.92
- [
- "JeremBoillat_Soumission_2",
- "Soumission_2",
- "2026-01-06T17:15:21Z",
- 43.37
- [
- "Viviroro8642_Test_4_VR_DR",
- "Test_4_VR_DR",
- "2026-01-03T21:34:09Z",
- 41.45
- [
- "Viviroro8642_Test_2_VR_DR",
- "Test_2_VR_DR",
- "2026-01-03T18:33:23Z",
- 21.05
- [
- "Viviroro8642_Test_3_VR_DR",
- "Test_3_VR_DR",
- "2026-01-03T20:41:41Z",
- 20.57
- [
- "Viviroro8642_Test_VR_DR",
- "Test_VR_DR",
- "2026-01-03T12:56:44Z",
- 12.92
- [
- "metadata": null
How it works
Expected submission format
Upload a ZIP file containing one .npz per test image.
Filenames must match test image names (same stem):
- Test image:
img_00012.tif - Submission file:
img_00012.npz
- Test image:
Each
.npzfile must contain:mask:uint8, shape(1000, 1000), values in{0, 1}
Minimal Python example
The following example shows how to:
- run inference with a trained UNet,
- upsample logits back to the original resolution (1000ร1000),
- save only a binary mask (0/1) into a
.npzfile.
import numpy as np
from pathlib import Path
import torch.nn.functional as F
# logits_small: output of the model at input resolution (e.g. 512x512)
logits_small = model(imgs) # shape: (B, 1, 512, 512)
# Upsample logits to original tile size (1000x1000)
ORIG_SIZE = 1000
logits_full = F.interpolate(
logits_small,
size=(ORIG_SIZE, ORIG_SIZE),
mode="bilinear",
align_corners=False
) # shape: (B, 1, 1000, 1000)
def save_npz(out_path: Path, logits_hw: np.ndarray):
probs = 1.0 / (1.0 + np.exp(-logits_hw)) # sigmoid
mask = (probs > 0.5).astype(np.uint8) # 0 or 1
np.savez_compressed(out_path, mask=mask)
# Example for one image
save_npz(Path("img_00012.npz"), logits_full[0, 0].cpu().numpy())
ZIP structure
Your final ZIP file must look like:
submission.zip
โโโ img_00000.npz
โโโ img_00001.npz
โโโ img_00002.npz
โโโ ...
Upload submission.zip using the Submit Eval form.
Before submitting
- Ensure your ZIP contains one
.npzfile per test image - Each
.npzmust contain only the key:mask(uint8, values{0,1})
- Filenames must exactly match test image stems
- Mask resolution must be 1000ร1000
Once submitted, your results will be evaluated against a hidden ground truth, and your F1-score will appear on the leaderboard.
โ๏ธโจ Submit your result here!
โ ๏ธ You are not logged in.