Source code for torchgeo.datasets.tessera
# Copyright (c) TorchGeo Contributors. All rights reserved.
# Licensed under the MIT License.
"""Tessera embeddings dataset."""
import einops
import torch
from matplotlib import pyplot as plt
from matplotlib.figure import Figure
from .geo import RasterDataset
from .utils import Sample
[docs]
class TesseraEmbeddings(RasterDataset):
"""Tessera embeddings dataset.
This is a data loader for geospatial embeddings from the `Tessera foundation model
<https://github.com/ucam-eo/tessera>`__, which processes Sentinel-1 and Sentinel-2
satellite imagery to generate 128-channel representation maps at 10m resolution.
These embeddings compress a full year of temporal-spectral features into dense
representations optimized for downstream geospatial analysis tasks.
If you use this dataset in your research, please cite the following paper:
* https://arxiv.org/abs/2506.20380
.. note::
The dataset can be downloaded using the
`geotessera <https://github.com/ucam-eo/geotessera>`__ library. Be sure to use
``--format tiff`` to download GeoTIFF files compatible with TorchGeo.
.. versionadded:: 0.9
"""
filename_glob = 'grid_*.tiff'
filename_regex = """
^grid
_(?P<lon>[0-9.-]+)
_(?P<lat>[0-9.-]+)
_(?P<date>[0-9]{4})
.tiff$
"""
date_format = '%Y'
all_bands = tuple(map(str, range(128)))
[docs]
def plot(
self, sample: Sample, show_titles: bool = True, suptitle: str | None = None
) -> Figure:
"""Plot a sample from the dataset.
.. warning::
Visualizations are generated using PCA on each image *individually*, and
are thus not comparable across images. The plot method is provided for
visualization purposes only and should not be used to draw conclusions.
Args:
sample: a sample returned by :meth:`RasterDataset.__getitem__`
show_titles: flag indicating whether to show titles above each panel
suptitle: optional string to use as a suptitle
Returns:
a matplotlib Figure with the rendered sample
"""
_, h, w = sample['image'].shape
A = einops.rearrange(sample['image'], 'c h w -> (h w) c')
# Use PCA to project embeddings from 128D to 3D space
_, _, V = torch.pca_lowrank(A, q=3)
B = A @ V
B -= B.min(dim=0, keepdim=True)[0]
B /= B.max(dim=0, keepdim=True)[0]
image = einops.rearrange(B, '(h w) c -> h w c', h=h, w=w)
fig, ax = plt.subplots()
ax.imshow(image)
ax.axis('off')
if show_titles:
ax.set_title('Embedding')
if suptitle is not None:
plt.suptitle(suptitle)
return fig