falafel-hockey/sentinel2-lejepa-global-diverse-256
Sentinel-2 LeJEPA Preset-Biased (Small) A small, preset-biased Sentinel-2 L2A chip dataset curated for self-supervised pretraining of a LeJEPA ResNet-18 encoder. Built as a reproducibility artifact for the Sentinel Change Explorer proof-of-concept foundation-model change-detection feature. This is a proof of concept, not a general-purpose EO pretraining corpus. It is intentionally tiny (~thousands of chips) and biased toward the five demo AOIs the Sentinel Change Explorer app… See the full description on the dataset page: https://huggingface.co/datasets/falafel-hockey/sentinel2-lejepa-global-diverse-256.
Sentinel-2 LeJEPA Preset-Biased (Small)
A small, preset-biased Sentinel-2 L2A chip dataset curated for self-supervised pretraining of a LeJEPA ResNet-18 encoder. Built as a reproducibility artifact for the Sentinel Change Explorer proof-of-concept foundation-model change-detection feature.
This is a proof of concept, not a general-purpose EO pretraining corpus. It is intentionally tiny (~thousands of chips) and biased toward the five demo AOIs the Sentinel Change Explorer app highlights. Use it to reproduce that specific PoC, not as a substitute for SSL4EO-S12, Clay, or Prithvi.
Dataset snapshot
Sampling methodology
Chips are drawn from two sources in roughly a 70/30 mix:
- Preset AOIs (~70%). For each of the 5 demo presets in the Sentinel Change Explorer app, the builder expands the tight demo bbox into a 10 km square centered on the preset's centroid, searches STAC (Element84 Earth Search v1) for Sentinel-2 L2A scenes in both
before_rangeandafter_range, loads the 5 reflectance bands + SCL via the samesrc.sentinel.load_bandsthe app uses, and tile-crops into non-overlapping 128x128 chips. - Global diversity points (~30%). A hand-curated list of 30 globally diverse points (deserts, forests, croplands, urban cores, coasts, ice, wetlands) across every inhabited continent, each sampled at 2-3 dates spread across seasons. Same fetch-and-tile flow with a 5.12 km AOI.
Rejection filters
Every candidate chip is tested against two filters and dropped if it fails either:
- Cloud/shadow fraction > 25%, computed from the Sentinel-2 Scene Classification Layer (SCL classes 3, 8, 9, 10).
- Fill fraction > 10%, defined as pixels where all 5 reflectance bands equal zero (true no-data, not just a single dark band).
Preset AOIs
Global diversity points
sahara_algeria— (2.00, 25.00)gobi_mongolia— (104.00, 43.50)atacama_chile— (-69.30, -23.80)namib_namibia— (15.00, -23.50)simpson_australia— (137.50, -25.50)amazon_brazil— (-60.00, -3.50)congo_drc— (21.00, -1.00)boreal_canada— (-95.00, 54.00)siberia_taiga— (105.00, 62.00)pnw_usa— (-123.50, 47.50)iowa_corn_belt— (-93.50, 42.00)pampas_argentina— (-62.00, -35.00)po_valley_italy— (10.50, 45.00)punjab_india— (75.50, 30.70)tokyo_japan— (139.75, 35.70)nyc_usa— (-73.95, 40.75)lagos_nigeria— (3.40, 6.50)sao_paulo_brazil— (-46.63, -23.55)cairo_egypt— (31.25, 30.05)shanghai_china— (121.47, 31.23)chesapeake_bay— (-76.20, 38.50)dutch_coast— (4.50, 52.50)normandy_france— (-0.50, 49.30)greenland_glacier— (-49.70, 69.20)alps_switzerland— (8.00, 46.50)andes_peru— (-72.00, -13.50)himalaya_nepal— (86.50, 27.80)everglades_usa— (-80.80, 25.80)pantanal_brazil— (-56.00, -17.50)okavango_botswana— (22.80, -19.30)
Schema
Each row is:
{
"bands": Array3D(shape=(5, 128, 128), dtype=uint16),
"bbox": Sequence(float32, length=4), # (west, south, east, north) WGS84
"acquisition_date": Value(string), # ISO date of the source scene
"scene_id": Value(string), # STAC item id
"source": ClassLabel(names=["preset", "global"]),
"preset_name": Value(string), # "" for global chips
}Normalization stats
Per-band mean and standard deviation computed over the training split (uint16 reflectance, before any scaling):
These are also shipped as norm_stats.json in the dataset bundle. The matching LeJEPA model repo embeds a copy so inference doesn't need to pull the dataset.
Usage
from datasets import load_dataset
ds = load_dataset("falafel-hockey/sentinel2-lejepa-global-diverse-256")
print(ds)
# DatasetDict with "train" and "validation" splits
sample = ds["train"][0]
print(sample["bands"].shape) # (5, 128, 128)
print(sample["source"]) # 0 = preset, 1 = globalThe companion pretrained LeJEPA ResNet-18 (5-band) is published separately and consumes these chips at native resolution without further resizing.
Limitations
- Tiny scale. Thousands of chips, not millions. A real SSL corpus for remote sensing is 2-3 orders of magnitude larger. Expect the resulting features to overfit to the sampled AOIs and date windows.
- Preset bias by design. 70% of chips come from 5 specific locations chosen because they are the demo AOIs in the companion app. This is intentional for the PoC but makes the features a poor fit for general-purpose EO tasks.
- Single sensor, single level. Sentinel-2 L2A only. No Sentinel-1, no Landsat, no other modalities.
- 5 bands only. B02, B03, B04, B08, B11. The red-edge, cirrus, and SWIR22 bands are intentionally excluded to keep the model compact for M1 inference.
- No deduplication across dates. Chips from the same AOI across different acquisition dates are both kept. This is a feature for temporal-invariance pretraining, but means chips are not i.i.d.
License and attribution
- Chips are released under CC-BY-SA-4.0, matching Copernicus Sentinel data's terms for derived products.
- Contains modified Copernicus Sentinel data [2023-2026], ESA. Source imagery: Sentinel-2 L2A via Element84 Earth Search v1.
Citation
@misc{sentinel2_lejepa_preset_biased_small,
title = {Sentinel-2 LeJEPA Preset-Biased (Small)},
author = {Wheelis, Alex},
year = {2026},
url = {https://huggingface.co/datasets/falafel-hockey/sentinel2-lejepa-global-diverse-256}
}
@misc{balestriero2025lejepa,
title = {LeJEPA: Provable and Scalable Self-Supervised Learning Without the Heuristics},
author = {Balestriero, Randall and LeCun, Yann},
year = {2025},
eprint = {2511.08544},
archivePrefix = {arXiv}
}