GeoBench BioMassters#
Intro#
BioMassters is a dataset designed for Above Ground Biomass (AGB) estimation using multi-temporal satellite imagery. Introduced by Nascetti et al. 2023, the aim is to predict biomass from Sentinel-1 SAR and Sentinel-2 optical time series data. It represents a critical application for climate monitoring, carbon stock assessment, and forest management applications.
Dataset Characteristics#
Modalities:
Sentinel-1 SAR (VV, VH polarizations)
Sentinel-2 Optical (11 spectral bands)
Spatial Resolution: 10m ground sample distance
Temporal Resolution: Monthly composites over growing season
Spectral Bands:
S2: 11 bands (B02, B03, B04, B05, B06, B07, B08, B8A, B11, B12)
S1: 2 polarizations (VV, VH)
Image Dimensions: 256x256 pixels (2.56km x 2.56km chips)
Targets: Continuous Above Ground Biomass values (Mg/ha)
Geographic Distribution: Finland (boreal forest ecosystems). However, the dataset was released without geospatial information.
Temporal Coverage: Multiple months during growing season
GeoBenchV2 Processing Pipeline#
Preprocessing Steps#
Split Generation:
Used original train/test splits from competition
Created validation split by randomly sampling 20% from training data, since no geospatial info is available
Dataset Subsampling:
The final version consists of
4,000 training time-series samples
1,000 validation time-series samples
2,000 test time-series samples
References#
Nascetti, Andrea, Ritu Yadav, Kirill Brodt, Qixun Qu, Hongwei Fan, Yuri Shendryk, Isha Shah, and Christine Chung. “Biomassters: A benchmark dataset for forest biomass estimation using multi-modal satellite time-series.” Advances in Neural Information Processing Systems 36 (2023): 20409-20420. https://proceedings.neurips.cc/paper_files/paper/2023/hash/40daf2a00278c4bea1b26cd4c8a654f8-Abstract-Datasets_and_Benchmarks.html
[1]:
import os
from pathlib import Path
import torch
from geobench_v2.datamodules import GeoBenchBioMasstersDataModule
from geobench_v2.datasets import GeoBenchBioMassters
from geobench_v2.datasets.normalization import SatMAENormalizer, ZScoreNormalizer
from geobench_v2.datasets.visualization_util import (
compute_batch_histograms,
plot_batch_histograms,
plot_channel_histograms,
)
%load_ext autoreload
%autoreload 2
[2]:
DATA_ROOT = Path("../../data/biomassters")
STATS_SATMAE_PATH = os.path.join(DATA_ROOT, "biomassters_stats_satmae.json")
STATS_CLIP_RESCALE_PATH = os.path.join(DATA_ROOT, "biomassters_stats_clip_rescale.json")
[3]:
band_order = GeoBenchBioMassters.band_default_order
datamodule = GeoBenchBioMasstersDataModule(
img_size=256,
batch_size=4,
num_workers=4,
root=DATA_ROOT,
band_order=band_order,
num_time_steps=2,
data_normalizer=torch.nn.Identity(), # we do custom normalization in the tutorial
)
datamodule.setup("fit")
Using provided pre-initialized normalizer instance: Identity
Using provided pre-initialized normalizer instance: Identity
Raw Image Statistics#
Computed over the training dataset.
[4]:
fig = plot_channel_histograms(STATS_SATMAE_PATH)
Raw Batch Statistics#
[6]:
# Get a batch of data from the dataloader
train_dataloader = datamodule.train_dataloader()
raw_batch = next(iter(train_dataloader))
raw_batch_stats = compute_batch_histograms(raw_batch, n_bins=100)
raw_figs = plot_batch_histograms(
raw_batch_stats, band_order, title_suffix=" (Raw Data)"
)
raw_figs
[6]:
[<Figure size 1200x500 with 1 Axes>, <Figure size 1200x500 with 1 Axes>]
Effect of Normalization Schemes#
[7]:
clip_z_normalizer = ZScoreNormalizer(STATS_CLIP_RESCALE_PATH, band_order)
satmae_normalizer = SatMAENormalizer(STATS_SATMAE_PATH, band_order)
Effect of SatMAE Normalization scheme on batch#
[8]:
satmae_normalized_batch = satmae_normalizer(raw_batch)
satmae_batch_stats = compute_batch_histograms(satmae_normalized_batch, n_bins=100)
sat_mae_norm_fig = plot_batch_histograms(
satmae_batch_stats, band_order, title_suffix=" (SatMAE Normalized Data)"
)
sat_mae_norm_fig
[8]:
[<Figure size 1200x500 with 1 Axes>, <Figure size 1200x500 with 1 Axes>]
Effect of ClipZ Normalization scheme on batch#
[9]:
clip_z_normalized_batch = clip_z_normalizer(raw_batch)
clip_z_batch_stats = compute_batch_histograms(clip_z_normalized_batch, n_bins=100)
clip_z_norm_fig = plot_batch_histograms(
clip_z_batch_stats, band_order, title_suffix=" (Clip Z-Score Normalized Data)"
)
clip_z_norm_fig
[9]:
[<Figure size 1200x500 with 1 Axes>, <Figure size 1200x500 with 1 Axes>]
Visualize Batch Data#
[10]:
fig, batch = datamodule.visualize_batch()