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#

  1. 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

  2. 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#

  1. 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)
../_images/dataset_notebooks_biomassters_5_0.png
../_images/dataset_notebooks_biomassters_5_1.png

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>]
../_images/dataset_notebooks_biomassters_7_1.png
../_images/dataset_notebooks_biomassters_7_2.png

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>]
../_images/dataset_notebooks_biomassters_11_1.png
../_images/dataset_notebooks_biomassters_11_2.png

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>]
../_images/dataset_notebooks_biomassters_13_1.png
../_images/dataset_notebooks_biomassters_13_2.png

Visualize Batch Data#

[10]:
fig, batch = datamodule.visualize_batch()
../_images/dataset_notebooks_biomassters_15_0.png