Paper · 2024-12-03 · cs.CV
Prithvi-EO-2.0: A Versatile Multi-Temporal Foundation Model for Earth Observation Applications
Prithvi-EO-2.0 is a ViT masked autoencoder (300M and 600M parameters) pretrained on 4.2M four-frame 30 m HLS satellite samples. It uses 3D patch embeddings and optional date and location metadata. Author-reported: 8% over Prithvi-EO-1.0 on GEO-Bench and strong results on SME-led downstream tasks.
Masked image modelingVision Transformer (ViT) backbonesPositional encodingLow-rank adaptation (LoRA and variants)remote-sensingearth-observationmasked-autoencodervision-transformerpretrainingsegmentation
arXivPDFCodeMarkdown16 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Satellite pictures of the same spot taken months apart show how land changes with the seasons and over the years. Prithvi-EO-2.0 is a large neural network that learns from millions of such short image sequences. It learns by hiding parts of the pictures and trying to fill them back in, so it picks up general knowledge about land and how it changes before anyone asks it a specific question.
Unlike many earlier models built for single images, this one treats the sequence as a whole. It can also be given the date and place a sample was taken, though it still works when that information is missing.
After this general training, the model is adapted to specific jobs such as flood mapping, burn-scar mapping, landslide detection, crop mapping, biomass estimation and carbon-flux estimation. The authors report that it does well on these tasks, often with fewer labelled examples than the alternatives.
TL;DR
- A ViT masked autoencoder (MAE) in two sizes, 300M and 600M, pretrained on 4.2M samples of four Harmonized Landsat-Sentinel-2 images (30 m) §3.1 §3.2.
- Adds 3D patch embeddings and learned-weight bias terms for date and location so time and place are used when present §3.2.
- Author-reported: 8% better than Prithvi-EO-1.0 across GEO-Bench tasks, and SME-led downstream results §4 [abstract]. Weights are on Hugging Face. The code is MIT-licensed LICENSE. The weights' licence is not named in the paper.
Problem
Most geospatial foundation models of the time did not model multi-temporal inputs. Those that did were limited to point data, pixel time series or small patches §1. The authors also note that validation across task types was limited, and that adapting these models often needed AI expertise and tooling §1 §2.
Method
The method has three parts: how the pretraining samples are built §3.1, the pretraining model §3.2, and how the model is evaluated and fine-tuned §3.3 and §4.
- Dataset. Pretraining uses NASA's HLS product, which harmonises Landsat 8/9 and Sentinel-2A/2B at 30 m. Only six bands are used, common to both sensors: Blue, Green, Red, NIR, SWIR1 and SWIR2 §3.1.
- Tile selection. Tiles of 3,660 × 3,660 px are chosen to cover land-cover classes, ecoregions, urban areas and high-entropy landscapes. The procedure yields 3,028 training tiles and 163 validation tiles §3.1 fig. 1.
- Sequences and patches. For each tile, sequences of four HLS timestamps are sampled with gaps of one to six months between consecutive timestamps, spanning 2014 to 2023 §3.1. Each sequence is cut into non-overlapping 256 × 256 patches. Patches with more than 1% missing pixels in any band or more than 20% cloud (Fmask) are discarded §3.1. Missing pixels are filled with nearest-neighbour interpolation §3.1. The final set has 4.2M training and 46k validation samples §3.1 fig. 2.
- Patch embedding. A 3D convolution splits the sequence into cubes of size (t, h, w) with t = 1, because satellite revisits are irregular §3.2. Each image therefore becomes its own temporal slice.
- Positional encoding. A 1D sin/cos code is built for time, height and width, then the three are combined into one 3D encoding §3.2 eq. 1.
- Metadata. Year and day-of-year of each image, and the centre latitude and longitude of the sample, are each encoded with 1D sin/cos and concatenated. The time code and the location code are each added to the tokens with a learned weight, so each has its own weight §3.2. The metadata is added as a bias, not as extra input channels §3.2.
- Metadata dropout. During pretraining, the location and/or time code is dropped at random, so the model learns to work without it §3.2.
- Masked autoencoding. A subset of patches is masked. The encoder sees only the visible tokens. The decoder receives the encoded visible tokens plus learned mask tokens, and reconstructs the masked tokens. The loss is MSE in pixel space on the masked tokens §3.2. The method follows MAE §3.2.
- Fine-tuning. Downstream heads are attached to the encoder. Decoders vary by task: UPerNet for most dense tasks, a small convolutional decoder for US crops, and a deconvolution decoder for landslides. Recipes are in the table below §3.3 §4.
# Build pretraining samples from one selected HLS tile [§3.1]
# Input: tile, a time series of 6-band HLS images (3660 x 3660 px)
# Output: list of samples, each 4 timestamps x 256 x 256 px
def sample_tile(tile, per_tile_limit):
# Scan candidate sequences of 4 timestamps, gaps of 1 to 6 months [§3.1]
kept = []
for sequence in candidate_sequences(tile, length=4):
# Stop after 1,500 samples per tile, 250 for validation [§3.1]
if len(kept) >= per_tile_limit:
break
# Non-overlapping 256 x 256 patches of the same 4 timestamps [§3.1]
for patch in non_overlapping_patches(sequence, size=256):
# Drop patches with > 1 % missing or > 20 % cloud [§3.1]
if missing_fraction(patch) > 0.01:
continue
if cloud_fraction(patch) > 0.20:
continue
# Fill missing pixels with nearest-neighbour values [§3.1]
kept.append(fill_missing_nearest(patch))
return kept# One pretraining forward pass for a batch of samples [§3.2]
# Input: images (B, T=4, C=6, 224, 224) after random crop [§3.2]
# dates (B, T, 2) year and day of year; centre (B, 2) lat, lon
# Output: reconstruction loss on masked tokens
def pretrain_step(images, dates, centre, mask_ratio):
# 3D patch embedding with t = 1 [§3.2]
tokens = conv3d_patch_embed(images) # (B, N, D)
# 3D sin/cos positional encoding [§3.2] [eq. 1]
tokens = tokens + positional_encoding_3d(tokens)
# Learned-weight metadata bias; time per image, location per sample [§3.2]
tokens = tokens + metadata_bias(dates, centre, drop_probability=0.1)
# Mask a random subset of tokens; the ratio is not stated [§3.2]
visible, masked_ids = random_mask(tokens, mask_ratio)
# Encoder processes visible tokens only [§3.2]
latent = vit_encoder(visible)
# Decoder gets encoded tokens plus learned mask tokens [§3.2]
prediction = vit_decoder(latent, masked_ids)
# MSE in pixel space on masked tokens [§3.2]
return mse(prediction[masked_ids], pixels[masked_ids])Key equations:
\mathrm{PE}_{pos,2i} = \sin\left(\frac{pos}{10000^{2i/D}}\right),\quad \mathrm{PE}_{pos,2i+1} = \cos\left(\frac{pos}{10000^{2i/D}}\right) eq. 1
\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} eq. 2
\text{mIoU} = \frac{1}{C}\sum_{c=1}^{C}\frac{\lvert prediction_c \cap truth_c \rvert}{\lvert prediction_c \cup truth_c \rvert} eq. 3
Precision, recall and F1 are defined in eq. 4, eq. 5 and eq. 6. The F1 form used is 2TP / (2TP + FP + FN) eq. 6.
Hyperparameters
Pretraining §3.2 unless noted
| Setting | Value | Where | Notes |
|---|---|---|---|
| Backbone, 300M | ViT-L | §3.2 | Two sizes: 300M and 600M |
| Backbone, 600M | ViT-H | §3.2 | |
| Input sample | 4 × 256 × 256 (T, H, W), 6 HLS bands | §3.1 §3.2 | |
| Augmentation | random crop to 4 × 224 × 224; random horizontal flip | §3.2 | Vertical flip not mentioned for pretraining |
| Temporal patch t | 1 | §3.2 | |
| Spatial patch, 600M | 14 × 14 | §4.2.1 | Stated only in the flood section |
| Spatial patch, 300M | not stated | Repository's Sen4Map configs use 16 sen4map_land-cover.yaml | |
| Mask ratio | not stated | Not in the paper or in the repository | |
| Epochs | 400 | §3.2 | |
| Hardware | A100 40 GB; 80 GPUs (300M), 240 GPUs (600M) | §3.2 | JUWELS Booster |
| Local batch size | 48 (ViT-L), 16 (ViT-H) | §3.2 | |
| Global batch size | 3,840 | §3.2 | 48 × 80 and 16 × 240 both equal 3,840 |
| Compute | ~21,000 GPU-h (300M); ~58,000 GPU-h (600M) | §3.2 | |
| Optimizer | not named; weight decay 0.05 | §3.2 | Optimizer family is not stated |
| LR schedule | cosine; max LR 5e-4; linear warm-up over 40 epochs from 1e-6 | §3.2 | |
| Metadata drop probability | 0.1 (TL models only) | §3.2 | Dropped term representation not stated |
| Loss | MSE on masked tokens, pixel space | §3.2 | |
| Positional encoding | 1D sin/cos per axis, combined to 3D | §3.2 eq. 1 | |
| Metadata encoding | 1D sin/cos for lat, lon, year and day-of-year, concatenated; learned weight per term | §3.2 | See Paper vs code |
Benchmarking, GEO-Bench §3.3.1
| Setting | Value | Where | Notes |
|---|---|---|---|
| Datasets | 6 classification and 6 segmentation | tab. 1 | Multispectral sensors only |
| Input resolution | all images resized to 224 × 224 | §3.3.1 | |
| Augmentation | random horizontal and vertical flips | §3.3.1 | |
| Head, classification | linear layer | §3.3.1 | |
| Head, segmentation | U-Net for ResNets; UPerNet for transformers | §3.3.1 | |
| Hyperparameter search | 10 trials per dataset, Bayesian optimisation (Optuna via TerraTorch-iterate) | §3.3.1 | Search space: LR, decoder depth, weight decay |
| Batch size | fixed per dataset; value not stated | §3.3.1 | |
| Repeats | 10 seeds on the best hyperparameters | §3.3.1 | |
| Metric, classification | micro-averaged accuracy; micro-F1 for m-bigearthnet | §3.3.1 | |
| Metric, segmentation | mIoU | §3.3.1 |
Downstream fine-tuning
| Task | Setting | Value | Where |
|---|---|---|---|
| Flood (Sen1Floods11) | Decoder | UPerNet | §4.2.1 |
| Search | 10 trials over weight decay and LR, 10 seeds | §4.2.1 | |
| Loss, epochs | cross-entropy; 50 epochs; early-stop patience 20 | §4.2.1 | |
| Input | 512 → 448 resize (600M patch 14); flips; six bands | §4.2.1 | |
| Config | LR 5e-5, weight decay 0.05, batch 16 | sen1floods11.yaml sen1floods11.yaml | |
| Wildfire scars (HLS burn scars) | Decoder, search | UPerNet; 10 trials on weight decay and LR; 10 seeds | §4.2.2 |
| Loss, epochs | cross-entropy; 50 epochs; patience 20 | §4.2.2 | |
| Input | 512 → 448; random crop 224; flips | §4.2.2 | |
| Config | LR 5e-5, weight decay 0.05 | firescars.yaml | |
| Burn intensity | Decoder | UPerNet; LoRA | §4.2.3 |
| Loss | weighted cross-entropy, 5 classes (0–4) | §4.2.3 | |
| Optimizer | LR 5e-4 encoder, 5e-5 decoder; cosine annealing; weight decay 0.05 | §4.2.3 | |
| Epochs, data | 50 epochs; 80/20 train/test of 5,692 images; random horizontal flip | §4.2.3 | |
| Config | Single LR 1e-5; StepLR; no LoRA key | burnintensity.yaml | |
| Landslide4Sense | Decoder | four deconvolution layers with layer norm and activation, then two convolution layers; bilinear resize added for 600M (patch 14) | §4.2.4 |
| Input | six HLS bands upsampled to 224; random flips | §4.2.4 | |
| Loss | weighted cross-entropy (2:8 negative:positive) or Lovász | §4.2.4 | |
| Optimizer | Adam, LR 1e-5; cosine with warm-up and restarts | §4.2.4 | |
| Batch, epochs | batch 8; 100 epochs; checkpoint with lowest validation loss | §4.2.4 | |
| Few-shot | ~1% of data (50 images) | §4.2.4 | |
| Config | Focal loss; AdamW LR 5e-5, weight decay 0.1; 50 epochs; patience 10 | landslide.yaml | |
| US crop segmentation | Input | 224 × 224, 3 temporal frames; flips | §4.3.1 |
| Classes | 13 | §4.3.1 | |
| Loss, decoder | weighted cross-entropy; simple convolution and upsampling decoder | §4.3.1 | |
| Epochs | 80 | §4.3.1 | |
| Config | 125 epochs max; AdamW LR 3e-4, weight decay 0.35; StepLR | multicrop.yaml multicrop.yaml | |
| Europe land cover and crops (Sen4Map) | Input | 12 monthly composites; 15 × 15 centre crop upscaled to 224; 10 bands | §4.3.2 |
| Ratios | 1.0, 0.5, 0.25, 0.125, 0.0625 of training data | §4.3.2 tab. 10 tab. 11 | |
| Loss, metric | weighted F1 (reported); baseline ViViT trained from scratch | §4.3.2 | |
| Config | 20 epochs; batch 10; AdamW LR 6e-5, weight decay 0.05; ReduceLROnPlateau; 300M | sen4map_crops.yaml sen4map_crops.yaml | |
| PASTIS | Input | 20 frames chosen by one random pick per equal-width temporal bin, fixed for validation and test | §4.3.3 |
| Decoder | UPerNet; LTAE and temporal aggregator for all except Presto | §4.3.3 | |
| Loss | cross-entropy | §4.3.3 | |
| Optimizer | LR 5e-4 encoder, 5e-5 decoder; weight decay 0.05; LoRA | §4.3.3 | |
| Epochs | 50 epochs; early-stop patience 10 | §4.3.3 | |
| Data | folds 1–3 train, fold 4 validation, fold 5 test; 100% and 10% of training data | §4.3.3 | |
| Augmentation | random resized crop, horizontal flip, rotation | §4.3.3 | |
| Above-ground biomass (BioMassters) | Decoder | FCN decoder with regression head | §4.4.1 |
| Optimizer | AdamW, LR 6e-5, weight decay 0.05; LoRA for Sentinel-2-only inputs | §4.4.1 | |
| Data | 80/20 train/validation split; best setting uses 12 Sentinel-2 timestamps | §4.4.1 | |
| Augmentation | random flips and rotations | §4.4.1 | |
| Config | 125 epochs; patience 20; AdamW LR 1e-4, weight decay 0.05; StepLR; use_four_frames: True | biomassters.yaml biomassters.yaml biomassters.yaml | |
| Gross primary productivity (GPP) | Encoder | Prithvi-EO-2.0 encoder frozen | §4.4.2 |
| Head | 2 linear layers with ReLU (decoder); 3 conv layers with ReLU and a linear layer (MERRA-2 branch); concatenate, linear output | §4.4.2 | |
| Loss | mean squared error | §4.4.2 | |
| Validation | leave-one-year-out (3 years train, 1 test) | §4.4.2 | |
| Data | 37 flux towers, 975 samples; 6 HLS bands at 50 × 50; 10 MERRA-2 features | §4.4.2 | |
| Code | AdamW, LR 5e-5, weight decay 0.05; ReduceLROnPlateau (factor 0.9, patience 5); 50 iterations; batch 16 | main_flux_finetune_baselines_trainer.py fluxconfig_trainer.yaml |
Results
Author-reported throughout. Setups are given with each table. The GEO-Bench per-run results are in the paper's "GEO-Bench detailed results" section, which sits after the bibliography tab. A1–tab. A4.
GEO-Bench, mean score per dataset
Mean over 10 seeds. Values are the paper's per-dataset means tab. A1–tab. A4. The 100M variant of Prithvi-EO-2.0 is in those tables but not released (see Pitfalls).
| Dataset | Metric | Prithvi-EO-1.0-100M | Prithvi-EO-2.0-300M | Prithvi-EO-2.0-300M-TL | Prithvi-EO-2.0-600M | Prithvi-EO-2.0-600M-TL |
|---|---|---|---|---|---|---|
| m-bigearthnet | F1 | 66.82 | 70.19 | 70.33 | 70.73 | 70.93 |
| m-brick-kiln | Acc | 98.24 | 98.31 | 98.43 | 98.79 | 98.61 |
| m-eurosat | Acc | 92.07 | 94.97 | 94.86 | 95.48 | 95.43 |
| m-forestnet | Acc | 47.89 | 51.74 | 53.20 | 54.04 | 54.53 |
| m-pv4ger | Acc | 96.50 | 97.88 | 97.91 | 97.90 | 97.80 |
| m-so2sat | Acc | 51.50 | 58.44 | 57.84 | 57.20 | 59.54 |
| m-NeonTree | mIoU | 55.66 | 57.63 | 56.95 | 59.22 | 58.07 |
| m-SA-crop-type | mIoU | 32.50 | 40.38 | 40.50 | 41.70 | 41.36 |
| m-cashew-plant | mIoU | 71.52 | 75.79 | 78.47 | 85.47 | 86.30 |
| m-chesapeake | mIoU | 60.18 | 63.42 | 65.10 | 64.09 | 69.19 |
| m-nz-cattle | mIoU | 73.64 | 77.87 | 77.47 | 81.05 | 80.79 |
| m-pv4ger-seg | mIoU | 92.12 | 94.93 | 94.88 | 95.23 | 95.20 |
Per the text, the top classification models are DOFA and Prithvi-EO-2.0-600M-TL and -600M. The top segmentation and overall models are Prithvi-EO-2.0-600M-TL and -600M §4.1 fig. 6 fig. 7. Other models are in tab. A1–tab. A4. The aggregate scores in fig. 6 are shown only as bars; the paper gives no numbers for them.
Flood mapping, Sen1Floods11 §4.2.1 tab. 4
| Model | mIoU (std) | mF1 (std) | IoU water (std) |
|---|---|---|---|
| Prithvi-EO-1.0-100M | 88.3 (0.3) | 97.3 (0.1) | 79.6 (0.5) |
| Prithvi-EO-2.0-300M | 89.7 (0.3) | 97.6 (0.1) | 82.2 (0.6) |
| Prithvi-EO-2.0-300M-TL | 90.0 (0.2) | 97.7 (0.1) | 82.6 (0.3) |
| Prithvi-EO-2.0-600M | 89.9 (0.6) | 97.6 (0.2) | 82.5 (1.0) |
| Prithvi-EO-2.0-600M-TL | 90.3 (0.3) | 97.7 (0.1) | 83.1 (0.5) |
Wildfire scar mapping §4.2.2 tab. 5
| Model | mIoU (std) | mF1 (std) | IoU burn scar (std) |
|---|---|---|---|
| Prithvi-EO-1.0-100M | 86.9 (0.8) | 97.2 (0.2) | 76.8 (1.4) |
| Prithvi-EO-2.0-300M | 88.6 (0.5) | 97.6 (0.1) | 79.9 (0.8) |
| Prithvi-EO-2.0-300M-TL | 89.3 (0.9) | 97.8 (0.3) | 81.1 (1.6) |
| Prithvi-EO-2.0-600M | 90.5 (0.6) | 98.1 (0.2) | 83.2 (1.1) |
| Prithvi-EO-2.0-600M-TL | 90.5 (0.7) | 98.1 (0.2) | 83.2 (1.1) |
Burn intensity §4.2.3 tab. 6
Test set, five classes (0 = no burn to 4 = high severity).
| Model | mIoU | IoU0 | IoU1 | IoU2 | IoU3 | IoU4 |
|---|---|---|---|---|---|---|
| U-Net | 26.3 | 67.5 | 10.0 | 19.9 | 23.7 | 10.6 |
| U-Net (ResNet-50) | 28.8 | 68.1 | 18.2 | 21.7 | 27.8 | 8.05 |
| Prithvi-EO-2.0-300M | 31.2 | 73.3 | 22.7 | 22.3 | 25.8 | 11.8 |
| Prithvi-EO-2.0-600M | 31.1 | 75.9 | 21.0 | 20.5 | 27.5 | 10.4 |
Landslide4Sense §4.2.4 tab. 7 tab. 8 fig. 8
Full training set (100%, 3,799 images):
| Model | Loss | mIoU | F1 | Precision | Recall | mAcc |
|---|---|---|---|---|---|---|
| U-Net | wCE | 70.4 | 59.7 | 56.2 | 63.6 | 98.4 |
| U-Net++ | wCE | 69.0 | 57.0 | 50.2 | 68.4 | 98.0 |
| Prithvi-EO-2.0-300M | Lovász | 71.3 | 60.7 | 57.1 | 64.7 | 98.4 |
| Prithvi-EO-2.0-600M | wCE | 70.4 | 58.6 | 51.1 | 68.6 | 98.2 |
Small subset (about 1%, 50 images):
| Model | Loss | mIoU | F1 | Precision | Recall | mAcc |
|---|---|---|---|---|---|---|
| U-Net | wCE | 59.7 | 35.0 | 52.5 | 27.6 | 98.1 |
| U-Net++ | wCE | 55.5 | 22.3 | 43.8 | 16.9 | 98.0 |
| Prithvi-EO-2.0-300M | Lovász | 64.5 | 43.8 | 53.0 | 37.3 | 98.2 |
| Prithvi-EO-2.0-600M | wCE | 67.0 | 49.7 | 57.2 | 44.0 | 98.3 |
US multi-temporal crop segmentation §4.3.1 tab. 9
| Model | mIoU | mAcc |
|---|---|---|
| U-Net | 42.6 | 61.9 |
| Prithvi-EO-1.0-100M | 42.7 | 60.7 |
| Prithvi-EO-2.0-300M | 48.6 | 66.8 |
| Prithvi-EO-2.0-600M | 50.7 | 68.8 |
Europe, Sen4Map land cover and crops §4.3.2 tab. 10 tab. 11
Weighted F1 (std) by fraction of training data.
| Ratio | ViViT (Sen4Map) | Prithvi-EO-1.0-100M | Prithvi-EO-2.0-300M | Prithvi-EO-2.0-600M |
|---|---|---|---|---|
| Land cover, 1.0 | 72.7 (0.3) | 74.5 (0.3) | 76.0 (0.3) | 76.1 (0.2) |
| Land cover, 0.5 | 69.9 (0.4) | 72.4 (0.4) | 73.9 (0.4) | 74.1 (0.3) |
| Land cover, 0.25 | 65.7 (0.7) | 69.1 (0.5) | 70.7 (0.6) | 71.2 (0.5) |
| Land cover, 0.125 | 61.6 (0.5) | 65.3 (0.5) | 67.1 (1.1) | 67.8 (1.4) |
| Land cover, 0.0625 | 55.0 (1.3) | 59.4 (1.3) | 61.2 (1.4) | 62.3 (0.9) |
| Crops, 1.0 | 81.5 (0.3) | 83.0 (0.3) | 84.4 (0.2) | 84.6 (0.2) |
| Crops, 0.5 | 79.0 (0.3) | 81.5 (0.2) | 82.8 (0.2) | 82.6 (0.2) |
| Crops, 0.25 | 75.5 (0.4) | 78.6 (0.4) | 80.4 (0.4) | 80.5 (0.3) |
| Crops, 0.125 | 69.7 (1.0) | 74.6 (0.7) | 77.3 (0.4) | 76.9 (0.5) |
| Crops, 0.0625 | 64.5 (1.4) | 70.5 (1.0) | 72.2 (1.4) | 70.8 (0.9) |
PASTIS crop segmentation §4.3.3 tab. 12
mIoU, models trained on 10% and 100% of the training data.
| Model | 10% | 100% |
|---|---|---|
| DOFA | 20.4 | 37.0 |
| Satlas | 15.8 | 31.5 |
| Presto | 20.1 | 28.1 |
| U-TAE (baseline) | 36.9 | 52.9 |
| Prithvi-EO-2.0-300M | 36.3 | 51.6 |
| Prithvi-EO-2.0-600M | 37.4 | 53.4 |
Above-ground biomass, BioMassters §4.4.1 tab. 13 tab. 14 fig. 9 fig. 10
RMSE on the test set, lower is better. Winning-challenge baseline: RMSE 27.49.
| Data | T | Test RMSE |
|---|---|---|
| S2 (LoRA) | 4 | 35.47 |
| S2 + S1 | 4 | 38.67 |
| S2 (LoRA) | 12 | 33.40 |
| S2 + S1 | 12 | 36.48 |
| All S2 bands + S1 | 12 | 36.25 |
| Baseline (challenge winner) | — | 27.49 |
Subset training (12 Sentinel-2 timestamps, LoRA): 50% → 34.31; 20% → 34.89; 10% → 36.77; 5% → 38.06 tab. 14.
The baseline beats every Prithvi configuration on this task. The authors say optical-only Prithvi approaches multimodal models, cite prior work that optical plus SAR beats optical alone for biomass, and report that adding SAR bands to Prithvi did not help §4.4.1.
GPP at flux towers §4.4.2 tab. 15 fig. 11
Leave-one-year-out R², test year shown.
| Model | 2018 | 2019 | 2020 | 2021 |
|---|---|---|---|---|
| RF (−VIs) | 0.68 | 0.78 | 0.70 | 0.64 |
| RF (+VIs) | 0.72 | 0.77 | 0.73 | 0.66 |
| XGBoost (−VIs) | 0.66 | 0.75 | 0.69 | 0.60 |
| XGBoost (+VIs) | 0.77 | 0.77 | 0.77 | 0.60 |
| ResNet18 | 0.76 | 0.81 | 0.73 | 0.70 |
| Prithvi-EO-2.0-300M | 0.84 | 0.77 | 0.77 | 0.70 |
| Prithvi-EO-2.0-300M-TL | 0.84 | 0.76 | 0.74 | 0.69 |
| Prithvi-EO-2.0-600M | 0.75 | 0.77 | 0.80 | 0.70 |
| Prithvi-EO-2.0-600M-TL | 0.88 | 0.80 | 0.83 | 0.74 |
Paper vs code
The official repository is NASA-IMPACT/Prithvi-EO-2.0, linked in the paper
§1 README.md. It is MIT-licensed LICENSE. It contains
fine-tuning configs and notebooks built on TerraTorch README.md. The
pretraining code, the GEO-Bench harness and the PASTIS code are not in this
repository.
- Metadata encoding. The paper says each of latitude, longitude, year and day-of-year is encoded with 1D sin/cos, and that the time and location codes have learned weights §3.2. The README says the metadata is encoded with 2D sin/cos, and that the encoder and the decoder each receive it with separate learned weights README.md. The two descriptions differ.
- Burn intensity. The paper uses LoRA, LR 5e-4 for the encoder and 5e-5 for the decoder, cosine annealing §4.2.3. The config has no LoRA setting, a single LR of 1e-5, and a StepLR scheduler burnintensity.yaml.
- Landslide. The paper uses Adam, LR 1e-5, 100 epochs, batch 8, with weighted cross-entropy or Lovász loss §4.2.4. The config uses AdamW with LR 5e-5 and weight decay 0.1, focal loss, 50 epochs and patience 10 landslide.yaml landslide.yaml.
- BioMassters. The paper's best setting uses 12 Sentinel-2 timestamps
§4.4.1. The config defaults to
use_four_frames: Trueandbackbone_num_frames: 4biomassters.yaml biomassters.yaml. The config also uses LR 1e-4 and StepLR, while the paper gives AdamW at LR 6e-5 §4.4.1. - US crop segmentation. The paper says 80 epochs §4.3.1. The config allows 125 multicrop.yaml. Its data path points to the Prithvi-1.0 dataset multicrop.yaml.
- Neck layer indices. The paper does not say which encoder blocks feed the decoder. The landslide, wildfire and BioMassters configs use indices 7, 15, 23, 31 for the 600M backbone landslide.yaml firescars.yaml. The 300M indices (5, 11, 17, 23) are commented out there. The Sen1Floods11 config is active with the Prithvi-1.0 indices 2, 5, 8, 11 sen1floods11.yaml, so its decoder taps are not the 2.0 ones.
- GPP backbone. The GPP trainer loads
Prithvi_EO_V2_300M_TL.ptmain_flux_finetune_baselines_trainer.py. The paper's best GPP result is 600M-TL tab. 15. The paper says it tried all variants. The trainer also readsfluxconfig_trainer_custom.yamlmain_flux_finetune_baselines_trainer.py, which is not in the repository. The repository hasfluxconfig_trainer.yaml. - GPP model. The code matches the paper's head: a frozen encoder main_flux_finetune_baselines_trainer.py, a 1024-to-256 linear layer followed by a flattened linear layer to 64 flux_regress.py, a 1×1 convolutional MERRA branch flux_regress.py, and a final linear layer on the concatenation flux_regress.py. The MERRA convolutions use kernel size 1; the paper does not state a kernel size.
- Sen4Map. The code uses 15 × 15 crops resized to 224, 12 frames, and a 300M backbone with patch 16 sen4map_crops.yaml sen4map_crops.yaml sen4map_crops.yaml. This matches §4.3.2. The paper gives no optimiser or epoch count for this task; the config has 20 epochs and AdamW at LR 6e-5 sen4map_crops.yaml.
- Consistent items. Flood and wildfire epochs, patience and loss match the configs §4.2.1 §4.2.2 sen1floods11.yaml firescars.yaml.
Pitfalls
- Mask ratio is not stated in the paper or the repository. An implementer must choose it. The MAE default is usually assumed, but this is not confirmed here.
- Optimizer for pretraining is not named. Weight decay 0.05, cosine schedule and LR 5e-4 are given §3.2, so the optimiser family is a guess.
- Metadata dropout is underspecified. The paper gives probability 0.1 for TL models §3.2. It does not say whether the drop is per sample or per term, whether the two terms are dropped independently, or what replaces a dropped term.
- Metadata encoding has two versions. Use the paper's version §3.2 unless you are matching the released weights. Check the released checkpoint's architecture before reusing this code README.md.
- Patch size for the 300M model is not stated. The paper gives 14 × 14 for the 600M model §4.2.1. The repository's Sen4Map configs use 16 sen4map_crops.yaml. Confirm against the checkpoint.
- Sampling is not fully specified. The paper says sequences are sampled "iteratively" until all candidates are processed or 1,500 samples per tile are reached §3.1. It does not say whether the 1,500 counts candidates or kept samples, or how the four timestamps are picked from the candidates.
- Headline claim unclear. The 8% gain over Prithvi-EO-1.0 [abstract] §5 does not name a metric. The paper's own comparison of 100M-to-100M models gives 3% on the overall GEO-Bench score §4.1. Use the per-dataset tables above.
- 100M variant is not released.
Prithvi-EO-2.0-100Mappears in the GEO-Bench appendix tables and text §4.1 tab. A1. It is absent from the model table tab. 2 and from the released models README.md. - Batch size for GEO-Bench is not stated. The paper says it was "fixed to a reasonable value" per dataset §3.3.1. Results may not reproduce without it.
- Seeds and trials differ by task. GEO-Bench and the flood and wildfire tasks use 10 HPO trials and 10 seeds §3.3.1 §4.2.1 §4.2.2. Most other tasks give no seed count. The GPP results are single leave-one-year-out splits, so they have no spread §4.4.2 tab. 15.
- Compute is large for pretraining, small for fine-tuning. Pretraining uses ~21,000 GPU-h (300M) and ~58,000 GPU-h (600M) on 80 and 240 A100s §3.2. The paper says all fine-tuning runs fit on one GPU §3.3.
- Figures carry numbers that the text does not. The GEO-Bench aggregates in fig. 6 and the per-run distributions in fig. 7 are not tabulated in the text. Use tab. A1–tab. A4 for numbers.
- Licensing of the model and data is not named. The conclusion calls the release "permissive" but does not name a licence §5. The downstream datasets have their own licences, which this card does not check.
Lineage
- Builds on: the masked autoencoder approach §3.2; ViT backbones §3.2; 3D patch embedding and positional encodings from video and multispectral MAE work §3.2. Its predecessor is Prithvi-EO-1.0, a US-only model trained on HLS data with 250k samples and three timestamps §1 tab. 2.
- Compared against: SatMAE, Scale-MAE, SSL4EO-S12 (MoCo, DINO), DeCUR, DOFA, Presto, U-BARN §2; Satlas tab. 2; Prithvi-EO-1.0 §4.1.
- Superseded by: not known from this paper's content.
Source and license
Adapted from “Prithvi-EO-2.0: A Versatile Multi-Temporal Foundation Model for Earth Observation Applications” by Daniela Szwarcman, Sujit Roy, Paolo Fraccaro, Þorsteinn Elí Gíslason, Benedikt Blumenstiel, Rinki Ghosal, Pedro Henrique de Oliveira, Joao Lucas de Sousa Almeida, Rocco Sedona, Yanghui Kang, Srija Chakraborty, Sizhe Wang, Carlos Gomes, Ankur Kumar, Myscon Truong, Denys Godwin, Hyunho Lee, Chia-Yu Hsu, Rohit Lal, Ata Akbari Asanjan, Besart Mujeci, Disha Shidham, Trevor Keenan, Paulo Arevalo, Wenwen Li, Hamed Alemohammad, Pontus Olofsson, Christopher Hain, Robert Kennedy, Bianca Zadrozny, David Bell, Gabriele Cavallaro, Campbell Watson, Manil Maskey, Rahul Ramachandran, Juan Bernabe Moreno (arXiv:2412.02732), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/NASA-IMPACT/Prithvi-EO-2.0 at commit 758311280f93 (MIT). Any quoted code is shown under that license.