CoolFace
Datasetpublic

EOA-team/SwissCrop25

SwissCrop25 A national benchmark dataset for operational crop mapping in Switzerland, providing Sentinel-2 time series, daily temperature data, and parcel-level crop type labels across seven growing seasons (2019–2025). Introduced in: SwissCrop25: A National Multi-Year Benchmark for Operational Crop Mapping (TerraBytes II Workshop, ECCV 2026) — [Paper] [Code] [Team] Highlights Nationwide coverage of Switzerland (41,285 km²) Seven growing seasons (2019–2025) 73… See the full description on the dataset page: https://huggingface.co/datasets/EOA-team/SwissCrop25.

sourceHugging Facecc-by-4.0updated 12d agoView on Hugging Face
3likes1.9kdownloads
Dataset Card

SwissCrop25

A national benchmark dataset for operational crop mapping in Switzerland, providing Sentinel-2 time series, daily temperature data, and parcel-level crop type labels across seven growing seasons (2019–2025).

Introduced in: SwissCrop25: A National Multi-Year Benchmark for Operational Crop Mapping (TerraBytes II Workshop, ECCV 2026) — [[Paper]](https://arxiv.org/abs/2608.09497) [[Code]](https://github.com/thomaslauber/SwissCrop25) [[Team]](https://www.eoa-team.net/)

[image]

Highlights

  • Nationwide coverage of Switzerland (41,285 km²)
  • Seven growing seasons (2019–2025)
  • 73 crop classes + 5 non-crop land cover classes
  • Sentinel-2 time series (10 bands, 10 m resolution)
  • Daily cumulative growing degree day (GDD) time series
  • 12.6 million+ labelled parcel-years across 163,185 image cubes (128 × 128 px at 10 m)
  • HCAT4-compatible taxonomy (EuroCrops-compatible)
  • Five-fold leave-one-year-out (LOYO) evaluation protocol

Repository layout

sentinel2/{year}/            Shards (.tar), 120 per year
sentinel2/{year}.json        Kerchunk reference index for random access
labels/{year}.tar            Per-parcel crop labels
labels/{year}.tar.json       Kerchunk index
temperature/{year}.tar       Per-parcel GDD time series
temperature/{year}.tar.json  Kerchunk index
metadata/
  crop_classes.csv           Full class list with hierarchy, LNF codes, HCAT4 mapping
  tiles.parquet              GeoParquet spatial index: one row per tile × year with geometry,
                             tile names, and tar paths for all three modalities

Loading the data

Each year comes with a Kerchunk reference index (sentinel2/{year}.json) that maps the full annual collection to a single virtual zarr store, enabling direct fast tile access. After downloading the dataset locally:

python
import fsspec
import zarr

mapper = fsspec.filesystem("reference", fo="sentinel2/2021.json").get_mapper("")
store = zarr.open_group(mapper, mode="r")

# Access a specific tile directly by name
tile = store["S2_357340_5169580_20220104_20221230.zarr"]
blue = tile["s2_B02"][:]  # (T, 128, 128), uint16, scaled reflectance (÷10000)
time = tile["time"][:]    # (T,), days since 1 Jan of that year

Available bands: s2_B02, s2_B03, s2_B04, s2_B05, s2_B06, s2_B07, s2_B08, s2_B8A, s2_B11, s2_B12, s2_SCL (Scene Classification Layer), s2_mask (CloudSEN12+ score).

Spatial tile index

metadata/tiles.parquet is a GeoParquet file (CRS: EPSG:32632) with one row per tile × year. Use it to find which tiles and Kerchunk stores cover a region of interest, then access the data directly:

python
import geopandas as gpd
import fsspec
import zarr
from shapely.geometry import box

# 1. Spatial query — find tiles overlapping a region (EPSG:32632, UTM zone 32N)
tiles = gpd.read_parquet("metadata/tiles.parquet")
roi = box(455000, 5237000, 480000, 5260000)  # ~25 km box around Zurich
hits = tiles[tiles.intersects(roi) & (tiles.year == 2022)]

# 2. Open the Kerchunk store for that year and access each tile
mapper = fsspec.filesystem("reference", fo="sentinel2/2022.json").get_mapper("")
store = zarr.open_group(mapper, mode="r")
for row in hits.itertuples():
    tile = store[row.sentinel2_tile]
    blue = tile["s2_B02"][:]   # (T, 128, 128), uint16
    time = tile["time"][:]     # (T,) days since 1 Jan

Columns: year, left, top, row_index, col_index, geometry, sentinel2_tile, sentinel2_tar, labels_tile, labels_tar, temperature_tile, temperature_tar.

Full training framework

For training with GDD-based temporal subsampling, cloud filtering, and DDP support, use the SatelliteDataset class from the code repository. It reads Kerchunk index files for all three modalities:

python
from src.dataset import SatelliteDataset

dataset = SatelliteDataset(
    satellite_paths=["sentinel2/2021.json", "sentinel2/2022.json"],
    gt_paths=["labels/2021.tar.json", "labels/2022.tar.json"],
    temp_paths=["temperature/2021.tar.json", "temperature/2022.tar.json"],
    use_temperature_calendar=True,
    use_temperature_subsampling=True,
)

See train_utae.py, train_tsvit.py, and train_galileo.py for complete training examples.

Evaluation protocol

SwissCrop25 defines a five-fold leave-one-year-out (LOYO) protocol:

SplitTestValTrain
S1202120202019, 2022–2025
S2202220212019–2020, 2023–2025
S3202320222019–2021, 2024–2025
S4202420232019–2022, 2025
S5202520242019–2023

2019–2020 are used as training data only due to incomplete national coverage.

Benchmarks

Results under the LOYO protocol (mean ± std across five splits, best temporal encoding per model):

ModelOA (%)GIoU (%)mIoU (%)mF1 (%)
U-TAE77.7 ± 1.563.5 ± 2.035.8 ± 2.345.7 ± 2.4
TSViT77.1 ± 1.262.7 ± 1.648.1 ± 2.760.7 ± 2.5
Galileo-nano (FT)72.9 ± 1.357.4 ± 1.630.4 ± 2.241.1 ± 2.5

Full per-split and per-class results are in the paper.

Citation

bibtex
@misc{lauber2026swisscrop25nationalmultiyearbenchmark,
  title         = {SwissCrop25: A National Multi-Year Benchmark for Operational Crop Mapping},
  author        = {Thomas Lauber and Mehmet Ozgur Turkoglu and Sélène Ledain and Helge Aasen},
  year          = {2026},
  eprint        = {2608.09497},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CV},
  url           = {https://arxiv.org/abs/2608.09497}
}

License

Released under CC BY 4.0.

Attribution

When using this dataset, please cite:

  • Contains modified Copernicus Sentinel-2 data 2019–2025, processed by Agroscope.
  • Contains data from MeteoSwiss (Federal Office of Meteorology and Climatology), Open Government Data.
  • Contains cantonal agricultural land-use data (Nutzungsflächen / Surfaces d'utilisation / Superfici d'utilizzazione) from all 26 Swiss cantons (AG, AI, AR, BE, BL, BS, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SO, SZ, TG, TI, UR, VD, VS, ZG, ZH), obtained via geodienste.ch, snapshot dates 2019–2025. Cantons with specific attribution requirements:
  • Quelle: Nutzungsflächen, Kanton Graubünden
  • Fonte: Amministrazione cantonale - Canton Ticino
  • Source: Géodonnées Etat de Vaud
  • Kanton St.Gallen
  • Kanton Nidwalden, Amt für Landwirtschaft
  • Kanton Obwalden, Amt für Landwirtschaft und Umwelt

Disclaimer

Data provided as is, without warranty. Not for navigation or legally-binding use. Contains no personal or farm-identifying attributes.

Contact