From ccc314cd88f8cc2d0d832821a410eca2b7c9ec69 Mon Sep 17 00:00:00 2001 From: Daniele Rege Cambrin Date: Wed, 28 Aug 2024 15:57:58 +0200 Subject: [PATCH] Add CaBuAr dataset (#2235) * :new: Added CaBuAr dataset * :new: Added CaBuAr datamodule * :hammer: Added CaBuAr datamodule test * :hammer: Corrected CaBuAr typing and datamodule test * :hammer: updated test, corrected docs, minor fixes to dataset and datamodule * :hammer: CaBuAr test fixes --- docs/api/datamodules.rst | 5 + docs/api/datasets.rst | 5 + docs/api/non_geo_datasets.csv | 1 + tests/conf/cabuar.yaml | 16 ++ tests/data/cabuar/512x512.hdf5 | Bin 0 -> 430544 bytes tests/data/cabuar/chabud_test.h5 | Bin 0 -> 235520 bytes tests/data/cabuar/data.py | 69 +++++++ tests/datasets/test_cabuar.py | 92 +++++++++ tests/trainers/test_segmentation.py | 3 +- torchgeo/datamodules/__init__.py | 2 + torchgeo/datamodules/cabuar.py | 67 ++++++ torchgeo/datasets/__init__.py | 2 + torchgeo/datasets/cabuar.py | 303 ++++++++++++++++++++++++++++ 13 files changed, 564 insertions(+), 1 deletion(-) create mode 100644 tests/conf/cabuar.yaml create mode 100644 tests/data/cabuar/512x512.hdf5 create mode 100644 tests/data/cabuar/chabud_test.h5 create mode 100644 tests/data/cabuar/data.py create mode 100644 tests/datasets/test_cabuar.py create mode 100644 torchgeo/datamodules/cabuar.py create mode 100644 torchgeo/datasets/cabuar.py diff --git a/docs/api/datamodules.rst b/docs/api/datamodules.rst index 475e22404..af3b8c3a8 100644 --- a/docs/api/datamodules.rst +++ b/docs/api/datamodules.rst @@ -57,6 +57,11 @@ BigEarthNet .. autoclass:: BigEarthNetDataModule +CaBuAr +^^^^^^ + +.. autoclass:: CaBuArDataModule + ChaBuD ^^^^^^ diff --git a/docs/api/datasets.rst b/docs/api/datasets.rst index 036c19707..8ed61a259 100644 --- a/docs/api/datasets.rst +++ b/docs/api/datasets.rst @@ -217,6 +217,11 @@ BioMassters .. autoclass:: BioMassters +CaBuAr +^^^^^^ + +.. autoclass:: CaBuAr + ChaBuD ^^^^^^ diff --git a/docs/api/non_geo_datasets.csv b/docs/api/non_geo_datasets.csv index 6c355c03b..be4a131c8 100644 --- a/docs/api/non_geo_datasets.csv +++ b/docs/api/non_geo_datasets.csv @@ -3,6 +3,7 @@ Dataset,Task,Source,License,# Samples,# Classes,Size (px),Resolution (m),Bands `Benin Cashew Plantations`_,S,Airbus Pléiades,"CC-BY-4.0",70,6,"1,122x1,186",10,MSI `BigEarthNet`_,C,Sentinel-1/2,"CDLA-Permissive-1.0","590,326",19--43,120x120,10,"SAR, MSI" `BioMassters`_,R,Sentinel-1/2 and Lidar,"CC-BY-4.0",,,256x256, 10, "SAR, MSI" +`CaBuAr`_,CD,Sentinel-2,"OpenRAIL",424,2,512x512,20,MSI `ChaBuD`_,CD,Sentinel-2,"OpenRAIL",356,2,512x512,10,MSI `Cloud Cover Detection`_,S,Sentinel-2,"CC-BY-4.0","22,728",2,512x512,10,MSI `COWC`_,"C, R","CSUAV AFRL, ISPRS, LINZ, AGRC","AGPL-3.0-only","388,435",2,256x256,0.15,RGB diff --git a/tests/conf/cabuar.yaml b/tests/conf/cabuar.yaml new file mode 100644 index 000000000..42705a945 --- /dev/null +++ b/tests/conf/cabuar.yaml @@ -0,0 +1,16 @@ +model: + class_path: SemanticSegmentationTask + init_args: + loss: "ce" + model: "unet" + backbone: "resnet18" + in_channels: 24 + num_classes: 2 + num_filters: 1 + ignore_index: null +data: + class_path: CaBuArDataModule + init_args: + batch_size: 2 + dict_kwargs: + root: "tests/data/cabuar" diff --git a/tests/data/cabuar/512x512.hdf5 b/tests/data/cabuar/512x512.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..5d8f16529bbe71c76d09eb1776d1df7c19dbd0f2 GIT binary patch literal 430544 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 A{r~^~ literal 0 HcmV?d00001 diff --git a/tests/data/cabuar/chabud_test.h5 b/tests/data/cabuar/chabud_test.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5408b9d27fc29f261e887b2f5882146353e52efd GIT binary patch literal 235520 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�(hn5!bpv0XUUo*y)wlcsY3Tdt??oK0#6G=46Q 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 literal 0 HcmV?d00001 diff --git a/tests/data/cabuar/data.py b/tests/data/cabuar/data.py new file mode 100644 index 000000000..9be447d81 --- /dev/null +++ b/tests/data/cabuar/data.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import hashlib +import os +import random + +import h5py +import numpy as np + +# Sentinel-2 is 12-bit with range 0-4095 +SENTINEL2_MAX = 4096 + +NUM_CHANNELS = 12 +NUM_CLASSES = 2 +SIZE = 32 + +np.random.seed(0) +random.seed(0) + +filenames = ['512x512.hdf5', 'chabud_test.h5'] +fold_mapping = {'train': [1, 2, 3, 4], 'val': [0], 'test': ['chabud']} + +uris = [ + 'feb08801-64b1-4d11-a3fc-0efaad1f4274_0', + 'e4d4dbcb-dd92-40cf-a7fe-fda8dd35f367_1', + '9fc8c1f4-1858-47c3-953e-1dc8b179a', + '3a1358a2-6155-445a-a269-13bebd9741a8_0', + '2f8e659c-f457-4527-a57f-bffc3bbe0baa_0', + '299ee670-19b1-4a76-bef3-34fd55580711_1', + '05cfef86-3e27-42be-a0cb-a61fe2f89e40_0', + '0328d12a-4ad8-4504-8ac5-70089db10b4e_1', + '04800581-b540-4f9b-9df8-7ee433e83f46_0', + '108ae2a9-d7d6-42f7-b89a-90bb75c23ccb_0', + '29413474-04b8-4bb1-8b89-fd640023d4a6_0', + '43f2e60a-73b4-4f33-b99e-319d892fcab4_0', +] +folds = random.choices(fold_mapping['train'], k=4) + [0] * 4 + ['chabud'] * 4 +files = ['512x512.hdf5'] * 8 + ['chabud_test.h5'] * 4 + +# Remove old data +for filename in filenames: + if os.path.exists(filename): + os.remove(filename) + +# Create dataset file +data = np.random.randint( + SENTINEL2_MAX, size=(SIZE, SIZE, NUM_CHANNELS), dtype=np.uint16 +) +gt = np.random.randint(NUM_CLASSES, size=(SIZE, SIZE, 1), dtype=np.uint16) + +for filename, uri, fold in zip(files, uris, folds): + with h5py.File(filename, 'a') as f: + sample = f.create_group(uri) + sample.attrs.create( + name='fold', data=np.int64(fold) if fold != 'chabud' else fold + ) + sample.create_dataset + sample.create_dataset('pre_fire', data=data) + sample.create_dataset('post_fire', data=data) + sample.create_dataset('mask', data=gt) + +# Compute checksums +for filename in filenames: + with open(filename, 'rb') as f: + md5 = hashlib.md5(f.read()).hexdigest() + print(f'{filename} md5: {md5}') diff --git a/tests/datasets/test_cabuar.py b/tests/datasets/test_cabuar.py new file mode 100644 index 000000000..967f43ee4 --- /dev/null +++ b/tests/datasets/test_cabuar.py @@ -0,0 +1,92 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +from itertools import product +from pathlib import Path + +import matplotlib.pyplot as plt +import pytest +import torch +import torch.nn as nn +from _pytest.fixtures import SubRequest +from pytest import MonkeyPatch + +from torchgeo.datasets import CaBuAr, DatasetNotFoundError + +pytest.importorskip('h5py', minversion='3.6') + + +class TestCaBuAr: + @pytest.fixture( + params=product([CaBuAr.all_bands, CaBuAr.rgb_bands], ['train', 'val', 'test']) + ) + def dataset( + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest + ) -> CaBuAr: + data_dir = os.path.join('tests', 'data', 'cabuar') + urls = ( + os.path.join(data_dir, '512x512.hdf5'), + os.path.join(data_dir, 'chabud_test.h5'), + ) + monkeypatch.setattr(CaBuAr, 'urls', urls) + bands, split = request.param + root = tmp_path + transforms = nn.Identity() + return CaBuAr( + root=root, + split=split, + bands=bands, + transforms=transforms, + download=True, + checksum=True, + ) + + def test_getitem(self, dataset: CaBuAr) -> None: + x = dataset[0] + assert isinstance(x, dict) + assert isinstance(x['image'], torch.Tensor) + assert isinstance(x['mask'], torch.Tensor) + + # Image tests + assert x['image'].ndim == 3 + + if dataset.bands == CaBuAr.rgb_bands: + assert x['image'].shape[0] == 2 * 3 + elif dataset.bands == CaBuAr.all_bands: + assert x['image'].shape[0] == 2 * 12 + + # Mask tests: + assert x['mask'].ndim == 2 + + def test_len(self, dataset: CaBuAr) -> None: + assert len(dataset) == 4 + + def test_already_downloaded(self, dataset: CaBuAr) -> None: + CaBuAr(root=dataset.root, download=True) + + def test_not_downloaded(self, tmp_path: Path) -> None: + with pytest.raises(DatasetNotFoundError, match='Dataset not found'): + CaBuAr(tmp_path) + + def test_invalid_bands(self) -> None: + with pytest.raises(AssertionError): + CaBuAr(bands=('OK', 'BK')) + + def test_plot(self, dataset: CaBuAr) -> None: + dataset.plot(dataset[0], suptitle='Test') + plt.close() + + sample = dataset[0] + sample['prediction'] = sample['mask'].clone() + dataset.plot(sample, suptitle='prediction') + plt.close() + + def test_plot_rgb(self, dataset: CaBuAr) -> None: + dataset = CaBuAr(root=dataset.root, bands=('B02',)) + with pytest.raises(ValueError, match="doesn't contain some of the RGB bands"): + dataset.plot(dataset[0], suptitle='Single Band') + + def test_invalid_split(self, dataset: CaBuAr) -> None: + with pytest.raises(AssertionError): + CaBuAr(dataset.root, split='foo') diff --git a/tests/trainers/test_segmentation.py b/tests/trainers/test_segmentation.py index 2b9286d66..c6ad7ae33 100644 --- a/tests/trainers/test_segmentation.py +++ b/tests/trainers/test_segmentation.py @@ -50,6 +50,7 @@ class TestSemanticSegmentationTask: 'name', [ 'agrifieldnet', + 'cabuar', 'chabud', 'chesapeake_cvpr_5', 'chesapeake_cvpr_7', @@ -83,7 +84,7 @@ class TestSemanticSegmentationTask: self, monkeypatch: MonkeyPatch, name: str, fast_dev_run: bool ) -> None: match name: - case 'chabud': + case 'chabud' | 'cabuar': pytest.importorskip('h5py', minversion='3.6') case 'landcoverai': sha256 = ( diff --git a/torchgeo/datamodules/__init__.py b/torchgeo/datamodules/__init__.py index 6eb8b9254..c6bd6fc0a 100644 --- a/torchgeo/datamodules/__init__.py +++ b/torchgeo/datamodules/__init__.py @@ -5,6 +5,7 @@ from .agrifieldnet import AgriFieldNetDataModule from .bigearthnet import BigEarthNetDataModule +from .cabuar import CaBuArDataModule from .chabud import ChaBuDDataModule from .chesapeake import ChesapeakeCVPRDataModule from .cowc import COWCCountingDataModule @@ -65,6 +66,7 @@ __all__ = ( 'SouthAfricaCropTypeDataModule', # NonGeoDataset 'BigEarthNetDataModule', + 'CaBuArDataModule', 'ChaBuDDataModule', 'COWCCountingDataModule', 'DeepGlobeLandCoverDataModule', diff --git a/torchgeo/datamodules/cabuar.py b/torchgeo/datamodules/cabuar.py new file mode 100644 index 000000000..2ce459bce --- /dev/null +++ b/torchgeo/datamodules/cabuar.py @@ -0,0 +1,67 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +"""CaBuAr datamodule.""" + +from typing import Any + +import torch +from einops import repeat + +from ..datasets import CaBuAr +from .geo import NonGeoDataModule + + +class CaBuArDataModule(NonGeoDataModule): + """LightningDataModule implementation for the CaBuAr dataset. + + Uses the train/val/test splits from the dataset + + .. versionadded:: 0.6 + """ + + # min/max values computed on train set using 2/98 percentiles + min = torch.tensor( + [0.0, 1.0, 73.0, 39.0, 46.0, 25.0, 26.0, 21.0, 17.0, 1.0, 20.0, 21.0] + ) + max = torch.tensor( + [ + 1926.0, + 2174.0, + 2527.0, + 2950.0, + 3237.0, + 3717.0, + 4087.0, + 4271.0, + 4290.0, + 4219.0, + 4568.0, + 3753.0, + ] + ) + + def __init__( + self, batch_size: int = 64, num_workers: int = 0, **kwargs: Any + ) -> None: + """Initialize a new CaBuArDataModule instance. + + Args: + batch_size: Size of each mini-batch. + num_workers: Number of workers for parallel data loading. + **kwargs: Additional keyword arguments passed to + :class:`~torchgeo.datasets.CaBuAr`. + """ + bands = kwargs.get('bands', CaBuAr.all_bands) + band_indices = [CaBuAr.all_bands.index(b) for b in bands] + mins = self.min[band_indices] + maxs = self.max[band_indices] + + # Change detection, 2 images from different times + mins = repeat(mins, 'c -> (t c)', t=2) + maxs = repeat(maxs, 'c -> (t c)', t=2) + + self.mean = mins + self.std = maxs - mins + + super().__init__(CaBuAr, batch_size, num_workers, **kwargs) diff --git a/torchgeo/datasets/__init__.py b/torchgeo/datasets/__init__.py index 9cb3e6c96..0510dd9aa 100644 --- a/torchgeo/datasets/__init__.py +++ b/torchgeo/datasets/__init__.py @@ -11,6 +11,7 @@ from .astergdem import AsterGDEM from .benin_cashews import BeninSmallHolderCashews from .bigearthnet import BigEarthNet from .biomassters import BioMassters +from .cabuar import CaBuAr from .cbf import CanadianBuildingFootprints from .cdl import CDL from .chabud import ChaBuD @@ -199,6 +200,7 @@ __all__ = ( 'BeninSmallHolderCashews', 'BigEarthNet', 'BioMassters', + 'CaBuAr', 'ChaBuD', 'CloudCoverDetection', 'COWC', diff --git a/torchgeo/datasets/cabuar.py b/torchgeo/datasets/cabuar.py new file mode 100644 index 000000000..69ca818a7 --- /dev/null +++ b/torchgeo/datasets/cabuar.py @@ -0,0 +1,303 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +"""CaBuAr dataset.""" + +import os +from collections.abc import Callable +from typing import ClassVar + +import matplotlib.pyplot as plt +import numpy as np +import torch +from matplotlib.figure import Figure +from torch import Tensor + +from .errors import DatasetNotFoundError +from .geo import NonGeoDataset +from .utils import Path, download_url, lazy_import, percentile_normalization + + +class CaBuAr(NonGeoDataset): + """CaBuAr dataset. + + `CaBuAr `__ + is a dataset for Change detection for Burned area Delineation and part of + the splits are used for the ChaBuD ECML-PKDD 2023 Discovery Challenge. + + Dataset features: + + * Sentinel-2 multispectral imagery + * binary masks of burned areas + * 12 multispectral bands + * 424 pairs of pre and post images with 20 m per pixel resolution (512x512 px) + + Dataset format: + + * single hdf5 dataset containing images and masks + + Dataset classes: + + 0. no change + 1. burned area + + If you use this dataset in your research, please cite the following paper: + + * https://doi.org/10.1109/MGRS.2023.3292467 + + .. note:: + + This dataset requires the following additional library to be installed: + + * `h5py `_ to load the dataset + + .. versionadded:: 0.6 + """ + + all_bands = ( + 'B01', + 'B02', + 'B03', + 'B04', + 'B05', + 'B06', + 'B07', + 'B08', + 'B8A', + 'B09', + 'B11', + 'B12', + ) + rgb_bands = ('B04', 'B03', 'B02') + folds: ClassVar[dict[str, list[object]]] = { + 'train': [1, 2, 3, 4], + 'val': [0], + 'test': ['chabud'], + } + urls = ( + 'https://huggingface.co/datasets/DarthReca/california_burned_areas/resolve/main/raw/patched/512x512.hdf5', + 'https://huggingface.co/datasets/DarthReca/california_burned_areas/resolve/main/raw/patched/chabud_test.h5', + ) + filenames = ('512x512.hdf5', 'chabud_test.h5') + md5s = ('15d78fb825f9a81dad600db828d22c08', 'a70bb7e4a2788657c2354c4c3d9296fe') + + def __init__( + self, + root: Path = 'data', + split: str = 'train', + bands: tuple[str, ...] = all_bands, + transforms: Callable[[dict[str, Tensor]], dict[str, Tensor]] | None = None, + download: bool = False, + checksum: bool = False, + ) -> None: + """Initialize a new CaBuAr dataset instance. + + Args: + root: root directory where dataset can be found + split: one of "train", "val", "test" + bands: the subset of bands to load + transforms: a function/transform that takes input sample and its target as + entry and returns a transformed version + download: if True, download dataset and store it in the root directory + checksum: if True, check the MD5 of the downloaded files (may be slow) + + Raises: + AssertionError: If ``split`` or ``bands`` arguments are invalid. + DatasetNotFoundError: If dataset is not found and *download* is False. + DependencyNotFoundError: If h5py is not installed. + """ + lazy_import('h5py') + + assert split in self.folds + assert set(bands) <= set(self.all_bands) + + # Set the file index based on the split + file_index = 1 if split == 'test' else 0 + + self.root = root + self.split = split + self.bands = bands + self.transforms = transforms + self.download = download + self.checksum = checksum + self.filepath = os.path.join(root, self.filenames[file_index]) + self.band_indices = [self.all_bands.index(b) for b in bands] + + self._verify() + + self.uuids = self._load_uuids() + + def __getitem__(self, index: int) -> dict[str, Tensor]: + """Return an index within the dataset. + + Args: + index: index to return + + Returns: + sample containing image and mask + """ + image = self._load_image(index) + mask = self._load_target(index) + + sample = {'image': image, 'mask': mask} + + if self.transforms is not None: + sample = self.transforms(sample) + + return sample + + def __len__(self) -> int: + """Return the number of data points in the dataset. + + Returns: + length of the dataset + """ + return len(self.uuids) + + def _load_uuids(self) -> list[str]: + """Return the image uuids for the given split. + + Returns: + the image uuids + """ + h5py = lazy_import('h5py') + uuids = [] + with h5py.File(self.filepath, 'r') as f: + for k, v in f.items(): + if v.attrs['fold'] in self.folds[self.split] and 'pre_fire' in v.keys(): + uuids.append(k) + return sorted(uuids) + + def _load_image(self, index: int) -> Tensor: + """Load a single image. + + Args: + index: index to return + + Returns: + the image + """ + h5py = lazy_import('h5py') + uuid = self.uuids[index] + with h5py.File(self.filepath, 'r') as f: + pre_array = f[uuid]['pre_fire'][:] + post_array = f[uuid]['post_fire'][:] + + # index specified bands and concatenate + pre_array = pre_array[..., self.band_indices] + post_array = post_array[..., self.band_indices] + array = np.concatenate([pre_array, post_array], axis=-1).astype(np.float32) + + tensor = torch.from_numpy(array) + # Convert from HxWxC to CxHxW + tensor = tensor.permute((2, 0, 1)) + return tensor + + def _load_target(self, index: int) -> Tensor: + """Load the target mask for a single image. + + Args: + index: index to return + + Returns: + the target mask + """ + h5py = lazy_import('h5py') + uuid = self.uuids[index] + with h5py.File(self.filepath, 'r') as f: + array = f[uuid]['mask'][:].astype(np.int32).squeeze(axis=-1) + + tensor = torch.from_numpy(array) + tensor = tensor.to(torch.long) + return tensor + + def _verify(self) -> None: + """Verify the integrity of the dataset.""" + # Check if the files already exist + exists = [] + for filename in self.filenames: + filepath = os.path.join(self.root, filename) + exists.append(os.path.exists(filepath)) + + if all(exists): + return + + # Check if the user requested to download the dataset + if not self.download: + raise DatasetNotFoundError(self) + + # Download the dataset + self._download() + + def _download(self) -> None: + """Download the dataset.""" + for url, filename, md5 in zip(self.urls, self.filenames, self.md5s): + filepath = os.path.join(self.root, filename) + if not os.path.exists(filepath): + download_url( + url, + self.root, + filename=filename, + md5=md5 if self.checksum else None, + ) + + def plot( + self, + sample: dict[str, Tensor], + show_titles: bool = True, + suptitle: str | None = None, + ) -> Figure: + """Plot a sample from the dataset. + + Args: + sample: a sample returned by :meth:`__getitem__` + show_titles: flag indicating whether to show titles above each panel + suptitle: optional suptitle to use for figure + + Returns: + a matplotlib Figure with the rendered sample + """ + rgb_indices = [] + for band in self.rgb_bands: + if band in self.bands: + rgb_indices.append(self.bands.index(band)) + else: + raise ValueError("Dataset doesn't contain some of the RGB bands") + + mask = sample['mask'].numpy() + image_pre = sample['image'][: len(self.bands)][rgb_indices].numpy() + image_post = sample['image'][len(self.bands) :][rgb_indices].numpy() + image_pre = percentile_normalization(image_pre) + image_post = percentile_normalization(image_post) + + ncols = 3 + + showing_predictions = 'prediction' in sample + if showing_predictions: + prediction = sample['prediction'] + ncols += 1 + + fig, axs = plt.subplots(nrows=1, ncols=ncols, figsize=(10, ncols * 5)) + + axs[0].imshow(np.transpose(image_pre, (1, 2, 0))) + axs[0].axis('off') + axs[1].imshow(np.transpose(image_post, (1, 2, 0))) + axs[1].axis('off') + axs[2].imshow(mask) + axs[2].axis('off') + + if showing_predictions: + axs[3].imshow(prediction) + axs[3].axis('off') + + if show_titles: + axs[0].set_title('Image Pre') + axs[1].set_title('Image Post') + axs[2].set_title('Mask') + if showing_predictions: + axs[3].set_title('Prediction') + + if suptitle is not None: + plt.suptitle(suptitle) + + return fig