From 9489b613722d190f855674aa85cd1907c0e26a5d Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 14 Mar 2022 15:35:37 -0500 Subject: [PATCH 1/2] Remove type ignores for PyTorch (#460) * Remove type ignores for PyTorch * Mypy fixes for pytest MonkeyPatch * Black * Ignore Identity * Generic fixes * Remove unused Generator import * More fixes * Fix remaining mypy errors * More typing cleanups * typing.OrderedDict isn't available until Python 3.7.2+ * Need Python 3.9 to build docs for fancy OrderedDict * Fix Python 3.8 and earlier support * Fix BigEarthNet tests * Fix bug in ETCI 2021 tests * Remove unused flake8 ignore * More robust and well-documented trainer steps * Many functions don't actually use batch_idx * Store cast hparams in trainers --- .readthedocs.yaml | 6 + benchmark.py | 10 +- evaluate.py | 17 +- tests/datamodules/test_chesapeake.py | 13 +- tests/datamodules/test_utils.py | 4 +- tests/datasets/test_advance.py | 24 +-- tests/datasets/test_agb_live_woody_density.py | 11 +- tests/datasets/test_astergdem.py | 2 +- tests/datasets/test_benin_cashews.py | 21 +-- tests/datasets/test_bigearthnet.py | 24 +-- tests/datasets/test_cbf.py | 21 +-- tests/datasets/test_cdl.py | 19 +-- tests/datasets/test_chesapeake.py | 36 ++--- tests/datasets/test_cms_mangrove_canopy.py | 13 +- tests/datasets/test_cowc.py | 35 ++-- tests/datasets/test_cv4a_kenya_crop_type.py | 25 +-- tests/datasets/test_cyclone.py | 24 +-- tests/datasets/test_dfc2022.py | 13 +- tests/datasets/test_enviroatlas.py | 20 +-- tests/datasets/test_esri2020.py | 17 +- tests/datasets/test_etci2021.py | 14 +- tests/datasets/test_eudem.py | 9 +- tests/datasets/test_eurosat.py | 20 +-- tests/datasets/test_fair1m.py | 7 +- tests/datasets/test_geo.py | 10 +- tests/datasets/test_gid15.py | 22 +-- tests/datasets/test_globbiomass.py | 9 +- tests/datasets/test_idtrees.py | 23 +-- tests/datasets/test_inria.py | 9 +- tests/datasets/test_landcoverai.py | 24 +-- tests/datasets/test_landsat.py | 9 +- tests/datasets/test_levircd.py | 16 +- tests/datasets/test_loveda.py | 16 +- tests/datasets/test_naip.py | 9 +- tests/datasets/test_nasa_marine_debris.py | 15 +- tests/datasets/test_nwpu.py | 33 ++-- tests/datasets/test_openbuildings.py | 18 +-- tests/datasets/test_oscd.py | 16 +- tests/datasets/test_patternnet.py | 15 +- tests/datasets/test_potsdam.py | 11 +- tests/datasets/test_resisc45.py | 20 +-- tests/datasets/test_seco.py | 18 +-- tests/datasets/test_sen12ms.py | 9 +- tests/datasets/test_sentinel.py | 2 +- tests/datasets/test_so2sat.py | 18 +-- tests/datasets/test_spacenet.py | 78 +++------ tests/datasets/test_ucmerced.py | 20 +-- tests/datasets/test_usavars.py | 29 ++-- tests/datasets/test_utils.py | 120 ++++---------- tests/datasets/test_vaihingen.py | 11 +- tests/datasets/test_xview2.py | 9 +- tests/datasets/test_zuericrop.py | 24 +-- tests/losses/test_qr.py | 4 +- tests/models/test_rcf.py | 4 +- tests/models/test_resnet.py | 14 +- tests/trainers/test_byol.py | 2 +- tests/trainers/test_classification.py | 20 +-- tests/trainers/test_segmentation.py | 13 +- tests/trainers/test_utils.py | 28 ++-- tests/transforms/test_indices.py | 22 +-- tests/transforms/test_transforms.py | 134 +++++---------- torchgeo/datamodules/bigearthnet.py | 12 +- torchgeo/datamodules/chesapeake.py | 6 +- torchgeo/datamodules/cowc.py | 4 +- torchgeo/datamodules/cyclone.py | 4 +- torchgeo/datamodules/etci2021.py | 12 +- torchgeo/datamodules/eurosat.py | 4 +- torchgeo/datamodules/landcoverai.py | 3 +- torchgeo/datamodules/oscd.py | 16 +- torchgeo/datamodules/resisc45.py | 11 +- torchgeo/datamodules/sen12ms.py | 6 +- torchgeo/datamodules/so2sat.py | 4 +- torchgeo/datamodules/ucmerced.py | 4 +- torchgeo/datamodules/utils.py | 10 +- torchgeo/datasets/advance.py | 6 +- torchgeo/datasets/benin_cashews.py | 19 +-- torchgeo/datasets/bigearthnet.py | 14 +- torchgeo/datasets/chesapeake.py | 6 +- torchgeo/datasets/cowc.py | 4 +- torchgeo/datasets/cv4a_kenya_crop_type.py | 23 ++- torchgeo/datasets/cyclone.py | 2 +- torchgeo/datasets/dfc2022.py | 10 +- torchgeo/datasets/enviroatlas.py | 6 +- torchgeo/datasets/etci2021.py | 19 ++- torchgeo/datasets/eurosat.py | 4 +- torchgeo/datasets/fair1m.py | 38 +++-- torchgeo/datasets/geo.py | 14 +- torchgeo/datasets/gid15.py | 6 +- torchgeo/datasets/globbiomass.py | 2 +- torchgeo/datasets/idtrees.py | 25 +-- torchgeo/datasets/inria.py | 4 +- torchgeo/datasets/landcoverai.py | 4 +- torchgeo/datasets/levircd.py | 8 +- torchgeo/datasets/loveda.py | 6 +- torchgeo/datasets/nasa_marine_debris.py | 4 +- torchgeo/datasets/nwpu.py | 2 +- torchgeo/datasets/openbuildings.py | 6 +- torchgeo/datasets/oscd.py | 10 +- torchgeo/datasets/potsdam.py | 6 +- torchgeo/datasets/seco.py | 8 +- torchgeo/datasets/sen12ms.py | 10 +- torchgeo/datasets/sentinel.py | 2 +- torchgeo/datasets/so2sat.py | 13 +- torchgeo/datasets/spacenet.py | 6 +- torchgeo/datasets/usavars.py | 2 +- torchgeo/datasets/utils.py | 8 +- torchgeo/datasets/vaihingen.py | 6 +- torchgeo/datasets/xview.py | 6 +- torchgeo/datasets/zuericrop.py | 45 +++--- torchgeo/losses/qr.py | 12 +- torchgeo/models/changestar.py | 10 +- torchgeo/models/fcsiam.py | 2 +- torchgeo/models/rcf.py | 23 ++- torchgeo/models/resnet.py | 2 +- torchgeo/trainers/byol.py | 94 +++++------ torchgeo/trainers/classification.py | 152 +++++++++--------- torchgeo/trainers/regression.py | 67 ++++---- torchgeo/trainers/segmentation.py | 95 ++++++----- torchgeo/trainers/utils.py | 19 ++- torchgeo/transforms/indices.py | 8 +- torchgeo/transforms/transforms.py | 6 +- 121 files changed, 842 insertions(+), 1357 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 617e711780a..2c7a4506148 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,6 +4,12 @@ # Required version: 2 +# Set the version of Python +build: + os: ubuntu-20.04 + tools: + python: "3.9" + # Configuration of the Python environment to be used python: install: diff --git a/benchmark.py b/benchmark.py index 2b3465bc3a9..5f8a3686a97 100755 --- a/benchmark.py +++ b/benchmark.py @@ -208,17 +208,15 @@ def main(args: argparse.Namespace) -> None: # Benchmark model model = resnet34() # Change number of input channels to match Landsat - model.conv1 = nn.Conv2d( # type: ignore[attr-defined] + model.conv1 = nn.Conv2d( len(bands), 64, kernel_size=7, stride=2, padding=3, bias=False ) - criterion = nn.CrossEntropyLoss() # type: ignore[attr-defined] + criterion = nn.CrossEntropyLoss() params = model.parameters() optimizer = optim.SGD(params, lr=0.0001) - device = torch.device( # type: ignore[attr-defined] - "cuda" if torch.cuda.is_available() else "cpu", args.device - ) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu", args.device) model = model.to(device) tic = time.time() @@ -227,7 +225,7 @@ def main(args: argparse.Namespace) -> None: num_total_patches += args.batch_size x = torch.rand(args.batch_size, len(bands), args.patch_size, args.patch_size) # y = torch.randint(0, 256, (args.batch_size, args.patch_size, args.patch_size)) - y = torch.randint(0, 256, (args.batch_size,)) # type: ignore[attr-defined] + y = torch.randint(0, 256, (args.batch_size,)) x = x.to(device) y = y.to(device) diff --git a/evaluate.py b/evaluate.py index 392062da430..74dd72b915e 100755 --- a/evaluate.py +++ b/evaluate.py @@ -12,7 +12,7 @@ import pytorch_lightning as pl import torch -from torchmetrics import Accuracy, JaccardIndex, Metric, MetricCollection +from torchmetrics import Accuracy, JaccardIndex, MetricCollection from torchgeo.trainers import ClassificationTask, SemanticSegmentationTask from train import TASK_TO_MODULES_MAPPING @@ -85,8 +85,8 @@ def set_up_parser() -> argparse.ArgumentParser: def run_eval_loop( model: pl.LightningModule, dataloader: Any, - device: torch.device, # type: ignore[name-defined] - metrics: Metric, + device: torch.device, + metrics: MetricCollection, ) -> Any: """Runs a standard test loop over a dataloader and records metrics. @@ -94,10 +94,11 @@ def run_eval_loop( model: the model used for inference dataloader: the dataloader to get samples from device: the device to put data on - metrics: a torchmetrics compatible Metric to score the output from the model + metrics: a torchmetrics compatible metric collection to score the output + from the model Returns: - the result of ``metric.compute()`` + the result of ``metrics.compute()`` """ for batch in dataloader: x = batch["image"].to(device) @@ -158,7 +159,7 @@ def main(args: argparse.Namespace) -> None: "loss": model.hparams["loss"], } elif issubclass(TASK, SemanticSegmentationTask): - val_row: Dict[str, Union[str, float]] = { # type: ignore[no-redef] + val_row = { "split": "val", "segmentation_model": model.hparams["segmentation_model"], "encoder_name": model.hparams["encoder_name"], @@ -167,7 +168,7 @@ def main(args: argparse.Namespace) -> None: "loss": model.hparams["loss"], } - test_row: Dict[str, Union[str, float]] = { # type: ignore[no-redef] + test_row = { "split": "test", "segmentation_model": model.hparams["segmentation_model"], "encoder_name": model.hparams["encoder_name"], @@ -179,7 +180,7 @@ def main(args: argparse.Namespace) -> None: raise ValueError(f"{TASK} is not supported") # Compute metrics - device = torch.device("cuda:%d" % (args.gpu)) # type: ignore[attr-defined] + device = torch.device("cuda:%d" % (args.gpu)) model = model.to(device) if args.task == "etci2021": # Custom metric setup for testing ETCI2021 diff --git a/tests/datamodules/test_chesapeake.py b/tests/datamodules/test_chesapeake.py index 43e79d52e6e..277829d57b9 100644 --- a/tests/datamodules/test_chesapeake.py +++ b/tests/datamodules/test_chesapeake.py @@ -25,17 +25,10 @@ def datamodule(self) -> ChesapeakeCVPRDataModule: def test_nodata_check(self, datamodule: ChesapeakeCVPRDataModule) -> None: nodata_check = datamodule.nodata_check(4) - sample = { - "image": torch.ones(1, 2, 2), # type: ignore[attr-defined] - "mask": torch.ones(2, 2), # type: ignore[attr-defined] - } + sample = {"image": torch.ones(1, 2, 2), "mask": torch.ones(2, 2)} out = nodata_check(sample) - assert torch.equal( # type: ignore[attr-defined] - out["image"], torch.zeros(1, 4, 4) # type: ignore[attr-defined] - ) - assert torch.equal( # type: ignore[attr-defined] - out["mask"], torch.zeros(4, 4) # type: ignore[attr-defined] - ) + assert torch.equal(out["image"], torch.zeros(1, 4, 4)) + assert torch.equal(out["mask"], torch.zeros(4, 4)) def test_invalid_param_config(self) -> None: with pytest.raises(ValueError, match="The pre-generated prior labels"): diff --git a/tests/datamodules/test_utils.py b/tests/datamodules/test_utils.py index e5bc527f6c3..4f2a6d46b73 100644 --- a/tests/datamodules/test_utils.py +++ b/tests/datamodules/test_utils.py @@ -9,8 +9,8 @@ def test_dataset_split() -> None: num_samples = 24 - x = torch.ones(num_samples, 5) # type: ignore[attr-defined] - y = torch.randint(low=0, high=2, size=(num_samples,)) # type: ignore[attr-defined] + x = torch.ones(num_samples, 5) + y = torch.randint(low=0, high=2, size=(num_samples,)) ds = TensorDataset(x, y) # Test only train/val set split diff --git a/tests/datasets/test_advance.py b/tests/datasets/test_advance.py index ff2283c83d3..2eb05cee433 100644 --- a/tests/datasets/test_advance.py +++ b/tests/datasets/test_advance.py @@ -5,7 +5,7 @@ import os import shutil from pathlib import Path -from typing import Any, Generator +from typing import Any import matplotlib.pyplot as plt import pytest @@ -23,28 +23,22 @@ def download_url(url: str, root: str, *args: str) -> None: class TestADVANCE: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> ADVANCE: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> ADVANCE: + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) data_dir = os.path.join("tests", "data", "advance") urls = [ os.path.join(data_dir, "ADVANCE_vision.zip"), os.path.join(data_dir, "ADVANCE_sound.zip"), ] md5s = ["43acacecebecd17a82bc2c1e719fd7e4", "039b7baa47879a8a4e32b9dd8287f6ad"] - monkeypatch.setattr(ADVANCE, "urls", urls) # type: ignore[attr-defined] - monkeypatch.setattr(ADVANCE, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(ADVANCE, "urls", urls) + monkeypatch.setattr(ADVANCE, "md5s", md5s) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return ADVANCE(root, transforms, download=True, checksum=True) @pytest.fixture - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None] - ) -> None: + def mock_missing_module(self, monkeypatch: MonkeyPatch) -> None: import_orig = builtins.__import__ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: @@ -52,9 +46,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) def test_getitem(self, dataset: ADVANCE) -> None: pytest.importorskip("scipy", minversion="0.9.0") diff --git a/tests/datasets/test_agb_live_woody_density.py b/tests/datasets/test_agb_live_woody_density.py index 1a145096ca4..32b45f83c89 100644 --- a/tests/datasets/test_agb_live_woody_density.py +++ b/tests/datasets/test_agb_live_woody_density.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -28,11 +27,11 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestAbovegroundLiveWoodyBiomassDensity: @pytest.fixture def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path + self, monkeypatch: MonkeyPatch, tmp_path: Path ) -> AbovegroundLiveWoodyBiomassDensity: - transforms = nn.Identity() # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] + monkeypatch.setattr( torchgeo.datasets.agb_live_woody_density, "download_url", download_url ) url = os.path.join( @@ -41,9 +40,7 @@ def dataset( "agb_live_woody_density", "Aboveground_Live_Woody_Biomass_Density.geojson", ) - monkeypatch.setattr( # type: ignore[attr-defined] - AbovegroundLiveWoodyBiomassDensity, "url", url - ) + monkeypatch.setattr(AbovegroundLiveWoodyBiomassDensity, "url", url) root = str(tmp_path) return AbovegroundLiveWoodyBiomassDensity( diff --git a/tests/datasets/test_astergdem.py b/tests/datasets/test_astergdem.py index fb437c874d8..eac48bf0265 100644 --- a/tests/datasets/test_astergdem.py +++ b/tests/datasets/test_astergdem.py @@ -20,7 +20,7 @@ def dataset(self, tmp_path: Path) -> AsterGDEM: zipfile = os.path.join("tests", "data", "astergdem", "astergdem.zip") shutil.unpack_archive(zipfile, tmp_path, "zip") root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return AsterGDEM(root, transforms=transforms) def test_datasetmissing(self, tmp_path: Path) -> None: diff --git a/tests/datasets/test_benin_cashews.py b/tests/datasets/test_benin_cashews.py index ea19ad3a378..288922477cd 100644 --- a/tests/datasets/test_benin_cashews.py +++ b/tests/datasets/test_benin_cashews.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -31,25 +30,17 @@ def fetch(dataset_id: str, **kwargs: str) -> Dataset: class TestBeninSmallHolderCashews: @pytest.fixture def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path + self, monkeypatch: MonkeyPatch, tmp_path: Path ) -> BeninSmallHolderCashews: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Dataset, "fetch", fetch - ) + monkeypatch.setattr(radiant_mlhub.Dataset, "fetch", fetch) source_md5 = "255efff0f03bc6322470949a09bc76db" labels_md5 = "ed2195d93ca6822d48eb02bc3e81c127" - monkeypatch.setitem( # type: ignore[attr-defined] - BeninSmallHolderCashews.image_meta, "md5", source_md5 - ) - monkeypatch.setitem( # type: ignore[attr-defined] - BeninSmallHolderCashews.target_meta, "md5", labels_md5 - ) - monkeypatch.setattr( # type: ignore[attr-defined] - BeninSmallHolderCashews, "dates", ("2019_11_05",) - ) + monkeypatch.setitem(BeninSmallHolderCashews.image_meta, "md5", source_md5) + monkeypatch.setitem(BeninSmallHolderCashews.target_meta, "md5", labels_md5) + monkeypatch.setattr(BeninSmallHolderCashews, "dates", ("2019_11_05",)) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] bands = BeninSmallHolderCashews.ALL_BANDS return BeninSmallHolderCashews( diff --git a/tests/datasets/test_bigearthnet.py b/tests/datasets/test_bigearthnet.py index 84307a484a6..ffcd3c61827 100644 --- a/tests/datasets/test_bigearthnet.py +++ b/tests/datasets/test_bigearthnet.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -26,14 +25,9 @@ class TestBigEarthNet: params=zip(["all", "s1", "s2"], [43, 19, 19], ["train", "val", "test"]) ) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> BigEarthNet: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.bigearthnet, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.bigearthnet, "download_url", download_url) data_dir = os.path.join("tests", "data", "bigearthnet") metadata = { "s1": { @@ -66,15 +60,11 @@ def dataset( "md5": "851a6bdda484d47f60e121352dcb1bf5", }, } - monkeypatch.setattr( # type: ignore[attr-defined] - BigEarthNet, "metadata", metadata - ) - monkeypatch.setattr( # type: ignore[attr-defined] - BigEarthNet, "splits_metadata", splits_metadata - ) + monkeypatch.setattr(BigEarthNet, "metadata", metadata) + monkeypatch.setattr(BigEarthNet, "splits_metadata", splits_metadata) bands, num_classes, split = request.param root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return BigEarthNet( root, split, bands, num_classes, transforms, download=True, checksum=True ) @@ -85,8 +75,8 @@ def test_getitem(self, dataset: BigEarthNet) -> None: assert isinstance(x["image"], torch.Tensor) assert isinstance(x["label"], torch.Tensor) assert x["label"].shape == (dataset.num_classes,) - assert x["image"].dtype == torch.int32 # type: ignore[attr-defined] - assert x["label"].dtype == torch.int64 # type: ignore[attr-defined] + assert x["image"].dtype == torch.int32 + assert x["label"].dtype == torch.int64 if dataset.bands == "all": assert x["image"].shape == (14, 120, 120) diff --git a/tests/datasets/test_cbf.py b/tests/datasets/test_cbf.py index d2473b9f487..3189270b2c3 100644 --- a/tests/datasets/test_cbf.py +++ b/tests/datasets/test_cbf.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -29,11 +28,9 @@ def download_url(url: str, root: str, *args: str) -> None: class TestCanadianBuildingFootprints: @pytest.fixture def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path + self, monkeypatch: MonkeyPatch, tmp_path: Path ) -> CanadianBuildingFootprints: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) md5s = [ "8a4a0a57367f67c69608d1452e30df13", "1829f4054a9a81bb23871ca797a3895c", @@ -49,18 +46,12 @@ def dataset( "067664d066c4152fb96a5c129cbabadf", "474bc084bc41b124aa4919e7a37a9648", ] - monkeypatch.setattr( # type: ignore[attr-defined] - CanadianBuildingFootprints, "md5s", md5s - ) + monkeypatch.setattr(CanadianBuildingFootprints, "md5s", md5s) url = os.path.join("tests", "data", "cbf") + os.sep - monkeypatch.setattr( # type: ignore[attr-defined] - CanadianBuildingFootprints, "url", url - ) - monkeypatch.setattr( # type: ignore[attr-defined] - plt, "show", lambda *args: None - ) + monkeypatch.setattr(CanadianBuildingFootprints, "url", url) + monkeypatch.setattr(plt, "show", lambda *args: None) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return CanadianBuildingFootprints( root, res=0.1, transforms=transforms, download=True, checksum=True ) diff --git a/tests/datasets/test_cdl.py b/tests/datasets/test_cdl.py index b26410fe79a..248ff894e7d 100644 --- a/tests/datasets/test_cdl.py +++ b/tests/datasets/test_cdl.py @@ -6,7 +6,6 @@ import shutil from datetime import datetime from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -25,25 +24,19 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestCDL: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> CDL: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.cdl, "download_url", download_url - ) + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> CDL: + monkeypatch.setattr(torchgeo.datasets.cdl, "download_url", download_url) md5s = [ (2021, "e929beb9c8e59fa1d7b7f82e64edaae1"), (2020, "e95c2d40ce0c261ed6ee0bd00b49e4b6"), ] - monkeypatch.setattr(CDL, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(CDL, "md5s", md5s) url = os.path.join("tests", "data", "cdl", "{}_30m_cdls.zip") - monkeypatch.setattr(CDL, "url", url) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] - plt, "show", lambda *args: None - ) + monkeypatch.setattr(CDL, "url", url) + monkeypatch.setattr(plt, "show", lambda *args: None) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return CDL(root, transforms=transforms, download=True, checksum=True) def test_getitem(self, dataset: CDL) -> None: diff --git a/tests/datasets/test_chesapeake.py b/tests/datasets/test_chesapeake.py index 374dfb40e8f..cfa569e5aaa 100644 --- a/tests/datasets/test_chesapeake.py +++ b/tests/datasets/test_chesapeake.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -30,24 +29,18 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestChesapeake13: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> Chesapeake13: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> Chesapeake13: pytest.importorskip("zipfile_deflate64") - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.chesapeake, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.chesapeake, "download_url", download_url) md5 = "fe35a615b8e749b21270472aa98bb42c" - monkeypatch.setattr(Chesapeake13, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(Chesapeake13, "md5", md5) url = os.path.join( "tests", "data", "chesapeake", "BAYWIDE", "Baywide_13Class_20132014.zip" ) - monkeypatch.setattr(Chesapeake13, "url", url) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] - plt, "show", lambda *args: None - ) + monkeypatch.setattr(Chesapeake13, "url", url) + monkeypatch.setattr(plt, "show", lambda *args: None) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Chesapeake13(root, transforms=transforms, download=True, checksum=True) def test_getitem(self, dataset: Chesapeake13) -> None: @@ -114,15 +107,10 @@ class TestChesapeakeCVPR: ] ) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> ChesapeakeCVPR: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.chesapeake, "download_url", download_url - ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(torchgeo.datasets.chesapeake, "download_url", download_url) + monkeypatch.setattr( ChesapeakeCVPR, "md5s", { @@ -130,7 +118,7 @@ def dataset( "prior_extension": "677446c486f3145787938b14ee3da13f", }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( ChesapeakeCVPR, "urls", { @@ -150,13 +138,13 @@ def dataset( ), }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( ChesapeakeCVPR, "files", ["de_1m_2013_extended-debuffered-test_tiles", "spatial_index.geojson"], ) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return ChesapeakeCVPR( root, splits=["de-test"], diff --git a/tests/datasets/test_cms_mangrove_canopy.py b/tests/datasets/test_cms_mangrove_canopy.py index 1aad9b4206c..4bddc580845 100644 --- a/tests/datasets/test_cms_mangrove_canopy.py +++ b/tests/datasets/test_cms_mangrove_canopy.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -23,20 +22,16 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestCMSGlobalMangroveCanopy: @pytest.fixture def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path + self, monkeypatch: MonkeyPatch, tmp_path: Path ) -> CMSGlobalMangroveCanopy: zipfile = "CMS_Global_Map_Mangrove_Canopy_1665.zip" - monkeypatch.setattr( # type: ignore[attr-defined] - CMSGlobalMangroveCanopy, "zipfile", zipfile - ) + monkeypatch.setattr(CMSGlobalMangroveCanopy, "zipfile", zipfile) md5 = "d6894fa6293cc9c0f3f95a810e842de5" - monkeypatch.setattr( # type: ignore[attr-defined] - CMSGlobalMangroveCanopy, "md5", md5 - ) + monkeypatch.setattr(CMSGlobalMangroveCanopy, "md5", md5) root = os.path.join("tests", "data", "cms_mangrove_canopy") - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] country = "Angola" return CMSGlobalMangroveCanopy( diff --git a/tests/datasets/test_cowc.py b/tests/datasets/test_cowc.py index 87bec26af27..e006108acf3 100644 --- a/tests/datasets/test_cowc.py +++ b/tests/datasets/test_cowc.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -32,18 +31,11 @@ def test_not_implemented(self) -> None: class TestCOWCCounting: @pytest.fixture(params=["train", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> COWC: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) base_url = os.path.join("tests", "data", "cowc_counting") + os.sep - monkeypatch.setattr( # type: ignore[attr-defined] - COWCCounting, "base_url", base_url - ) + monkeypatch.setattr(COWCCounting, "base_url", base_url) md5s = [ "7d0c6d1fb548d3ea3a182a56ce231f97", "2e9a806b19b21f9d796c7393ad8f51ee", @@ -54,10 +46,10 @@ def dataset( "f159e23d52bd0b5656fe296f427b98e1", "0a4daed8c5f6c4e20faa6e38636e4346", ] - monkeypatch.setattr(COWCCounting, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(COWCCounting, "md5s", md5s) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return COWCCounting(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: COWC) -> None: @@ -103,18 +95,11 @@ def test_plot(self, dataset: COWCCounting) -> None: class TestCOWCDetection: @pytest.fixture(params=["train", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> COWC: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) base_url = os.path.join("tests", "data", "cowc_detection") + os.sep - monkeypatch.setattr( # type: ignore[attr-defined] - COWCDetection, "base_url", base_url - ) + monkeypatch.setattr(COWCDetection, "base_url", base_url) md5s = [ "6bbbdb36ee4922e879f66ed9234cb8ab", "09e4af08c6e6553afe5098b328ce9749", @@ -125,10 +110,10 @@ def dataset( "dd315cfb48dfa7ddb8230c942682bc37", "dccc2257e9c4a9dde2b4f84769804046", ] - monkeypatch.setattr(COWCDetection, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(COWCDetection, "md5s", md5s) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return COWCDetection(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: COWC) -> None: diff --git a/tests/datasets/test_cv4a_kenya_crop_type.py b/tests/datasets/test_cv4a_kenya_crop_type.py index fe8f2cf7bc1..636d9507214 100644 --- a/tests/datasets/test_cv4a_kenya_crop_type.py +++ b/tests/datasets/test_cv4a_kenya_crop_type.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -32,29 +31,19 @@ def fetch(dataset_id: str, **kwargs: str) -> Dataset: class TestCV4AKenyaCropType: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> CV4AKenyaCropType: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> CV4AKenyaCropType: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Dataset, "fetch", fetch - ) + monkeypatch.setattr(radiant_mlhub.Dataset, "fetch", fetch) source_md5 = "7f4dcb3f33743dddd73f453176308bfb" labels_md5 = "95fc59f1d94a85ec00931d4d1280bec9" - monkeypatch.setitem( # type: ignore[attr-defined] - CV4AKenyaCropType.image_meta, "md5", source_md5 - ) - monkeypatch.setitem( # type: ignore[attr-defined] - CV4AKenyaCropType.target_meta, "md5", labels_md5 - ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setitem(CV4AKenyaCropType.image_meta, "md5", source_md5) + monkeypatch.setitem(CV4AKenyaCropType.target_meta, "md5", labels_md5) + monkeypatch.setattr( CV4AKenyaCropType, "tile_names", ["ref_african_crops_kenya_02_tile_00"] ) - monkeypatch.setattr( # type: ignore[attr-defined] - CV4AKenyaCropType, "dates", ["20190606"] - ) + monkeypatch.setattr(CV4AKenyaCropType, "dates", ["20190606"]) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return CV4AKenyaCropType( root, transforms=transforms, diff --git a/tests/datasets/test_cyclone.py b/tests/datasets/test_cyclone.py index c9bb803c856..6e93d8cc0d9 100644 --- a/tests/datasets/test_cyclone.py +++ b/tests/datasets/test_cyclone.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -31,15 +30,10 @@ def fetch(collection_id: str, **kwargs: str) -> Dataset: class TestTropicalCycloneWindEstimation: @pytest.fixture(params=["train", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> TropicalCycloneWindEstimation: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Dataset, "fetch", fetch - ) + monkeypatch.setattr(radiant_mlhub.Dataset, "fetch", fetch) md5s = { "train": { "source": "2b818e0a0873728dabf52c7054a0ce4c", @@ -50,15 +44,11 @@ def dataset( "labels": "3ca4243eff39b87c73e05ec8db1824bf", }, } - monkeypatch.setattr( # type: ignore[attr-defined] - TropicalCycloneWindEstimation, "md5s", md5s - ) - monkeypatch.setattr( # type: ignore[attr-defined] - TropicalCycloneWindEstimation, "size", 1 - ) + monkeypatch.setattr(TropicalCycloneWindEstimation, "md5s", md5s) + monkeypatch.setattr(TropicalCycloneWindEstimation, "size", 1) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return TropicalCycloneWindEstimation( root, split, transforms, download=True, api_key="", checksum=True ) @@ -98,8 +88,6 @@ def test_plot(self, dataset: TropicalCycloneWindEstimation) -> None: plt.close() sample = dataset[0] - sample["prediction"] = torch.tensor( # type: ignore[attr-defined] - sample["label"] - ) + sample["prediction"] = torch.tensor(sample["label"]) dataset.plot(sample) plt.close() diff --git a/tests/datasets/test_dfc2022.py b/tests/datasets/test_dfc2022.py index a342a5d517a..88f0b8f3f88 100644 --- a/tests/datasets/test_dfc2022.py +++ b/tests/datasets/test_dfc2022.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,23 +17,21 @@ class TestDFC2022: @pytest.fixture(params=["train", "train-unlabeled", "val"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> DFC2022: - monkeypatch.setitem( # type: ignore[attr-defined] + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> DFC2022: + monkeypatch.setitem( DFC2022.metadata["train"], "md5", "6e380c4fa659d05ca93be71b50cacd90" ) - monkeypatch.setitem( # type: ignore[attr-defined] + monkeypatch.setitem( DFC2022.metadata["train-unlabeled"], "md5", "b2bf3839323d4eae636f198921442945", ) - monkeypatch.setitem( # type: ignore[attr-defined] + monkeypatch.setitem( DFC2022.metadata["val"], "md5", "e018dc6865bd3086738038fff27b818a" ) root = os.path.join("tests", "data", "dfc2022") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return DFC2022(root, split, transforms, checksum=True) def test_getitem(self, dataset: DFC2022) -> None: diff --git a/tests/datasets/test_enviroatlas.py b/tests/datasets/test_enviroatlas.py index 1123f49f8e6..b06d6700ae7 100644 --- a/tests/datasets/test_enviroatlas.py +++ b/tests/datasets/test_enviroatlas.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -37,29 +36,22 @@ class TestEnviroAtlas: ] ) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> EnviroAtlas: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.enviroatlas, "download_url", download_url - ) - monkeypatch.setattr( # type: ignore[attr-defined] - EnviroAtlas, "md5", "071ec65c611e1d4915a5247bffb5ad87" - ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(torchgeo.datasets.enviroatlas, "download_url", download_url) + monkeypatch.setattr(EnviroAtlas, "md5", "071ec65c611e1d4915a5247bffb5ad87") + monkeypatch.setattr( EnviroAtlas, "url", os.path.join("tests", "data", "enviroatlas", "enviroatlas_lotp.zip"), ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( EnviroAtlas, "files", ["pittsburgh_pa-2010_1m-train_tiles-debuffered", "spatial_index.geojson"], ) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return EnviroAtlas( root, layers=request.param[0], diff --git a/tests/datasets/test_esri2020.py b/tests/datasets/test_esri2020.py index 42eed144a95..5dbdb4f594f 100644 --- a/tests/datasets/test_esri2020.py +++ b/tests/datasets/test_esri2020.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -23,26 +22,22 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestEsri2020: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> Esri2020: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.esri2020, "download_url", download_url - ) + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> Esri2020: + monkeypatch.setattr(torchgeo.datasets.esri2020, "download_url", download_url) zipfile = "io-lulc-model-001-v01-composite-v03-supercell-v02-clip-v01.zip" - monkeypatch.setattr(Esri2020, "zipfile", zipfile) # type: ignore[attr-defined] + monkeypatch.setattr(Esri2020, "zipfile", zipfile) md5 = "34aec55538694171c7b605b0cc0d0138" - monkeypatch.setattr(Esri2020, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(Esri2020, "md5", md5) url = os.path.join( "tests", "data", "esri2020", "io-lulc-model-001-v01-composite-v03-supercell-v02-clip-v01.zip", ) - monkeypatch.setattr(Esri2020, "url", url) # type: ignore[attr-defined] + monkeypatch.setattr(Esri2020, "url", url) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Esri2020(root, transforms=transforms, download=True, checksum=True) def test_getitem(self, dataset: Esri2020) -> None: diff --git a/tests/datasets/test_etci2021.py b/tests/datasets/test_etci2021.py index 232fcd88976..b7eb34faafe 100644 --- a/tests/datasets/test_etci2021.py +++ b/tests/datasets/test_etci2021.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -24,14 +23,9 @@ def download_url(url: str, root: str, *args: str) -> None: class TestETCI2021: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> ETCI2021: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) data_dir = os.path.join("tests", "data", "etci2021") metadata = { "train": { @@ -53,10 +47,10 @@ def dataset( "url": os.path.join(data_dir, "test_without_ref_labels.zip"), }, } - monkeypatch.setattr(ETCI2021, "metadata", metadata) # type: ignore[attr-defined] # noqa: E501 + monkeypatch.setattr(ETCI2021, "metadata", metadata) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return ETCI2021(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: ETCI2021) -> None: diff --git a/tests/datasets/test_eudem.py b/tests/datasets/test_eudem.py index 01b12f30d0c..09f14b545ed 100644 --- a/tests/datasets/test_eudem.py +++ b/tests/datasets/test_eudem.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,16 +17,14 @@ class TestEUDEM: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> EUDEM: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> EUDEM: md5s = {"eu_dem_v11_E30N10.zip": "ef148466c02197a08be169eaad186591"} - monkeypatch.setattr(EUDEM, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(EUDEM, "md5s", md5s) zipfile = os.path.join("tests", "data", "eudem", "eu_dem_v11_E30N10.zip") shutil.copy(zipfile, tmp_path) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return EUDEM(root, transforms=transforms) def test_getitem(self, dataset: EUDEM) -> None: diff --git a/tests/datasets/test_eurosat.py b/tests/datasets/test_eurosat.py index 61fff6112dc..64e67cff7c2 100644 --- a/tests/datasets/test_eurosat.py +++ b/tests/datasets/test_eurosat.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -25,19 +24,14 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestEuroSAT: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> EuroSAT: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.eurosat, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.eurosat, "download_url", download_url) md5 = "aa051207b0547daba0ac6af57808d68e" - monkeypatch.setattr(EuroSAT, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(EuroSAT, "md5", md5) url = os.path.join("tests", "data", "eurosat", "EuroSATallBands.zip") - monkeypatch.setattr(EuroSAT, "url", url) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(EuroSAT, "url", url) + monkeypatch.setattr( EuroSAT, "split_urls", { @@ -46,7 +40,7 @@ def dataset( "test": os.path.join("tests", "data", "eurosat", "eurosat-test.txt"), }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( EuroSAT, "split_md5s", { @@ -57,7 +51,7 @@ def dataset( ) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return EuroSAT( root=root, split=split, transforms=transforms, download=True, checksum=True ) diff --git a/tests/datasets/test_fair1m.py b/tests/datasets/test_fair1m.py index 3f188ebb6e1..948184c7927 100644 --- a/tests/datasets/test_fair1m.py +++ b/tests/datasets/test_fair1m.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -17,11 +16,11 @@ class TestFAIR1M: @pytest.fixture - def dataset(self, monkeypatch: Generator[MonkeyPatch, None, None]) -> FAIR1M: + def dataset(self, monkeypatch: MonkeyPatch) -> FAIR1M: md5s = ["f278aba757de9079225db42107e09e30", "aca59017207141951b53e91795d8179e"] - monkeypatch.setattr(FAIR1M, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(FAIR1M, "md5s", md5s) root = os.path.join("tests", "data", "fair1m") - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return FAIR1M(root, transforms) def test_getitem(self, dataset: FAIR1M) -> None: diff --git a/tests/datasets/test_geo.py b/tests/datasets/test_geo.py index 2035e852332..f71f8a332f6 100644 --- a/tests/datasets/test_geo.py +++ b/tests/datasets/test_geo.py @@ -147,7 +147,7 @@ class TestRasterDataset: def naip(self, request: SubRequest) -> NAIP: root = os.path.join("tests", "data", "naip") crs = CRS.from_epsg(3005) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] cache = request.param return NAIP(root, crs=crs, transforms=transforms, cache=cache) @@ -155,7 +155,7 @@ def naip(self, request: SubRequest) -> NAIP: def sentinel(self, request: SubRequest) -> Sentinel2: root = os.path.join("tests", "data", "sentinel2") bands = ["B01", "B02", "B03", "B04", "B05", "B06", "B07", "B08", "B09", "B11"] - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] cache = request.param return Sentinel2(root, bands=bands, transforms=transforms, cache=cache) @@ -180,7 +180,7 @@ def test_getitem_uint_dtype(self, custom_dtype_ds: RasterDataset) -> None: x = custom_dtype_ds[custom_dtype_ds.bounds] assert isinstance(x, dict) assert isinstance(x["image"], torch.Tensor) - assert x["image"].dtype == torch.int64 # type: ignore[attr-defined] + assert x["image"].dtype == torch.int64 def test_invalid_query(self, sentinel: Sentinel2) -> None: query = BoundingBox(0, 0, 0, 0, 0, 0) @@ -204,7 +204,7 @@ class TestVectorDataset: @pytest.fixture def dataset(self) -> CanadianBuildingFootprints: root = os.path.join("tests", "data", "cbf") - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return CanadianBuildingFootprints(root, res=0.1, transforms=transforms) def test_getitem(self, dataset: CanadianBuildingFootprints) -> None: @@ -272,7 +272,7 @@ def test_abstract(self) -> None: class TestVisionClassificationDataset: @pytest.fixture(scope="class") def dataset(self, root: str) -> VisionClassificationDataset: - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return VisionClassificationDataset(root, transforms=transforms) @pytest.fixture(scope="class") diff --git a/tests/datasets/test_gid15.py b/tests/datasets/test_gid15.py index 6fcff430d64..575abeeb4a2 100644 --- a/tests/datasets/test_gid15.py +++ b/tests/datasets/test_gid15.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -24,21 +23,16 @@ def download_url(url: str, root: str, *args: str) -> None: class TestGID15: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> GID15: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) md5 = "3d5b1373ef9a3084ec493b9b2056fe07" - monkeypatch.setattr(GID15, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(GID15, "md5", md5) url = os.path.join("tests", "data", "gid15", "gid-15.zip") - monkeypatch.setattr(GID15, "url", url) # type: ignore[attr-defined] + monkeypatch.setattr(GID15, "url", url) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return GID15(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: GID15) -> None: @@ -73,12 +67,10 @@ def test_plot(self, dataset: GID15) -> None: if dataset.split != "test": sample = dataset[0] - sample["prediction"] = torch.clone( # type: ignore[attr-defined] - sample["mask"] - ) + sample["prediction"] = torch.clone(sample["mask"]) dataset.plot(sample, suptitle="Prediction") else: sample = dataset[0] - sample["prediction"] = torch.ones((1, 1)) # type: ignore[attr-defined] + sample["prediction"] = torch.ones((1, 1)) dataset.plot(sample) plt.close() diff --git a/tests/datasets/test_globbiomass.py b/tests/datasets/test_globbiomass.py index f90496ad71c..e49a042c5eb 100644 --- a/tests/datasets/test_globbiomass.py +++ b/tests/datasets/test_globbiomass.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -23,9 +22,7 @@ class TestGlobBiomass: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> GlobBiomass: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> GlobBiomass: shutil.copy( os.path.join("tests", "data", "globbiomass", "N00E020_agb.zip"), tmp_path ) @@ -38,9 +35,9 @@ def dataset( "N00E020_gsv.zip": "e79bf051ac5d659cb21c566c53ce7b98", } - monkeypatch.setattr(GlobBiomass, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(GlobBiomass, "md5s", md5s) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return GlobBiomass(root, transforms=transforms, checksum=True) def test_getitem(self, dataset: GlobBiomass) -> None: diff --git a/tests/datasets/test_idtrees.py b/tests/datasets/test_idtrees.py index 55e26af648d..881732e01b6 100644 --- a/tests/datasets/test_idtrees.py +++ b/tests/datasets/test_idtrees.py @@ -7,7 +7,7 @@ import shutil import sys from pathlib import Path -from typing import Any, Generator +from typing import Any import matplotlib.pyplot as plt import pytest @@ -30,14 +30,9 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestIDTReeS: @pytest.fixture(params=zip(["train", "test", "test"], ["task1", "task1", "task2"])) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> IDTReeS: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.idtrees, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.idtrees, "download_url", download_url) data_dir = os.path.join("tests", "data", "idtrees") metadata = { "train": { @@ -52,15 +47,13 @@ def dataset( }, } split, task = request.param - monkeypatch.setattr(IDTReeS, "metadata", metadata) # type: ignore[attr-defined] + monkeypatch.setattr(IDTReeS, "metadata", metadata) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return IDTReeS(root, split, task, transforms, download=True, checksum=True) @pytest.fixture(params=["pandas", "laspy", "open3d"]) - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> str: + def mock_missing_module(self, monkeypatch: MonkeyPatch, request: SubRequest) -> str: import_orig = builtins.__import__ package = str(request.param) @@ -69,9 +62,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) return package def test_getitem(self, dataset: IDTReeS) -> None: diff --git a/tests/datasets/test_inria.py b/tests/datasets/test_inria.py index 5cb2e8a40f3..676b22e3c79 100644 --- a/tests/datasets/test_inria.py +++ b/tests/datasets/test_inria.py @@ -3,7 +3,6 @@ import os import shutil -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,15 +17,13 @@ class TestInriaAerialImageLabeling: @pytest.fixture(params=["train", "test"]) def dataset( - self, request: SubRequest, monkeypatch: Generator[MonkeyPatch, None, None] + self, request: SubRequest, monkeypatch: MonkeyPatch ) -> InriaAerialImageLabeling: root = os.path.join("tests", "data", "inria") test_md5 = "f23caf363389ef59de55fad11197c161" - monkeypatch.setattr( # type: ignore[attr-defined] - InriaAerialImageLabeling, "md5", test_md5 - ) - transforms = nn.Identity() # type: ignore[attr-defined] + monkeypatch.setattr(InriaAerialImageLabeling, "md5", test_md5) + transforms = nn.Identity() # type: ignore[no-untyped-call] return InriaAerialImageLabeling( root, split=request.param, transforms=transforms, checksum=True ) diff --git a/tests/datasets/test_landcoverai.py b/tests/datasets/test_landcoverai.py index cc248518ce4..51647342ec6 100644 --- a/tests/datasets/test_landcoverai.py +++ b/tests/datasets/test_landcoverai.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -25,23 +24,18 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestLandCoverAI: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> LandCoverAI: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.landcoverai, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.landcoverai, "download_url", download_url) md5 = "46108372402292213789342d58929708" - monkeypatch.setattr(LandCoverAI, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(LandCoverAI, "md5", md5) url = os.path.join("tests", "data", "landcoverai", "landcover.ai.v1.zip") - monkeypatch.setattr(LandCoverAI, "url", url) # type: ignore[attr-defined] + monkeypatch.setattr(LandCoverAI, "url", url) sha256 = "ce84fa0e8d89b461c66fba4e78aa5a860e2871722c4a9ca8c2384eae1521c7c8" - monkeypatch.setattr(LandCoverAI, "sha256", sha256) # type: ignore[attr-defined] + monkeypatch.setattr(LandCoverAI, "sha256", sha256) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return LandCoverAI(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: LandCoverAI) -> None: @@ -61,11 +55,9 @@ def test_add(self, dataset: LandCoverAI) -> None: def test_already_extracted(self, dataset: LandCoverAI) -> None: LandCoverAI(root=dataset.root, download=True) - def test_already_downloaded( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> None: + def test_already_downloaded(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> None: sha256 = "ce84fa0e8d89b461c66fba4e78aa5a860e2871722c4a9ca8c2384eae1521c7c8" - monkeypatch.setattr(LandCoverAI, "sha256", sha256) # type: ignore[attr-defined] + monkeypatch.setattr(LandCoverAI, "sha256", sha256) url = os.path.join("tests", "data", "landcoverai", "landcover.ai.v1.zip") root = str(tmp_path) shutil.copy(url, root) diff --git a/tests/datasets/test_landsat.py b/tests/datasets/test_landsat.py index 245995ad0a9..f3f32391e84 100644 --- a/tests/datasets/test_landsat.py +++ b/tests/datasets/test_landsat.py @@ -3,7 +3,6 @@ import os from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -17,13 +16,11 @@ class TestLandsat8: @pytest.fixture - def dataset(self, monkeypatch: Generator[MonkeyPatch, None, None]) -> Landsat8: - monkeypatch.setattr( # type: ignore[attr-defined] - plt, "show", lambda *args: None - ) + def dataset(self, monkeypatch: MonkeyPatch) -> Landsat8: + monkeypatch.setattr(plt, "show", lambda *args: None) root = os.path.join("tests", "data", "landsat8") bands = ["B1", "B2", "B3", "B4", "B5", "B6", "B7"] - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Landsat8(root, bands=bands, transforms=transforms) def test_separate_files(self, dataset: Landsat8) -> None: diff --git a/tests/datasets/test_levircd.py b/tests/datasets/test_levircd.py index f61bc241be8..4dbdb868beb 100644 --- a/tests/datasets/test_levircd.py +++ b/tests/datasets/test_levircd.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -24,21 +23,16 @@ def download_url(url: str, root: str, *args: str) -> None: class TestLEVIRCDPlus: @pytest.fixture(params=["train", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> LEVIRCDPlus: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) md5 = "1adf156f628aa32fb2e8fe6cada16c04" - monkeypatch.setattr(LEVIRCDPlus, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(LEVIRCDPlus, "md5", md5) url = os.path.join("tests", "data", "levircd", "LEVIR-CD+.zip") - monkeypatch.setattr(LEVIRCDPlus, "url", url) # type: ignore[attr-defined] + monkeypatch.setattr(LEVIRCDPlus, "url", url) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return LEVIRCDPlus(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: LEVIRCDPlus) -> None: diff --git a/tests/datasets/test_loveda.py b/tests/datasets/test_loveda.py index e445ae9d3d4..5d1b8165ec7 100644 --- a/tests/datasets/test_loveda.py +++ b/tests/datasets/test_loveda.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -24,14 +23,9 @@ def download_url(url: str, root: str, *args: str) -> None: class TestLoveDA: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> LoveDA: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) md5 = "3d5b1373ef9a3084ec493b9b2056fe07" info_dict = { @@ -52,13 +46,11 @@ def dataset( }, } - monkeypatch.setattr( # type: ignore[attr-defined] - LoveDA, "info_dict", info_dict - ) + monkeypatch.setattr(LoveDA, "info_dict", info_dict) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return LoveDA( root=root, split=split, transforms=transforms, download=True, checksum=True ) diff --git a/tests/datasets/test_naip.py b/tests/datasets/test_naip.py index 2089d09ac45..be8fc3c6f91 100644 --- a/tests/datasets/test_naip.py +++ b/tests/datasets/test_naip.py @@ -3,7 +3,6 @@ import os from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -17,12 +16,10 @@ class TestNAIP: @pytest.fixture - def dataset(self, monkeypatch: Generator[MonkeyPatch, None, None]) -> NAIP: - monkeypatch.setattr( # type: ignore[attr-defined] - plt, "show", lambda *args: None - ) + def dataset(self, monkeypatch: MonkeyPatch) -> NAIP: + monkeypatch.setattr(plt, "show", lambda *args: None) root = os.path.join("tests", "data", "naip") - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return NAIP(root, transforms=transforms) def test_getitem(self, dataset: NAIP) -> None: diff --git a/tests/datasets/test_nasa_marine_debris.py b/tests/datasets/test_nasa_marine_debris.py index deb8366ddfd..5d9fe07f779 100644 --- a/tests/datasets/test_nasa_marine_debris.py +++ b/tests/datasets/test_nasa_marine_debris.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -29,19 +28,13 @@ def fetch(dataset_id: str, **kwargs: str) -> Dataset: class TestNASAMarineDebris: @pytest.fixture() - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> NASAMarineDebris: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> NASAMarineDebris: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Dataset, "fetch", fetch - ) + monkeypatch.setattr(radiant_mlhub.Dataset, "fetch", fetch) md5s = ["fe8698d1e68b3f24f0b86b04419a797d", "d8084f5a72778349e07ac90ec1e1d990"] - monkeypatch.setattr( # type: ignore[attr-defined] - NASAMarineDebris, "md5s", md5s - ) + monkeypatch.setattr(NASAMarineDebris, "md5s", md5s) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return NASAMarineDebris(root, transforms, download=True, checksum=True) def test_getitem(self, dataset: NASAMarineDebris) -> None: diff --git a/tests/datasets/test_nwpu.py b/tests/datasets/test_nwpu.py index 43c9e260c8f..bff3df91db8 100644 --- a/tests/datasets/test_nwpu.py +++ b/tests/datasets/test_nwpu.py @@ -6,7 +6,7 @@ import shutil import sys from pathlib import Path -from typing import Any, Generator +from typing import Any import pytest import torch @@ -30,35 +30,26 @@ def download_url(url: str, root: str, *args: str) -> None: class TestVHR10: @pytest.fixture(params=["positive", "negative"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> VHR10: pytest.importorskip("rarfile", minversion="3") - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.nwpu, "download_url", download_url - ) - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.nwpu, "download_url", download_url) + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) url = os.path.join("tests", "data", "vhr10", "NWPU VHR-10 dataset.rar") - monkeypatch.setitem(VHR10.image_meta, "url", url) # type: ignore[attr-defined] + monkeypatch.setitem(VHR10.image_meta, "url", url) md5 = "e5c38351bd948479fe35a71136aedbc4" - monkeypatch.setitem(VHR10.image_meta, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setitem(VHR10.image_meta, "md5", md5) url = os.path.join("tests", "data", "vhr10", "annotations.json") - monkeypatch.setitem(VHR10.target_meta, "url", url) # type: ignore[attr-defined] + monkeypatch.setitem(VHR10.target_meta, "url", url) md5 = "16fc6aa597a19179dad84151cc221873" - monkeypatch.setitem(VHR10.target_meta, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setitem(VHR10.target_meta, "md5", md5) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return VHR10(root, split, transforms, download=True, checksum=True) @pytest.fixture - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None] - ) -> None: + def mock_missing_module(self, monkeypatch: MonkeyPatch) -> None: import_orig = builtins.__import__ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: @@ -66,9 +57,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) def test_getitem(self, dataset: VHR10) -> None: x = dataset[0] diff --git a/tests/datasets/test_openbuildings.py b/tests/datasets/test_openbuildings.py index d47d51960ab..5bef2c4c3ee 100644 --- a/tests/datasets/test_openbuildings.py +++ b/tests/datasets/test_openbuildings.py @@ -6,7 +6,7 @@ import os import shutil from pathlib import Path -from typing import Any, Generator +from typing import Any import matplotlib.pyplot as plt import pandas as pd @@ -29,9 +29,7 @@ class TestOpenBuildings: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> OpenBuildings: + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> OpenBuildings: root = str(tmp_path) shutil.copy( @@ -43,14 +41,12 @@ def dataset( md5s = {"000_buildings.csv.gz": "20aeeec9d45a0ce4d772a26e0bcbc25f"} - monkeypatch.setattr(OpenBuildings, "md5s", md5s) # type: ignore[attr-defined] - transforms = nn.Identity() # type: ignore[attr-defined] + monkeypatch.setattr(OpenBuildings, "md5s", md5s) + transforms = nn.Identity() # type: ignore[no-untyped-call] return OpenBuildings(root=root, transforms=transforms) @pytest.fixture(params=["pandas"]) - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> str: + def mock_missing_module(self, monkeypatch: MonkeyPatch, request: SubRequest) -> str: import_orig = builtins.__import__ package = str(request.param) @@ -59,9 +55,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) return package def test_mock_missing_module( diff --git a/tests/datasets/test_oscd.py b/tests/datasets/test_oscd.py index a8e497cbc8d..142a8d44891 100644 --- a/tests/datasets/test_oscd.py +++ b/tests/datasets/test_oscd.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import pytest import torch @@ -26,14 +25,9 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestOSCD: @pytest.fixture(params=zip(["all", "rgb"], ["train", "test"])) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> OSCD: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.oscd, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.oscd, "download_url", download_url) md5s = { "Onera Satellite Change Detection dataset - Images.zip": ( "fb4e3f54c3a31fd3f21f98cad4ddfb74" @@ -45,7 +39,7 @@ def dataset( "ca0ba73ba66d06fa4903e269ef12eb50" ), } - monkeypatch.setattr(OSCD, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(OSCD, "md5s", md5s) urls = { "Onera Satellite Change Detection dataset - Images.zip": os.path.join( "tests", @@ -66,11 +60,11 @@ def dataset( "Onera Satellite Change Detection dataset - Test Labels.zip", ), } - monkeypatch.setattr(OSCD, "urls", urls) # type: ignore[attr-defined] + monkeypatch.setattr(OSCD, "urls", urls) bands, split = request.param root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return OSCD( root, split, bands, transforms=transforms, download=True, checksum=True ) diff --git a/tests/datasets/test_patternnet.py b/tests/datasets/test_patternnet.py index 58f58c61671..7dad399a127 100644 --- a/tests/datasets/test_patternnet.py +++ b/tests/datasets/test_patternnet.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -22,18 +21,14 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestPatternNet: @pytest.fixture(params=["train", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> PatternNet: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.patternnet, "download_url", download_url - ) + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> PatternNet: + monkeypatch.setattr(torchgeo.datasets.patternnet, "download_url", download_url) md5 = "5649754c78219a2c19074ff93666cc61" - monkeypatch.setattr(PatternNet, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(PatternNet, "md5", md5) url = os.path.join("tests", "data", "patternnet", "PatternNet.zip") - monkeypatch.setattr(PatternNet, "url", url) # type: ignore[attr-defined] + monkeypatch.setattr(PatternNet, "url", url) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return PatternNet(root, transforms, download=True, checksum=True) def test_getitem(self, dataset: PatternNet) -> None: diff --git a/tests/datasets/test_potsdam.py b/tests/datasets/test_potsdam.py index 6a298baf359..d5b173acdc7 100644 --- a/tests/datasets/test_potsdam.py +++ b/tests/datasets/test_potsdam.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,19 +17,17 @@ class TestPotsdam2D: @pytest.fixture(params=["train", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> Potsdam2D: + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> Potsdam2D: md5s = ["e47175da529c5844052c7d483b483a30", "0cb795003a01154a72db7efaabbc76ae"] splits = { "train": ["top_potsdam_2_10", "top_potsdam_2_11"], "test": ["top_potsdam_5_15", "top_potsdam_6_15"], } - monkeypatch.setattr(Potsdam2D, "md5s", md5s) # type: ignore[attr-defined] - monkeypatch.setattr(Potsdam2D, "splits", splits) # type: ignore[attr-defined] + monkeypatch.setattr(Potsdam2D, "md5s", md5s) + monkeypatch.setattr(Potsdam2D, "splits", splits) root = os.path.join("tests", "data", "potsdam") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Potsdam2D(root, split, transforms, checksum=True) def test_getitem(self, dataset: Potsdam2D) -> None: diff --git a/tests/datasets/test_resisc45.py b/tests/datasets/test_resisc45.py index c8f4d9157d1..58281500586 100644 --- a/tests/datasets/test_resisc45.py +++ b/tests/datasets/test_resisc45.py @@ -5,7 +5,6 @@ import shutil import sys from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -26,21 +25,16 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestRESISC45: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> RESISC45: pytest.importorskip("rarfile", minversion="3") - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.resisc45, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.resisc45, "download_url", download_url) md5 = "5895dea3757ba88707d52f5521c444d3" - monkeypatch.setattr(RESISC45, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(RESISC45, "md5", md5) url = os.path.join("tests", "data", "resisc45", "NWPU-RESISC45.rar") - monkeypatch.setattr(RESISC45, "url", url) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(RESISC45, "url", url) + monkeypatch.setattr( RESISC45, "split_urls", { @@ -51,7 +45,7 @@ def dataset( "test": os.path.join("tests", "data", "resisc45", "resisc45-test.txt"), }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( RESISC45, "split_md5s", { @@ -62,7 +56,7 @@ def dataset( ) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return RESISC45(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: RESISC45) -> None: diff --git a/tests/datasets/test_seco.py b/tests/datasets/test_seco.py index 585936dfaf4..6443448ddd7 100644 --- a/tests/datasets/test_seco.py +++ b/tests/datasets/test_seco.py @@ -5,7 +5,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -26,15 +25,10 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestSeasonalContrastS2: @pytest.fixture(params=zip(["100k", "1m"], [["B1"], SeasonalContrastS2.ALL_BANDS])) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> SeasonalContrastS2: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.seco, "download_url", download_url - ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(torchgeo.datasets.seco, "download_url", download_url) + monkeypatch.setattr( SeasonalContrastS2, "md5s", { @@ -42,7 +36,7 @@ def dataset( "1m": "3bb3fcf90f5de7d5781ce0cb85fd20af", }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( SeasonalContrastS2, "urls", { @@ -52,7 +46,7 @@ def dataset( ) root = str(tmp_path) version, bands = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SeasonalContrastS2( root, version, bands, transforms, download=True, checksum=True ) @@ -105,5 +99,5 @@ def test_plot(self, dataset: SeasonalContrastS2) -> None: plt.close() with pytest.raises(ValueError, match="doesn't support plotting"): - x["prediction"] = torch.tensor(1) # type: ignore[attr-defined] + x["prediction"] = torch.tensor(1) dataset.plot(x) diff --git a/tests/datasets/test_sen12ms.py b/tests/datasets/test_sen12ms.py index f3f21a6e2c4..a3d95e7cb91 100644 --- a/tests/datasets/test_sen12ms.py +++ b/tests/datasets/test_sen12ms.py @@ -3,7 +3,6 @@ import os from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,9 +17,7 @@ class TestSEN12MS: @pytest.fixture(params=["train", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> SEN12MS: + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> SEN12MS: md5s = [ "b7d9e183a460979e997b443517a78ded", "7131dbb098c832fff84c2b8a0c8f1126", @@ -38,10 +35,10 @@ def dataset( "02d5128ac1fc2bf8762091b4f319762d", ] - monkeypatch.setattr(SEN12MS, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(SEN12MS, "md5s", md5s) root = os.path.join("tests", "data", "sen12ms") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SEN12MS(root, split, transforms=transforms, checksum=True) def test_getitem(self, dataset: SEN12MS) -> None: diff --git a/tests/datasets/test_sentinel.py b/tests/datasets/test_sentinel.py index 3200c0f440f..6a8aa146198 100644 --- a/tests/datasets/test_sentinel.py +++ b/tests/datasets/test_sentinel.py @@ -30,7 +30,7 @@ def dataset(self) -> Sentinel2: "B09", "B11", ] - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Sentinel2(root, bands=bands, transforms=transforms) def test_separate_files(self, dataset: Sentinel2) -> None: diff --git a/tests/datasets/test_so2sat.py b/tests/datasets/test_so2sat.py index 2d464dab9a5..e57644a3628 100644 --- a/tests/datasets/test_so2sat.py +++ b/tests/datasets/test_so2sat.py @@ -4,7 +4,7 @@ import builtins import os from pathlib import Path -from typing import Any, Generator +from typing import Any import matplotlib.pyplot as plt import pytest @@ -20,25 +20,21 @@ class TestSo2Sat: @pytest.fixture(params=["train", "validation", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> So2Sat: + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> So2Sat: md5s = { "train": "82e0f2d51766b89cb905dbaf8275eb5b", "validation": "bf292ae4737c1698b1a3c6f5e742e0e1", "test": "9a3bbe181b038d4e51f122c4be3c569e", } - monkeypatch.setattr(So2Sat, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(So2Sat, "md5s", md5s) root = os.path.join("tests", "data", "so2sat") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return So2Sat(root=root, split=split, transforms=transforms, checksum=True) @pytest.fixture - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None] - ) -> None: + def mock_missing_module(self, monkeypatch: MonkeyPatch) -> None: import_orig = builtins.__import__ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: @@ -46,9 +42,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) def test_getitem(self, dataset: So2Sat) -> None: x = dataset[0] diff --git a/tests/datasets/test_spacenet.py b/tests/datasets/test_spacenet.py index fced334843f..9ceff3afc74 100644 --- a/tests/datasets/test_spacenet.py +++ b/tests/datasets/test_spacenet.py @@ -6,7 +6,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -37,23 +36,16 @@ def fetch_collection(collection_id: str, **kwargs: str) -> Collection: class TestSpaceNet1: @pytest.fixture(params=["rgb", "8band"]) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> SpaceNet1: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) test_md5 = {"sn1_AOI_1_RIO": "829652022c2df4511ee4ae05bc290250"} # Refer https://github.com/python/mypy/issues/1032 - monkeypatch.setattr( # type: ignore[attr-defined] - SpaceNet1, "collection_md5_dict", test_md5 - ) + monkeypatch.setattr(SpaceNet1, "collection_md5_dict", test_md5) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SpaceNet1( root, image=request.param, transforms=transforms, download=True, api_key="" ) @@ -90,15 +82,10 @@ def test_plot(self, dataset: SpaceNet1) -> None: class TestSpaceNet2: @pytest.fixture(params=["PAN", "MS", "PS-MS", "PS-RGB"]) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> SpaceNet2: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) test_md5 = { "sn2_AOI_2_Vegas": "b3236f58604a9d746c4e09b3e487e427", "sn2_AOI_3_Paris": "811e6a26fdeb8be445fed99769fa52c5", @@ -106,11 +93,9 @@ def dataset( "sn2_AOI_5_Khartoum": "435535120414b74165aa87f051c3a2b3", } - monkeypatch.setattr( # type: ignore[attr-defined] - SpaceNet2, "collection_md5_dict", test_md5 - ) + monkeypatch.setattr(SpaceNet2, "collection_md5_dict", test_md5) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SpaceNet2( root, image=request.param, @@ -160,24 +145,17 @@ def test_plot(self, dataset: SpaceNet2) -> None: class TestSpaceNet4: @pytest.fixture(params=["PAN", "MS", "PS-RGBNIR"]) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> SpaceNet4: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) test_md5 = {"sn4_AOI_6_Atlanta": "ea37c2d87e2c3a1d8b2a7c2230080d46"} test_angles = ["nadir", "off-nadir", "very-off-nadir"] - monkeypatch.setattr( # type: ignore[attr-defined] - SpaceNet4, "collection_md5_dict", test_md5 - ) + monkeypatch.setattr(SpaceNet4, "collection_md5_dict", test_md5) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SpaceNet4( root, image=request.param, @@ -232,25 +210,18 @@ class TestSpaceNet5: params=itertools.product(["PAN", "MS", "PS-MS", "PS-RGB"], [False, True]) ) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> SpaceNet5: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) test_md5 = { "sn5_AOI_7_Moscow": "e0d5f41f1b6b0ee7696c15e5ff3141f5", "sn5_AOI_8_Mumbai": "ab898700ee586a137af492b84a08e662", } - monkeypatch.setattr( # type: ignore[attr-defined] - SpaceNet5, "collection_md5_dict", test_md5 - ) + monkeypatch.setattr(SpaceNet5, "collection_md5_dict", test_md5) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SpaceNet5( root, image=request.param[0], @@ -263,7 +234,7 @@ def dataset( def test_getitem(self, dataset: SpaceNet5) -> None: # Iterate over all elements to maximize coverage - samples = [i for i in dataset] # type: ignore[attr-defined] + samples = [dataset[i] for i in range(len(dataset))] x = samples[0] assert isinstance(x, dict) assert isinstance(x["image"], torch.Tensor) @@ -304,26 +275,19 @@ def test_plot(self, dataset: SpaceNet5) -> None: class TestSpaceNet7: @pytest.fixture(params=["train", "test"]) def dataset( - self, - request: SubRequest, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, + self, request: SubRequest, monkeypatch: MonkeyPatch, tmp_path: Path ) -> SpaceNet7: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) test_md5 = { "sn7_train_source": "254fd6b16e350b071137b2658332091f", "sn7_train_labels": "05befe86b037a3af75c7143553033664", "sn7_test_source": "37d98d44a9da39657ed4b7beee22a21e", } - monkeypatch.setattr( # type: ignore[attr-defined] - SpaceNet7, "collection_md5_dict", test_md5 - ) + monkeypatch.setattr(SpaceNet7, "collection_md5_dict", test_md5) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return SpaceNet7( root, split=request.param, transforms=transforms, download=True, api_key="" ) diff --git a/tests/datasets/test_ucmerced.py b/tests/datasets/test_ucmerced.py index 600c2595d4d..cd0d42a9eec 100644 --- a/tests/datasets/test_ucmerced.py +++ b/tests/datasets/test_ucmerced.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -25,19 +24,14 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestUCMerced: @pytest.fixture(params=["train", "val", "test"]) def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> UCMerced: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.ucmerced, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.ucmerced, "download_url", download_url) md5 = "a42ef8779469d196d8f2971ee135f030" - monkeypatch.setattr(UCMerced, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(UCMerced, "md5", md5) url = os.path.join("tests", "data", "ucmerced", "UCMerced_LandUse.zip") - monkeypatch.setattr(UCMerced, "url", url) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(UCMerced, "url", url) + monkeypatch.setattr( UCMerced, "split_urls", { @@ -48,7 +42,7 @@ def dataset( "test": os.path.join("tests", "data", "ucmerced", "uc_merced-test.txt"), }, ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr( UCMerced, "split_md5s", { @@ -59,7 +53,7 @@ def dataset( ) root = str(tmp_path) split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return UCMerced(root, split, transforms, download=True, checksum=True) def test_getitem(self, dataset: UCMerced) -> None: diff --git a/tests/datasets/test_usavars.py b/tests/datasets/test_usavars.py index 5b203d5937d..d43ea794f47 100644 --- a/tests/datasets/test_usavars.py +++ b/tests/datasets/test_usavars.py @@ -5,7 +5,7 @@ import os import shutil from pathlib import Path -from typing import Any, Generator +from typing import Any import pytest import torch @@ -28,21 +28,16 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestUSAVars: @pytest.fixture() def dataset( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - tmp_path: Path, - request: SubRequest, + self, monkeypatch: MonkeyPatch, tmp_path: Path, request: SubRequest ) -> USAVars: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.usavars, "download_url", download_url - ) + monkeypatch.setattr(torchgeo.datasets.usavars, "download_url", download_url) md5 = "b504580a00bdc27097d5421dec50481b" - monkeypatch.setattr(USAVars, "md5", md5) # type: ignore[attr-defined] + monkeypatch.setattr(USAVars, "md5", md5) data_url = os.path.join("tests", "data", "usavars", "uar.zip") - monkeypatch.setattr(USAVars, "data_url", data_url) # type: ignore[attr-defined] + monkeypatch.setattr(USAVars, "data_url", data_url) label_urls = { "elevation": os.path.join("tests", "data", "usavars", "elevation.csv"), @@ -53,12 +48,10 @@ def dataset( "roads": os.path.join("tests", "data", "usavars", "roads.csv"), "housing": os.path.join("tests", "data", "usavars", "housing.csv"), } - monkeypatch.setattr( # type: ignore[attr-defined] - USAVars, "label_urls", label_urls - ) + monkeypatch.setattr(USAVars, "label_urls", label_urls) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return USAVars(root, transforms=transforms, download=True, checksum=True) @@ -103,9 +96,7 @@ def test_not_downloaded(self, tmp_path: Path) -> None: USAVars(str(tmp_path)) @pytest.fixture(params=["pandas"]) - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> str: + def mock_missing_module(self, monkeypatch: MonkeyPatch, request: SubRequest) -> str: import_orig = builtins.__import__ package = str(request.param) @@ -114,9 +105,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) return package def test_mock_missing_module( diff --git a/tests/datasets/test_utils.py b/tests/datasets/test_utils.py index ba8ebc873f9..43b4dff641a 100644 --- a/tests/datasets/test_utils.py +++ b/tests/datasets/test_utils.py @@ -11,7 +11,7 @@ import sys from datetime import datetime from pathlib import Path -from typing import Any, Dict, Generator, List, Tuple +from typing import Any, Dict, List, Tuple import numpy as np import pytest @@ -37,7 +37,7 @@ @pytest.fixture -def mock_missing_module(monkeypatch: Generator[MonkeyPatch, None, None]) -> None: +def mock_missing_module(monkeypatch: MonkeyPatch) -> None: import_orig = builtins.__import__ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: @@ -45,9 +45,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) class Dataset: @@ -127,12 +125,8 @@ def test_unsupported_scheme() -> None: extract_archive("foo.bar") -def test_download_and_extract_archive( - tmp_path: Path, monkeypatch: Generator[MonkeyPatch, None, None] -) -> None: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.utils, "download_url", download_url - ) +def test_download_and_extract_archive(tmp_path: Path, monkeypatch: MonkeyPatch) -> None: + monkeypatch.setattr(torchgeo.datasets.utils, "download_url", download_url) download_and_extract_archive( os.path.join("tests", "data", "landcoverai", "landcover.ai.v1.zip"), str(tmp_path), @@ -140,22 +134,18 @@ def test_download_and_extract_archive( def test_download_radiant_mlhub_dataset( - tmp_path: Path, monkeypatch: Generator[MonkeyPatch, None, None] + tmp_path: Path, monkeypatch: MonkeyPatch ) -> None: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Dataset, "fetch", fetch_dataset - ) + monkeypatch.setattr(radiant_mlhub.Dataset, "fetch", fetch_dataset) download_radiant_mlhub_dataset("", str(tmp_path)) def test_download_radiant_mlhub_collection( - tmp_path: Path, monkeypatch: Generator[MonkeyPatch, None, None] + tmp_path: Path, monkeypatch: MonkeyPatch ) -> None: radiant_mlhub = pytest.importorskip("radiant_mlhub", minversion="0.2.1") - monkeypatch.setattr( # type: ignore[attr-defined] - radiant_mlhub.Collection, "fetch", fetch_collection - ) + monkeypatch.setattr(radiant_mlhub.Collection, "fetch", fetch_collection) download_radiant_mlhub_collection("", str(tmp_path)) @@ -497,49 +487,31 @@ class TestCollateFunctionsMatchingKeys: @pytest.fixture(scope="class") def samples(self) -> List[Dict[str, Any]]: return [ - { - "image": torch.tensor([1, 2, 0]), # type: ignore[attr-defined] - "crs": CRS.from_epsg(2000), - }, - { - "image": torch.tensor([0, 0, 3]), # type: ignore[attr-defined] - "crs": CRS.from_epsg(2001), - }, + {"image": torch.tensor([1, 2, 0]), "crs": CRS.from_epsg(2000)}, + {"image": torch.tensor([0, 0, 3]), "crs": CRS.from_epsg(2001)}, ] def test_stack_unbind_samples(self, samples: List[Dict[str, Any]]) -> None: sample = stack_samples(samples) - assert sample["image"].size() == torch.Size( # type: ignore[attr-defined] - [2, 3] - ) - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], - torch.tensor([[1, 2, 0], [0, 0, 3]]), # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([2, 3]) + assert torch.allclose(sample["image"], torch.tensor([[1, 2, 0], [0, 0, 3]])) assert sample["crs"] == [CRS.from_epsg(2000), CRS.from_epsg(2001)] new_samples = unbind_samples(sample) for i in range(2): - assert torch.allclose( # type: ignore[attr-defined] - samples[i]["image"], new_samples[i]["image"] - ) + assert torch.allclose(samples[i]["image"], new_samples[i]["image"]) assert samples[i]["crs"] == new_samples[i]["crs"] def test_concat_samples(self, samples: List[Dict[str, Any]]) -> None: sample = concat_samples(samples) - assert sample["image"].size() == torch.Size([6]) # type: ignore[attr-defined] - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], - torch.tensor([1, 2, 0, 0, 0, 3]), # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([6]) + assert torch.allclose(sample["image"], torch.tensor([1, 2, 0, 0, 0, 3])) assert sample["crs"] == CRS.from_epsg(2000) def test_merge_samples(self, samples: List[Dict[str, Any]]) -> None: sample = merge_samples(samples) - assert sample["image"].size() == torch.Size([3]) # type: ignore[attr-defined] - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], torch.tensor([1, 2, 3]) # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([3]) + assert torch.allclose(sample["image"], torch.tensor([1, 2, 3])) assert sample["crs"] == CRS.from_epsg(2001) @@ -547,64 +519,40 @@ class TestCollateFunctionsDifferingKeys: @pytest.fixture(scope="class") def samples(self) -> List[Dict[str, Any]]: return [ - { - "image": torch.tensor([1, 2, 0]), # type: ignore[attr-defined] - "crs1": CRS.from_epsg(2000), - }, - { - "mask": torch.tensor([0, 0, 3]), # type: ignore[attr-defined] - "crs2": CRS.from_epsg(2001), - }, + {"image": torch.tensor([1, 2, 0]), "crs1": CRS.from_epsg(2000)}, + {"mask": torch.tensor([0, 0, 3]), "crs2": CRS.from_epsg(2001)}, ] def test_stack_unbind_samples(self, samples: List[Dict[str, Any]]) -> None: sample = stack_samples(samples) - assert sample["image"].size() == torch.Size( # type: ignore[attr-defined] - [1, 3] - ) - assert sample["mask"].size() == torch.Size([1, 3]) # type: ignore[attr-defined] - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], torch.tensor([[1, 2, 0]]) # type: ignore[attr-defined] - ) - assert torch.allclose( # type: ignore[attr-defined] - sample["mask"], torch.tensor([[0, 0, 3]]) # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([1, 3]) + assert sample["mask"].size() == torch.Size([1, 3]) + assert torch.allclose(sample["image"], torch.tensor([[1, 2, 0]])) + assert torch.allclose(sample["mask"], torch.tensor([[0, 0, 3]])) assert sample["crs1"] == [CRS.from_epsg(2000)] assert sample["crs2"] == [CRS.from_epsg(2001)] new_samples = unbind_samples(sample) - assert torch.allclose( # type: ignore[attr-defined] - samples[0]["image"], new_samples[0]["image"] - ) + assert torch.allclose(samples[0]["image"], new_samples[0]["image"]) assert samples[0]["crs1"] == new_samples[0]["crs1"] - assert torch.allclose( # type: ignore[attr-defined] - samples[1]["mask"], new_samples[0]["mask"] - ) + assert torch.allclose(samples[1]["mask"], new_samples[0]["mask"]) assert samples[1]["crs2"] == new_samples[0]["crs2"] def test_concat_samples(self, samples: List[Dict[str, Any]]) -> None: sample = concat_samples(samples) - assert sample["image"].size() == torch.Size([3]) # type: ignore[attr-defined] - assert sample["mask"].size() == torch.Size([3]) # type: ignore[attr-defined] - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], torch.tensor([1, 2, 0]) # type: ignore[attr-defined] - ) - assert torch.allclose( # type: ignore[attr-defined] - sample["mask"], torch.tensor([0, 0, 3]) # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([3]) + assert sample["mask"].size() == torch.Size([3]) + assert torch.allclose(sample["image"], torch.tensor([1, 2, 0])) + assert torch.allclose(sample["mask"], torch.tensor([0, 0, 3])) assert sample["crs1"] == CRS.from_epsg(2000) assert sample["crs2"] == CRS.from_epsg(2001) def test_merge_samples(self, samples: List[Dict[str, Any]]) -> None: sample = merge_samples(samples) - assert sample["image"].size() == torch.Size([3]) # type: ignore[attr-defined] - assert sample["mask"].size() == torch.Size([3]) # type: ignore[attr-defined] - assert torch.allclose( # type: ignore[attr-defined] - sample["image"], torch.tensor([1, 2, 0]) # type: ignore[attr-defined] - ) - assert torch.allclose( # type: ignore[attr-defined] - sample["mask"], torch.tensor([0, 0, 3]) # type: ignore[attr-defined] - ) + assert sample["image"].size() == torch.Size([3]) + assert sample["mask"].size() == torch.Size([3]) + assert torch.allclose(sample["image"], torch.tensor([1, 2, 0])) + assert torch.allclose(sample["mask"], torch.tensor([0, 0, 3])) assert sample["crs1"] == CRS.from_epsg(2000) assert sample["crs2"] == CRS.from_epsg(2001) diff --git a/tests/datasets/test_vaihingen.py b/tests/datasets/test_vaihingen.py index 033017ea0ee..d65b243fc16 100644 --- a/tests/datasets/test_vaihingen.py +++ b/tests/datasets/test_vaihingen.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,19 +17,17 @@ class TestVaihingen2D: @pytest.fixture(params=["train", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> Vaihingen2D: + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> Vaihingen2D: md5s = ["c15fbff78d307e51c73f609c0859afc3", "ec2c0a5149f2371479b38cf8cfbab961"] splits = { "train": ["top_mosaic_09cm_area1.tif", "top_mosaic_09cm_area11.tif"], "test": ["top_mosaic_09cm_area6.tif", "top_mosaic_09cm_area24.tif"], } - monkeypatch.setattr(Vaihingen2D, "md5s", md5s) # type: ignore[attr-defined] - monkeypatch.setattr(Vaihingen2D, "splits", splits) # type: ignore[attr-defined] + monkeypatch.setattr(Vaihingen2D, "md5s", md5s) + monkeypatch.setattr(Vaihingen2D, "splits", splits) root = os.path.join("tests", "data", "vaihingen") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return Vaihingen2D(root, split, transforms, checksum=True) def test_getitem(self, dataset: Vaihingen2D) -> None: diff --git a/tests/datasets/test_xview2.py b/tests/datasets/test_xview2.py index 92e00f4c7fd..7282605d1e5 100644 --- a/tests/datasets/test_xview2.py +++ b/tests/datasets/test_xview2.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path -from typing import Generator import matplotlib.pyplot as plt import pytest @@ -18,10 +17,8 @@ class TestXView2: @pytest.fixture(params=["train", "test"]) - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], request: SubRequest - ) -> XView2: - monkeypatch.setattr( # type: ignore[attr-defined] + def dataset(self, monkeypatch: MonkeyPatch, request: SubRequest) -> XView2: + monkeypatch.setattr( XView2, "metadata", { @@ -39,7 +36,7 @@ def dataset( ) root = os.path.join("tests", "data", "xview2") split = request.param - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return XView2(root, split, transforms, checksum=True) def test_getitem(self, dataset: XView2) -> None: diff --git a/tests/datasets/test_zuericrop.py b/tests/datasets/test_zuericrop.py index 645e5ca936d..ec246ff15fc 100644 --- a/tests/datasets/test_zuericrop.py +++ b/tests/datasets/test_zuericrop.py @@ -5,7 +5,7 @@ import os import shutil from pathlib import Path -from typing import Any, Generator +from typing import Any import matplotlib.pyplot as plt import pytest @@ -25,28 +25,22 @@ def download_url(url: str, root: str, *args: str, **kwargs: str) -> None: class TestZueriCrop: @pytest.fixture - def dataset( - self, monkeypatch: Generator[MonkeyPatch, None, None], tmp_path: Path - ) -> ZueriCrop: - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.datasets.zuericrop, "download_url", download_url - ) + def dataset(self, monkeypatch: MonkeyPatch, tmp_path: Path) -> ZueriCrop: + monkeypatch.setattr(torchgeo.datasets.zuericrop, "download_url", download_url) data_dir = os.path.join("tests", "data", "zuericrop") urls = [ os.path.join(data_dir, "ZueriCrop.hdf5"), os.path.join(data_dir, "labels.csv"), ] md5s = ["1635231df67f3d25f4f1e62c98e221a4", "5118398c7a5bbc246f5f6bb35d8d529b"] - monkeypatch.setattr(ZueriCrop, "urls", urls) # type: ignore[attr-defined] - monkeypatch.setattr(ZueriCrop, "md5s", md5s) # type: ignore[attr-defined] + monkeypatch.setattr(ZueriCrop, "urls", urls) + monkeypatch.setattr(ZueriCrop, "md5s", md5s) root = str(tmp_path) - transforms = nn.Identity() # type: ignore[attr-defined] + transforms = nn.Identity() # type: ignore[no-untyped-call] return ZueriCrop(root=root, transforms=transforms, download=True, checksum=True) @pytest.fixture - def mock_missing_module( - self, monkeypatch: Generator[MonkeyPatch, None, None] - ) -> None: + def mock_missing_module(self, monkeypatch: MonkeyPatch) -> None: import_orig = builtins.__import__ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: @@ -54,9 +48,7 @@ def mocked_import(name: str, *args: Any, **kwargs: Any) -> Any: raise ImportError() return import_orig(name, *args, **kwargs) - monkeypatch.setattr( # type: ignore[attr-defined] - builtins, "__import__", mocked_import - ) + monkeypatch.setattr(builtins, "__import__", mocked_import) def test_getitem(self, dataset: ZueriCrop) -> None: x = dataset[0] diff --git a/tests/losses/test_qr.py b/tests/losses/test_qr.py index ce6ab19254e..bad9d7570f3 100644 --- a/tests/losses/test_qr.py +++ b/tests/losses/test_qr.py @@ -9,12 +9,12 @@ class TestQRLosses: def test_loss_on_prior_simple(self) -> None: probs = torch.rand(2, 4, 10, 10) - log_probs = torch.log(probs) # type: ignore[attr-defined] + log_probs = torch.log(probs) targets = torch.rand(2, 4, 10, 10) QRLoss()(log_probs, targets) def test_loss_on_prior_reversed_kl_simple(self) -> None: probs = torch.rand(2, 4, 10, 10) - log_probs = torch.log(probs) # type: ignore[attr-defined] + log_probs = torch.log(probs) targets = torch.rand(2, 4, 10, 10) RQLoss()(log_probs, targets) diff --git a/tests/models/test_rcf.py b/tests/models/test_rcf.py index 1d682fbd820..870b66bf495 100644 --- a/tests/models/test_rcf.py +++ b/tests/models/test_rcf.py @@ -34,9 +34,9 @@ def test_untrainable(self) -> None: def test_biases(self) -> None: model = RCF(features=24, bias=10) - assert torch.all(model.biases == 10) # type: ignore[attr-defined] + assert torch.all(model.biases == 10) def test_seed(self) -> None: weights1 = RCF(seed=1).weights weights2 = RCF(seed=1).weights - assert torch.allclose(weights1, weights2) # type: ignore[attr-defined] + assert torch.allclose(weights1, weights2) diff --git a/tests/models/test_resnet.py b/tests/models/test_resnet.py index dc0b477cc0b..48e5a132e32 100644 --- a/tests/models/test_resnet.py +++ b/tests/models/test_resnet.py @@ -3,7 +3,7 @@ import os from pathlib import Path -from typing import Any, Generator, Optional +from typing import Any, Optional import pytest import torch @@ -32,7 +32,7 @@ def load_state_dict_from_file( [(resnet50, "sentinel2", "all", 10, 17)], ) def test_resnet( - monkeypatch: Generator[MonkeyPatch, None, None], + monkeypatch: MonkeyPatch, tmp_path: Path, model_class: Module, sensor: str, @@ -49,15 +49,13 @@ def test_resnet( "sentinel2": {"all": {"resnet50": str(tmp_path / "resnet50-sentinel2-2.pt")}} } - monkeypatch.setattr( # type: ignore[attr-defined] - torchgeo.models.resnet, "MODEL_URLS", new_model_urls - ) - monkeypatch.setattr( # type: ignore[attr-defined] + monkeypatch.setattr(torchgeo.models.resnet, "MODEL_URLS", new_model_urls) + monkeypatch.setattr( torchgeo.models.resnet, "load_state_dict_from_url", load_state_dict_from_file ) model = model_class(sensor, bands, pretrained=True) - x = torch.zeros(1, in_channels, 256, 256) # type: ignore[attr-defined] + x = torch.zeros(1, in_channels, 256, 256) y = model(x) assert isinstance(y, torch.Tensor) - assert y.size() == torch.Size([1, 17]) # type: ignore[attr-defined] + assert y.size() == torch.Size([1, 17]) diff --git a/tests/trainers/test_byol.py b/tests/trainers/test_byol.py index 44fec8c766c..17a212194ba 100644 --- a/tests/trainers/test_byol.py +++ b/tests/trainers/test_byol.py @@ -21,7 +21,7 @@ class TestBYOL: def test_custom_augment_fn(self) -> None: encoder = resnet18() layer = encoder.conv1 - new_layer = nn.Conv2d( # type: ignore[attr-defined] + new_layer = nn.Conv2d( in_channels=4, out_channels=layer.out_channels, kernel_size=layer.kernel_size, diff --git a/tests/trainers/test_classification.py b/tests/trainers/test_classification.py index 1ec48e9ae23..048d1594cff 100644 --- a/tests/trainers/test_classification.py +++ b/tests/trainers/test_classification.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. import os -from typing import Any, Dict, Generator, Type, cast +from typing import Any, Dict, Type, cast import pytest import timm @@ -39,10 +39,7 @@ class TestClassificationTask: ], ) def test_trainer( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - name: str, - classname: Type[LightningDataModule], + self, monkeypatch: MonkeyPatch, name: str, classname: Type[LightningDataModule] ) -> None: if name.startswith("so2sat"): pytest.importorskip("h5py") @@ -56,9 +53,7 @@ def test_trainer( datamodule = classname(**datamodule_kwargs) # Instantiate model - monkeypatch.setattr( # type: ignore[attr-defined] - timm, "create_model", create_model - ) + monkeypatch.setattr(timm, "create_model", create_model) model_kwargs = conf_dict["module"] model = ClassificationTask(**model_kwargs) @@ -137,10 +132,7 @@ class TestMultiLabelClassificationTask: ], ) def test_trainer( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - name: str, - classname: Type[LightningDataModule], + self, monkeypatch: MonkeyPatch, name: str, classname: Type[LightningDataModule] ) -> None: conf = OmegaConf.load(os.path.join("tests", "conf", name + ".yaml")) conf_dict = OmegaConf.to_object(conf.experiment) @@ -151,9 +143,7 @@ def test_trainer( datamodule = classname(**datamodule_kwargs) # Instantiate model - monkeypatch.setattr( # type: ignore[attr-defined] - timm, "create_model", create_model - ) + monkeypatch.setattr(timm, "create_model", create_model) model_kwargs = conf_dict["module"] model = MultiLabelClassificationTask(**model_kwargs) diff --git a/tests/trainers/test_segmentation.py b/tests/trainers/test_segmentation.py index 17084a024f4..b40a17caa58 100644 --- a/tests/trainers/test_segmentation.py +++ b/tests/trainers/test_segmentation.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. import os -from typing import Any, Dict, Generator, Type, cast +from typing import Any, Dict, Type, cast import pytest import segmentation_models_pytorch as smp @@ -45,10 +45,7 @@ class TestSemanticSegmentationTask: ], ) def test_trainer( - self, - monkeypatch: Generator[MonkeyPatch, None, None], - name: str, - classname: Type[LightningDataModule], + self, monkeypatch: MonkeyPatch, name: str, classname: Type[LightningDataModule] ) -> None: if name == "naipchesapeake": pytest.importorskip("zipfile_deflate64") @@ -62,10 +59,8 @@ def test_trainer( datamodule = classname(**datamodule_kwargs) # Instantiate model - monkeypatch.setattr(smp, "Unet", create_model) # type: ignore[attr-defined] - monkeypatch.setattr( # type: ignore[attr-defined] - smp, "DeepLabV3Plus", create_model - ) + monkeypatch.setattr(smp, "Unet", create_model) + monkeypatch.setattr(smp, "DeepLabV3Plus", create_model) model_kwargs = conf_dict["module"] model = SemanticSegmentationTask(**model_kwargs) diff --git a/tests/trainers/test_utils.py b/tests/trainers/test_utils.py index e684999629c..33ede32dc5a 100644 --- a/tests/trainers/test_utils.py +++ b/tests/trainers/test_utils.py @@ -22,16 +22,14 @@ def __init__( self, in_chans: int = 3, num_classes: int = 1000, **kwargs: Any ) -> None: super().__init__() - self.conv1 = nn.Conv2d( # type: ignore[attr-defined] - in_channels=in_chans, out_channels=1, kernel_size=1 - ) - self.pool = nn.AdaptiveAvgPool2d((1, 1)) # type: ignore[attr-defined] - self.fc = nn.Linear(1, num_classes) # type: ignore[attr-defined] + self.conv1 = nn.Conv2d(in_channels=in_chans, out_channels=1, kernel_size=1) + self.pool = nn.AdaptiveAvgPool2d((1, 1)) + self.fc = nn.Linear(1, num_classes) def forward(self, x: torch.Tensor) -> torch.Tensor: x = self.conv1(x) x = self.pool(x) - x = torch.flatten(x, 1) # type: ignore[attr-defined] + x = torch.flatten(x, 1) x = self.fc(x) return x @@ -46,7 +44,7 @@ def __init__( self, in_channels: int = 3, classes: int = 1000, **kwargs: Any ) -> None: super().__init__() - self.conv1 = nn.Conv2d( # type: ignore[attr-defined] + self.conv1 = nn.Conv2d( in_channels=in_channels, out_channels=classes, kernel_size=1, padding=0 ) @@ -80,7 +78,7 @@ def test_load_state_dict_unequal_input_channels(checkpoint: str, model: Module) expected_in_channels = state_dict["conv1.weight"].shape[1] in_channels = 7 - model.conv1 = nn.Conv2d( # type: ignore[attr-defined] + model.conv1 = nn.Conv2d( in_channels, out_channels=64, kernel_size=7, stride=1, padding=2, bias=False ) @@ -97,10 +95,8 @@ def test_load_state_dict_unequal_classes(checkpoint: str, model: Module) -> None expected_num_classes = state_dict["fc.weight"].shape[0] num_classes = 10 - in_features = model.fc.in_features # type: ignore[union-attr] - model.fc = nn.Linear( # type: ignore[attr-defined] - in_features, out_features=num_classes - ) + in_features = cast(int, cast(nn.Module, model.fc).in_features) + model.fc = nn.Linear(in_features, out_features=num_classes) warning = ( f"num classes {num_classes} != num classes in pretrained model" @@ -111,17 +107,13 @@ def test_load_state_dict_unequal_classes(checkpoint: str, model: Module) -> None def test_reinit_initial_conv_layer() -> None: - conv_layer = nn.Conv2d( # type: ignore[attr-defined] - 3, 5, kernel_size=3, stride=2, padding=1, bias=True - ) + conv_layer = nn.Conv2d(3, 5, kernel_size=3, stride=2, padding=1, bias=True) initial_weights = conv_layer.weight.data.clone() new_conv_layer = reinit_initial_conv_layer(conv_layer, 4, keep_rgb_weights=True) out_channels, in_channels, k1, k2 = new_conv_layer.weight.shape - assert torch.allclose( # type: ignore[attr-defined] - initial_weights, new_conv_layer.weight.data[:, :3, :, :] - ) + assert torch.allclose(initial_weights, new_conv_layer.weight.data[:, :3, :, :]) assert out_channels == 5 assert in_channels == 4 assert k1 == 3 and k2 == 3 diff --git a/tests/transforms/test_indices.py b/tests/transforms/test_indices.py index 7b6ccc1955a..1518ca68b42 100644 --- a/tests/transforms/test_indices.py +++ b/tests/transforms/test_indices.py @@ -25,29 +25,17 @@ @pytest.fixture def sample() -> Dict[str, Tensor]: return { - "image": torch.tensor( # type: ignore[attr-defined] - [[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[0, 0, 1], [0, 1, 1], [1, 1, 1]], - dtype=torch.long, # type: ignore[attr-defined] - ), + "image": torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], dtype=torch.float), + "mask": torch.tensor([[0, 0, 1], [0, 1, 1], [1, 1, 1]], dtype=torch.long), } @pytest.fixture def batch() -> Dict[str, Tensor]: return { - "image": torch.tensor( # type: ignore[attr-defined] - [[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "image": torch.tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]], dtype=torch.float), + "mask": torch.tensor([[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], dtype=torch.long), + "labels": torch.tensor([[0, 1]]), } diff --git a/tests/transforms/test_transforms.py b/tests/transforms/test_transforms.py index 471e1af42cf..0f38c63bef0 100644 --- a/tests/transforms/test_transforms.py +++ b/tests/transforms/test_transforms.py @@ -18,28 +18,19 @@ @pytest.fixture def batch_gray() -> Dict[str, Tensor]: return { - "image": torch.tensor( # type: ignore[attr-defined] - [[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), + "image": torch.tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]], dtype=torch.float), + "mask": torch.tensor([[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], dtype=torch.long), # This is a list of 4 (y,x) points of the corners of a bounding box. # kornia expects something with (B, 4, 2) shape - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[0, 0], [0, 1], [1, 1], [1, 0]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "boxes": torch.tensor([[[0, 0], [0, 1], [1, 1], [1, 0]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } @pytest.fixture def batch_rgb() -> Dict[str, Tensor]: return { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[1, 2, 3], [4, 5, 6], [7, 8, 9]], @@ -47,24 +38,18 @@ def batch_rgb() -> Dict[str, Tensor]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]], ] ], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[0, 0], [0, 1], [1, 1], [1, 0]]], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[0, 0], [0, 1], [1, 1], [1, 0]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } @pytest.fixture def batch_multispectral() -> Dict[str, Tensor]: return { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[1, 2, 3], [4, 5, 6], [7, 8, 9]], @@ -74,42 +59,27 @@ def batch_multispectral() -> Dict[str, Tensor]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]], ] ], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[0, 0], [0, 1], [1, 1], [1, 0]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[0, 0], [0, 1], [1, 1], [1, 0]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } def assert_matching(output: Dict[str, Tensor], expected: Dict[str, Tensor]) -> None: for key in expected: err = f"output[{key}] != expected[{key}]" - equal = torch.allclose(output[key], expected[key]) # type: ignore[attr-defined] + equal = torch.allclose(output[key], expected[key]) assert equal, err def test_augmentation_sequential_gray(batch_gray: Dict[str, Tensor]) -> None: expected = { - "image": torch.tensor( # type: ignore[attr-defined] - [[[[3, 2, 1], [6, 5, 4], [9, 8, 7]]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[1, 0], [2, 0], [2, 1], [1, 1]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "image": torch.tensor([[[[3, 2, 1], [6, 5, 4], [9, 8, 7]]]], dtype=torch.float), + "mask": torch.tensor([[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[1, 0], [2, 0], [2, 1], [1, 1]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } augs = transforms.AugmentationSequential( K.RandomHorizontalFlip(p=1.0), data_keys=["image", "mask", "boxes"] @@ -120,7 +90,7 @@ def test_augmentation_sequential_gray(batch_gray: Dict[str, Tensor]) -> None: def test_augmentation_sequential_rgb(batch_rgb: Dict[str, Tensor]) -> None: expected = { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[3, 2, 1], [6, 5, 4], [9, 8, 7]], @@ -128,17 +98,11 @@ def test_augmentation_sequential_rgb(batch_rgb: Dict[str, Tensor]) -> None: [[3, 2, 1], [6, 5, 4], [9, 8, 7]], ] ], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[1, 0], [2, 0], [2, 1], [1, 1]]], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[1, 0], [2, 0], [2, 1], [1, 1]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } augs = transforms.AugmentationSequential( K.RandomHorizontalFlip(p=1.0), data_keys=["image", "mask", "boxes"] @@ -151,7 +115,7 @@ def test_augmentation_sequential_multispectral( batch_multispectral: Dict[str, Tensor] ) -> None: expected = { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[3, 2, 1], [6, 5, 4], [9, 8, 7]], @@ -161,17 +125,11 @@ def test_augmentation_sequential_multispectral( [[3, 2, 1], [6, 5, 4], [9, 8, 7]], ] ], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[1, 0], [2, 0], [2, 1], [1, 1]]], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[1, 0], [2, 0], [2, 1], [1, 1]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } augs = transforms.AugmentationSequential( K.RandomHorizontalFlip(p=1.0), data_keys=["image", "mask", "boxes"] @@ -184,7 +142,7 @@ def test_augmentation_sequential_image_only( batch_multispectral: Dict[str, Tensor] ) -> None: expected = { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[3, 2, 1], [6, 5, 4], [9, 8, 7]], @@ -194,17 +152,11 @@ def test_augmentation_sequential_image_only( [[3, 2, 1], [6, 5, 4], [9, 8, 7]], ] ], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[0, 0], [0, 1], [1, 1], [1, 0]]], - dtype=torch.float, # type: ignore[attr-defined] - ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[0, 0, 1], [0, 1, 1], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[0, 0], [0, 1], [1, 1], [1, 0]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } augs = transforms.AugmentationSequential( K.RandomHorizontalFlip(p=1.0), data_keys=["image"] @@ -217,7 +169,7 @@ def test_sequential_transforms_augmentations( batch_multispectral: Dict[str, Tensor] ) -> None: expected = { - "image": torch.tensor( # type: ignore[attr-defined] + "image": torch.tensor( [ [ [[3, 2, 1], [6, 5, 4], [9, 8, 7]], @@ -232,19 +184,13 @@ def test_sequential_transforms_augmentations( [[0, 0, 0], [0, 0, 0], [0, 0, 0]], ] ], - dtype=torch.float, # type: ignore[attr-defined] - ), - "mask": torch.tensor( # type: ignore[attr-defined] - [[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], - dtype=torch.long, # type: ignore[attr-defined] - ), - "boxes": torch.tensor( # type: ignore[attr-defined] - [[[1, 0], [2, 0], [2, 1], [1, 1]]], - dtype=torch.float, # type: ignore[attr-defined] + dtype=torch.float, ), - "labels": torch.tensor([[0, 1]]), # type: ignore[attr-defined] + "mask": torch.tensor([[[[1, 0, 0], [1, 1, 0], [1, 1, 1]]]], dtype=torch.long), + "boxes": torch.tensor([[[1, 0], [2, 0], [2, 1], [1, 1]]], dtype=torch.float), + "labels": torch.tensor([[0, 1]]), } - train_transforms = nn.Sequential( # type: ignore[attr-defined] + train_transforms = nn.Sequential( indices.AppendNBR(index_nir=0, index_swir=0), indices.AppendNDBI(index_swir=0, index_nir=0), indices.AppendNDSI(index_green=0, index_swir=0), diff --git a/torchgeo/datamodules/bigearthnet.py b/torchgeo/datamodules/bigearthnet.py index c1a8c0e9999..aca9834fe81 100644 --- a/torchgeo/datamodules/bigearthnet.py +++ b/torchgeo/datamodules/bigearthnet.py @@ -26,10 +26,10 @@ class BigEarthNetDataModule(pl.LightningDataModule): # (VV, VH, B01, B02, B03, B04, B05, B06, B07, B08, B8A, B09, B11, B12) # min/max band statistics computed on 100k random samples - band_mins_raw = torch.tensor( # type: ignore[attr-defined] + band_mins_raw = torch.tensor( [-70.0, -72.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0] ) - band_maxs_raw = torch.tensor( # type: ignore[attr-defined] + band_maxs_raw = torch.tensor( [ 31.0, 35.0, @@ -50,10 +50,10 @@ class BigEarthNetDataModule(pl.LightningDataModule): # min/max band statistics computed by percentile clipping the # above to samples to [2, 98] - band_mins = torch.tensor( # type: ignore[attr-defined] + band_mins = torch.tensor( [-48.0, -42.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] ) - band_maxs = torch.tensor( # type: ignore[attr-defined] + band_maxs = torch.tensor( [ 6.0, 16.0, @@ -111,9 +111,7 @@ def preprocess(self, sample: Dict[str, Any]) -> Dict[str, Any]: """Transform a single sample from the Dataset.""" sample["image"] = sample["image"].float() sample["image"] = (sample["image"] - self.mins) / (self.maxs - self.mins) - sample["image"] = torch.clip( # type: ignore[attr-defined] - sample["image"], min=0.0, max=1.0 - ) + sample["image"] = torch.clip(sample["image"], min=0.0, max=1.0) return sample def prepare_data(self) -> None: diff --git a/torchgeo/datamodules/chesapeake.py b/torchgeo/datamodules/chesapeake.py index 2f575f048ba..639c8a2f645 100644 --- a/torchgeo/datamodules/chesapeake.py +++ b/torchgeo/datamodules/chesapeake.py @@ -205,10 +205,8 @@ def nodata_check_inner(sample: Dict[str, Tensor]) -> Dict[str, Tensor]: num_channels, height, width = sample["image"].shape if height < size or width < size: - sample["image"] = torch.zeros( # type: ignore[attr-defined] - (num_channels, size, size) - ) - sample["mask"] = torch.zeros((size, size)) # type: ignore[attr-defined] + sample["image"] = torch.zeros((num_channels, size, size)) + sample["mask"] = torch.zeros((size, size)) return sample diff --git a/torchgeo/datamodules/cowc.py b/torchgeo/datamodules/cowc.py index b7c1a740ca2..44743cacec0 100644 --- a/torchgeo/datamodules/cowc.py +++ b/torchgeo/datamodules/cowc.py @@ -7,7 +7,7 @@ import matplotlib.pyplot as plt import pytorch_lightning as pl -from torch import Generator # type: ignore[attr-defined] +from torch import Generator from torch.utils.data import DataLoader, random_split from ..datasets import COWCCounting @@ -128,4 +128,4 @@ def plot(self, *args: Any, **kwargs: Any) -> plt.Figure: .. versionadded:: 0.2 """ - return self.val_dataset.dataset.plot(*args, **kwargs) + return self.test_dataset.plot(*args, **kwargs) diff --git a/torchgeo/datamodules/cyclone.py b/torchgeo/datamodules/cyclone.py index 929628e7c37..85e4e494111 100644 --- a/torchgeo/datamodules/cyclone.py +++ b/torchgeo/datamodules/cyclone.py @@ -64,9 +64,7 @@ def custom_transform(self, sample: Dict[str, Any]) -> Dict[str, Any]: sample["image"] = ( sample["image"].unsqueeze(0).repeat(3, 1, 1) ) # convert to 3 channel - sample["label"] = torch.as_tensor( # type: ignore[attr-defined] - sample["label"] - ).float() + sample["label"] = torch.as_tensor(sample["label"]).float() return sample diff --git a/torchgeo/datamodules/etci2021.py b/torchgeo/datamodules/etci2021.py index 933433f0ceb..7efee68597e 100644 --- a/torchgeo/datamodules/etci2021.py +++ b/torchgeo/datamodules/etci2021.py @@ -8,7 +8,7 @@ import matplotlib.pyplot as plt import pytorch_lightning as pl import torch -from torch import Generator # type: ignore[attr-defined] +from torch import Generator from torch.utils.data import DataLoader, random_split from torchvision.transforms import Normalize @@ -24,11 +24,11 @@ class ETCI2021DataModule(pl.LightningDataModule): .. versionadded:: 0.2 """ - band_means = torch.tensor( # type: ignore[attr-defined] + band_means = torch.tensor( [0.52253931, 0.52253931, 0.52253931, 0.61221701, 0.61221701, 0.61221701, 0] ) - band_stds = torch.tensor( # type: ignore[attr-defined] + band_stds = torch.tensor( [0.35221376, 0.35221376, 0.35221376, 0.37364622, 0.37364622, 0.37364622, 1] ) @@ -72,9 +72,7 @@ def preprocess(self, sample: Dict[str, Any]) -> Dict[str, Any]: flood_mask = sample["mask"][1] flood_mask = (flood_mask > 0).long() - sample["image"] = torch.cat( # type: ignore[attr-defined] - [image, water_mask], dim=0 - ).float() + sample["image"] = torch.cat([image, water_mask], dim=0).float() sample["image"] /= 255.0 sample["image"] = self.norm(sample["image"]) sample["mask"] = flood_mask @@ -153,4 +151,4 @@ def test_dataloader(self) -> DataLoader[Any]: def plot(self, *args: Any, **kwargs: Any) -> plt.Figure: """Run :meth:`torchgeo.datasets.ETCI2021.plot`.""" - return self.val_dataset.plot(*args, **kwargs) + return self.test_dataset.plot(*args, **kwargs) diff --git a/torchgeo/datamodules/eurosat.py b/torchgeo/datamodules/eurosat.py index 8a4281eccc8..2f6d990e8e3 100644 --- a/torchgeo/datamodules/eurosat.py +++ b/torchgeo/datamodules/eurosat.py @@ -22,7 +22,7 @@ class EuroSATDataModule(pl.LightningDataModule): .. versionadded:: 0.2 """ - band_means = torch.tensor( # type: ignore[attr-defined] + band_means = torch.tensor( [ 1354.40546513, 1118.24399958, @@ -40,7 +40,7 @@ class EuroSATDataModule(pl.LightningDataModule): ] ) - band_stds = torch.tensor( # type: ignore[attr-defined] + band_stds = torch.tensor( [ 245.71762908, 333.00778264, diff --git a/torchgeo/datamodules/landcoverai.py b/torchgeo/datamodules/landcoverai.py index df4adc4dbd3..7cc8deb17d2 100644 --- a/torchgeo/datamodules/landcoverai.py +++ b/torchgeo/datamodules/landcoverai.py @@ -52,8 +52,9 @@ def on_after_batch_transfer( """ if ( hasattr(self, "trainer") + and self.trainer is not None and hasattr(self.trainer, "training") - and self.trainer.training # type: ignore[union-attr] + and self.trainer.training ): # Kornia expects masks to be floats with a channel dimension x = batch["image"] diff --git a/torchgeo/datamodules/oscd.py b/torchgeo/datamodules/oscd.py index 895c97f4b58..441d680d32d 100644 --- a/torchgeo/datamodules/oscd.py +++ b/torchgeo/datamodules/oscd.py @@ -26,7 +26,7 @@ class OSCDDataModule(pl.LightningDataModule): .. versionadded:: 0.2 """ - band_means = torch.tensor( # type: ignore[attr-defined] + band_means = torch.tensor( [ 1583.0741, 1374.3202, @@ -44,7 +44,7 @@ class OSCDDataModule(pl.LightningDataModule): ] ) - band_stds = torch.tensor( # type: ignore[attr-defined] + band_stds = torch.tensor( [ 52.1937, 83.4168, @@ -114,9 +114,7 @@ def preprocess(self, sample: Dict[str, Any]) -> Dict[str, Any]: sample["image"] = sample["image"].float() sample["mask"] = sample["mask"] sample["image"] = self.norm(sample["image"]) - sample["image"] = torch.flatten( # type: ignore[attr-defined] - sample["image"], 0, 1 - ) + sample["image"] = torch.flatten(sample["image"], 0, 1) return sample def prepare_data(self) -> None: @@ -187,12 +185,8 @@ def collate_wrapper(batch: List[Dict[str, Any]]) -> Dict[str, Any]: r_batch: Dict[str, Any] = default_collate( # type: ignore[no-untyped-call] batch ) - r_batch["image"] = torch.flatten( # type: ignore[attr-defined] - r_batch["image"], 0, 1 - ) - r_batch["mask"] = torch.flatten( # type: ignore[attr-defined] - r_batch["mask"], 0, 1 - ) + r_batch["image"] = torch.flatten(r_batch["image"], 0, 1) + r_batch["mask"] = torch.flatten(r_batch["mask"], 0, 1) return r_batch return DataLoader( diff --git a/torchgeo/datamodules/resisc45.py b/torchgeo/datamodules/resisc45.py index ab6753dd8f5..f380a33206f 100644 --- a/torchgeo/datamodules/resisc45.py +++ b/torchgeo/datamodules/resisc45.py @@ -25,13 +25,9 @@ class RESISC45DataModule(pl.LightningDataModule): Uses the train/val/test splits from the dataset. """ - band_means = torch.tensor( # type: ignore[attr-defined] - [0.36820969, 0.38083247, 0.34341029] - ) + band_means = torch.tensor([0.36820969, 0.38083247, 0.34341029]) - band_stds = torch.tensor( # type: ignore[attr-defined] - [0.20339924, 0.18524736, 0.18455448] - ) + band_stds = torch.tensor([0.20339924, 0.18524736, 0.18455448]) def __init__( self, root_dir: str, batch_size: int = 64, num_workers: int = 0, **kwargs: Any @@ -64,8 +60,9 @@ def on_after_batch_transfer( """ if ( hasattr(self, "trainer") + and self.trainer is not None and hasattr(self.trainer, "training") - and self.trainer.training # type: ignore[union-attr] + and self.trainer.training ): x = batch["image"] diff --git a/torchgeo/datamodules/sen12ms.py b/torchgeo/datamodules/sen12ms.py index cfe5900c478..7482a207047 100644 --- a/torchgeo/datamodules/sen12ms.py +++ b/torchgeo/datamodules/sen12ms.py @@ -29,7 +29,7 @@ class SEN12MSDataModule(pl.LightningDataModule): #: Mapping from the IGBP class definitions to the DFC2020, taken from the dataloader #: here https://github.com/lukasliebel/dfc2020_baseline. - DFC2020_CLASS_MAPPING = torch.tensor( # type: ignore[attr-defined] + DFC2020_CLASS_MAPPING = torch.tensor( [ 0, # maps 0s to 0 1, # maps 1s to 1 @@ -102,9 +102,7 @@ def custom_transform(self, sample: Dict[str, Any]) -> Dict[str, Any]: sample["image"][:] = sample["image"][:].clamp(0, 10000) / 10000 sample["mask"] = sample["mask"][0, :, :].long() - sample["mask"] = torch.take( # type: ignore[attr-defined] - self.DFC2020_CLASS_MAPPING, sample["mask"] - ) + sample["mask"] = torch.take(self.DFC2020_CLASS_MAPPING, sample["mask"]) return sample diff --git a/torchgeo/datamodules/so2sat.py b/torchgeo/datamodules/so2sat.py index 9f072edbf43..e6fd9c4250d 100644 --- a/torchgeo/datamodules/so2sat.py +++ b/torchgeo/datamodules/so2sat.py @@ -23,7 +23,7 @@ class So2SatDataModule(pl.LightningDataModule): Uses the train/val/test splits from the dataset. """ - band_means = torch.tensor( # type: ignore[attr-defined] + band_means = torch.tensor( [ -3.591224256609313e-05, -7.658561276843396e-06, @@ -46,7 +46,7 @@ class So2SatDataModule(pl.LightningDataModule): ] ).reshape(18, 1, 1) - band_stds = torch.tensor( # type: ignore[attr-defined] + band_stds = torch.tensor( [ 0.17555201137417686, 0.17556463274968204, diff --git a/torchgeo/datamodules/ucmerced.py b/torchgeo/datamodules/ucmerced.py index 5be53af2034..c352c783a54 100644 --- a/torchgeo/datamodules/ucmerced.py +++ b/torchgeo/datamodules/ucmerced.py @@ -25,9 +25,9 @@ class UCMercedDataModule(pl.LightningDataModule): Uses random train/val/test splits. """ - band_means = torch.tensor([0, 0, 0]) # type: ignore[attr-defined] + band_means = torch.tensor([0, 0, 0]) - band_stds = torch.tensor([1, 1, 1]) # type: ignore[attr-defined] + band_stds = torch.tensor([1, 1, 1]) def __init__( self, root_dir: str, batch_size: int = 64, num_workers: int = 0, **kwargs: Any diff --git a/torchgeo/datamodules/utils.py b/torchgeo/datamodules/utils.py index 20eada6face..a318746cec8 100644 --- a/torchgeo/datamodules/utils.py +++ b/torchgeo/datamodules/utils.py @@ -3,13 +3,17 @@ """Common datamodule utilities.""" -from typing import Any, List, Optional +from typing import Any, List, Optional, Union -from torch.utils.data import Dataset, Subset, random_split +from torch.utils.data import Subset, TensorDataset, random_split + +from ..datasets import VisionDataset def dataset_split( - dataset: Dataset[Any], val_pct: float, test_pct: Optional[float] = None + dataset: Union[TensorDataset, VisionDataset], + val_pct: float, + test_pct: Optional[float] = None, ) -> List[Subset[Any]]: """Split a torch Dataset into train/val/test sets. diff --git a/torchgeo/datasets/advance.py b/torchgeo/datasets/advance.py index c31ae506995..d81226bf445 100644 --- a/torchgeo/datasets/advance.py +++ b/torchgeo/datasets/advance.py @@ -133,7 +133,7 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: image = self._load_image(files["image"]) audio = self._load_target(files["audio"]) cls_label = self.class_to_idx[files["cls"]] - label = torch.tensor(cls_label, dtype=torch.long) # type: ignore[attr-defined] + label = torch.tensor(cls_label, dtype=torch.long) sample = {"image": image, "audio": audio, "label": label} if self.transforms is not None: @@ -178,7 +178,7 @@ def _load_image(self, path: str) -> Tensor: """ with Image.open(path) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -200,7 +200,7 @@ def _load_target(self, path: str) -> Tensor: ) array = wavfile.read(path)[1] - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) tensor = tensor.unsqueeze(0) return tensor diff --git a/torchgeo/datasets/benin_cashews.py b/torchgeo/datasets/benin_cashews.py index abd8224a8e8..9a33d258f7d 100644 --- a/torchgeo/datasets/benin_cashews.py +++ b/torchgeo/datasets/benin_cashews.py @@ -247,8 +247,8 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: sample = { "image": img, "mask": labels, - "x": torch.tensor(x), # type: ignore[attr-defined] - "y": torch.tensor(y), # type: ignore[attr-defined] + "x": torch.tensor(x), + "y": torch.tensor(y), "transform": transform, "crs": crs, } @@ -301,12 +301,12 @@ def _load_all_imagery( if self.verbose: print("Loading all imagery") - img: Tensor = torch.zeros( # type: ignore[attr-defined] + img = torch.zeros( len(self.dates), len(bands), self.tile_height, self.tile_width, - dtype=torch.float32, # type: ignore[attr-defined] + dtype=torch.float32, ) for date_index, date in enumerate(self.dates): @@ -340,11 +340,8 @@ def _load_single_scene( if self.verbose: print(f"Loading imagery at {date}") - img: Tensor = torch.zeros( # type: ignore[attr-defined] - len(bands), - self.tile_height, - self.tile_width, - dtype=torch.float32, # type: ignore[attr-defined] + img = torch.zeros( + len(bands), self.tile_height, self.tile_width, dtype=torch.float32 ) for band_index, band_name in enumerate(self.bands): filepath = os.path.join( @@ -357,7 +354,7 @@ def _load_single_scene( transform = src.transform # same transform for every bands crs = src.crs array = src.read().astype(np.float32) - img[band_index] = torch.from_numpy(array) # type: ignore[attr-defined] + img[band_index] = torch.from_numpy(array) return img, transform, crs @@ -385,7 +382,7 @@ def _load_mask(self, transform: rasterio.Affine) -> Tensor: dtype=np.uint8, ) - mask: Tensor = torch.from_numpy(mask_data).long() # type: ignore[attr-defined] + mask = torch.from_numpy(mask_data).long() return mask def _check_integrity(self) -> bool: diff --git a/torchgeo/datasets/bigearthnet.py b/torchgeo/datasets/bigearthnet.py index 8bb56cd5fb2..f5e0c5ad29c 100644 --- a/torchgeo/datasets/bigearthnet.py +++ b/torchgeo/datasets/bigearthnet.py @@ -394,7 +394,7 @@ def _load_image(self, index: int) -> Tensor: ) images.append(array) arrays: "np.typing.NDArray[np.int_]" = np.stack(images, axis=0) - tensor: Tensor = torch.from_numpy(arrays) # type: ignore[attr-defined] + tensor = torch.from_numpy(arrays) return tensor def _load_target(self, index: int) -> Tensor: @@ -420,14 +420,10 @@ def _load_target(self, index: int) -> Tensor: # Map 43 to 19 class labels if self.num_classes == 19: - indices = [ - self.label_converter.get(idx) for idx in indices # type: ignore[misc] - ] - indices = [idx for idx in indices if idx is not None] - - target: Tensor = torch.zeros( # type: ignore[attr-defined] - self.num_classes, dtype=torch.long # type: ignore[attr-defined] - ) + indices_optional = [self.label_converter.get(idx) for idx in indices] + indices = [idx for idx in indices_optional if idx is not None] + + target = torch.zeros(self.num_classes, dtype=torch.long) target[indices] = 1 return target diff --git a/torchgeo/datasets/chesapeake.py b/torchgeo/datasets/chesapeake.py index 59797098bc3..546f5aeafec 100644 --- a/torchgeo/datasets/chesapeake.py +++ b/torchgeo/datasets/chesapeake.py @@ -636,10 +636,8 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: sample["image"] = np.concatenate(sample["image"], axis=0) sample["mask"] = np.concatenate(sample["mask"], axis=0) - sample["image"] = torch.from_numpy( # type: ignore[attr-defined] - sample["image"] - ) - sample["mask"] = torch.from_numpy(sample["mask"]) # type: ignore[attr-defined] + sample["image"] = torch.from_numpy(sample["image"]) + sample["mask"] = torch.from_numpy(sample["mask"]) if self.transforms is not None: sample = self.transforms(sample) diff --git a/torchgeo/datasets/cowc.py b/torchgeo/datasets/cowc.py index 9e7d28d7dbe..a23a1da8769 100644 --- a/torchgeo/datasets/cowc.py +++ b/torchgeo/datasets/cowc.py @@ -147,7 +147,7 @@ def _load_image(self, index: int) -> Tensor: filename = os.path.join(self.root, self.images[index]) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -162,7 +162,7 @@ def _load_target(self, index: int) -> Tensor: the target """ target = int(self.targets[index]) - tensor: Tensor = torch.tensor(target) # type: ignore[attr-defined] + tensor = torch.tensor(target) return tensor def _check_integrity(self) -> bool: diff --git a/torchgeo/datasets/cv4a_kenya_crop_type.py b/torchgeo/datasets/cv4a_kenya_crop_type.py index f102db0f900..fafd1318724 100644 --- a/torchgeo/datasets/cv4a_kenya_crop_type.py +++ b/torchgeo/datasets/cv4a_kenya_crop_type.py @@ -192,9 +192,9 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: "image": img, "mask": labels, "field_ids": field_ids, - "tile_index": torch.tensor(tile_index), # type: ignore[attr-defined] - "x": torch.tensor(x), # type: ignore[attr-defined] - "y": torch.tensor(y), # type: ignore[attr-defined] + "tile_index": torch.tensor(tile_index), + "x": torch.tensor(x), + "y": torch.tensor(y), } if self.transforms is not None: @@ -234,11 +234,11 @@ def _load_label_tile(self, tile_name: str) -> Tuple[Tensor, Tensor]: with Image.open(os.path.join(directory, "labels.tif")) as img: array: "np.typing.NDArray[np.int_]" = np.array(img) - labels: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + labels = torch.from_numpy(array) with Image.open(os.path.join(directory, "field_ids.tif")) as img: array = np.array(img) - field_ids: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + field_ids = torch.from_numpy(array) return (labels, field_ids) @@ -281,12 +281,12 @@ def _load_all_image_tiles( if self.verbose: print(f"Loading all imagery for {tile_name}") - img: Tensor = torch.zeros( # type: ignore[attr-defined] + img = torch.zeros( len(self.dates), len(bands), self.tile_height, self.tile_width, - dtype=torch.float32, # type: ignore[attr-defined] + dtype=torch.float32, ) for date_index, date in enumerate(self.dates): @@ -319,11 +319,8 @@ def _load_single_image_tile( if self.verbose: print(f"Loading imagery for {tile_name} at {date}") - img: Tensor = torch.zeros( # type: ignore[attr-defined] - len(bands), - self.tile_height, - self.tile_width, - dtype=torch.float32, # type: ignore[attr-defined] + img = torch.zeros( + len(bands), self.tile_height, self.tile_width, dtype=torch.float32 ) for band_index, band_name in enumerate(self.bands): filepath = os.path.join( @@ -334,7 +331,7 @@ def _load_single_image_tile( ) with Image.open(filepath) as band_img: array: "np.typing.NDArray[np.int_]" = np.array(band_img) - img[band_index] = torch.from_numpy(array) # type: ignore[attr-defined] + img[band_index] = torch.from_numpy(array) return img diff --git a/torchgeo/datasets/cyclone.py b/torchgeo/datasets/cyclone.py index 8eb120c5300..8600e836390 100644 --- a/torchgeo/datasets/cyclone.py +++ b/torchgeo/datasets/cyclone.py @@ -147,7 +147,7 @@ def _load_image(self, directory: str) -> Tensor: array: "np.typing.NDArray[np.int_]" = np.array(img) if len(array.shape) == 3: array = array[:, :, 0] - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_features(self, directory: str) -> Dict[str, Any]: diff --git a/torchgeo/datasets/dfc2022.py b/torchgeo/datasets/dfc2022.py index 1caf7e3d306..a9ad15728a9 100644 --- a/torchgeo/datasets/dfc2022.py +++ b/torchgeo/datasets/dfc2022.py @@ -175,7 +175,7 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: files = self.files[index] image = self._load_image(files["image"]) dem = self._load_image(files["dem"], shape=image.shape[1:]) - image = torch.cat(tensors=[image, dem], dim=0) # type: ignore[attr-defined] + image = torch.cat(tensors=[image, dem], dim=0) sample = {"image": image} @@ -235,7 +235,7 @@ def _load_image(self, path: str, shape: Optional[Sequence[int]] = None) -> Tenso array: "np.typing.NDArray[np.float_]" = f.read( out_shape=shape, out_dtype="float32", resampling=Resampling.bilinear ) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_target(self, path: str) -> Tensor: @@ -251,8 +251,8 @@ def _load_target(self, path: str) -> Tensor: array: "np.typing.NDArray[np.int_]" = f.read( indexes=1, out_dtype="int32", resampling=Resampling.bilinear ) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = tensor.to(torch.long) return tensor def _verify(self) -> None: @@ -310,7 +310,7 @@ def plot( """ ncols = 2 image = sample["image"][:3] - image = image.to(torch.uint8) # type: ignore[attr-defined] + image = image.to(torch.uint8) image = image.permute(1, 2, 0).numpy() dem = sample["image"][-1].numpy() diff --git a/torchgeo/datasets/enviroatlas.py b/torchgeo/datasets/enviroatlas.py index 39d38891159..7bf8e35a8f6 100644 --- a/torchgeo/datasets/enviroatlas.py +++ b/torchgeo/datasets/enviroatlas.py @@ -402,10 +402,8 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: sample["image"] = np.concatenate(sample["image"], axis=0) sample["mask"] = np.concatenate(sample["mask"], axis=0) - sample["image"] = torch.from_numpy( # type: ignore[attr-defined] - sample["image"] - ) - sample["mask"] = torch.from_numpy(sample["mask"]) # type: ignore[attr-defined] + sample["image"] = torch.from_numpy(sample["image"]) + sample["mask"] = torch.from_numpy(sample["mask"]) if self.transforms is not None: sample = self.transforms(sample) diff --git a/torchgeo/datasets/etci2021.py b/torchgeo/datasets/etci2021.py index f0cd60062d1..f37de4a3780 100644 --- a/torchgeo/datasets/etci2021.py +++ b/torchgeo/datasets/etci2021.py @@ -138,7 +138,7 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: else: mask = water_mask.unsqueeze(0) - image = torch.cat(tensors=[vv, vh], dim=0) # type: ignore[attr-defined] + image = torch.cat(tensors=[vv, vh], dim=0) sample = {"image": image, "mask": mask} if self.transforms is not None: @@ -205,7 +205,7 @@ def _load_image(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -222,9 +222,9 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = torch.clamp(tensor, min=0, max=1) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = torch.clamp(tensor, min=0, max=1) + tensor = tensor.to(torch.long) return tensor def _check_integrity(self) -> bool: @@ -274,14 +274,17 @@ def plot( """ vv = np.rollaxis(sample["image"][:3].numpy(), 0, 3) vh = np.rollaxis(sample["image"][3:].numpy(), 0, 3) - water_mask = sample["mask"][0].numpy() + mask = sample["mask"].squeeze(0) - showing_flood_mask = sample["mask"].shape[0] > 1 + showing_flood_mask = mask.shape[0] == 2 showing_predictions = "prediction" in sample num_panels = 3 if showing_flood_mask: - flood_mask = sample["mask"][1].numpy() + water_mask = mask[0].numpy() + flood_mask = mask[1].numpy() num_panels += 1 + else: + water_mask = mask.numpy() if showing_predictions: predictions = sample["prediction"].numpy() diff --git a/torchgeo/datasets/eurosat.py b/torchgeo/datasets/eurosat.py index 970e56c33b7..98f5afb7b04 100644 --- a/torchgeo/datasets/eurosat.py +++ b/torchgeo/datasets/eurosat.py @@ -168,9 +168,7 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: """ image, label = self._load_image(index) - image = torch.index_select( # type: ignore[attr-defined] - image, dim=0, index=self.band_indices - ) + image = torch.index_select(image, dim=0, index=self.band_indices) sample = {"image": image, "label": label} if self.transforms is not None: diff --git a/torchgeo/datasets/fair1m.py b/torchgeo/datasets/fair1m.py index 85365e4e166..3d64d4827c5 100644 --- a/torchgeo/datasets/fair1m.py +++ b/torchgeo/datasets/fair1m.py @@ -6,7 +6,7 @@ import glob import os from typing import Any, Callable, Dict, List, Optional, Tuple, cast -from xml.etree import ElementTree +from xml.etree.ElementTree import Element, parse import matplotlib.patches as patches import matplotlib.pyplot as plt @@ -28,21 +28,25 @@ def parse_pascal_voc(path: str) -> Dict[str, Any]: Returns: dict of image filename, points, and class labels """ - et = ElementTree.parse(path) + et = parse(path) element = et.getroot() - filename = element.find("source").find("filename").text # type: ignore[union-attr] + source = cast(Element, element.find("source")) + filename = cast(Element, source.find("filename")).text labels, points = [], [] - for obj in element.find("objects").findall("object"): # type: ignore[union-attr] - obj_points = [ - p for p in obj.find("points").findall("point") # type: ignore[union-attr] - ] - obj_points = [p.text.split(",") for p in obj_points] # type: ignore[union-attr] - obj_points = [ - (float(p1), float(p2)) for p1, p2 in obj_points # type: ignore[arg-type] - ] - label = obj.find("possibleresult").find("name").text # type: ignore[union-attr] + objects = cast(Element, element.find("objects")) + for obj in objects.findall("object"): + elm_points = cast(Element, obj.find("points")) + lis_points = elm_points.findall("point") + str_points = [] + for point in lis_points: + text = cast(str, point.text) + str_points.append(text.split(",")) + tup_points = [(float(p1), float(p2)) for p1, p2 in str_points] + possibleresult = cast(Element, obj.find("possibleresult")) + name = cast(Element, possibleresult.find("name")) + label = name.text labels.append(label) - points.append(obj_points) + points.append(tup_points) return dict(filename=filename, points=points, labels=labels) @@ -219,7 +223,7 @@ def _load_image(self, path: str) -> Tensor: path = os.path.join(self.root, self.image_root, path) with Image.open(path) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -237,9 +241,9 @@ def _load_target( the target bounding boxes and labels """ labels_list = [self.classes[label]["id"] for label in labels] - boxes = torch.tensor(points).to(torch.float) # type: ignore[attr-defined] - labels = torch.tensor(labels_list) # type: ignore[attr-defined] - return boxes, cast(Tensor, labels) + boxes = torch.tensor(points).to(torch.float) + labels_tensor = torch.tensor(labels_list) + return boxes, labels_tensor def _verify(self) -> None: """Verify the integrity of the dataset. diff --git a/torchgeo/datasets/geo.py b/torchgeo/datasets/geo.py index ddd6dbff2cf..725aeb4c953 100644 --- a/torchgeo/datasets/geo.py +++ b/torchgeo/datasets/geo.py @@ -424,7 +424,7 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: filepath = glob.glob(os.path.join(directory, filename))[0] band_filepaths.append(filepath) data_list.append(self._merge_files(band_filepaths, query)) - data = torch.cat(data_list) # type: ignore[attr-defined] + data = torch.cat(data_list) else: data = self._merge_files(filepaths, query) @@ -469,7 +469,7 @@ def _merge_files(self, filepaths: Sequence[str], query: BoundingBox) -> Tensor: elif dest.dtype == np.uint32: dest = dest.astype(np.int64) - tensor: Tensor = torch.tensor(dest) # type: ignore[attr-defined] + tensor = torch.tensor(dest) return tensor @functools.lru_cache(maxsize=128) @@ -665,11 +665,7 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: shapes, out_shape=(int(height), int(width)), transform=transform ) - sample = { - "mask": torch.tensor(masks), # type: ignore[attr-defined] - "crs": self.crs, - "bbox": query, - } + sample = {"mask": torch.tensor(masks), "crs": self.crs, "bbox": query} if self.transforms is not None: sample = self.transforms(sample) @@ -805,10 +801,10 @@ def _load_image(self, index: int) -> Tuple[Tensor, Tensor]: """ img, label = ImageFolder.__getitem__(self, index) array: "np.typing.NDArray[np.int_]" = np.array(img) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) - label = torch.tensor(label) # type: ignore[attr-defined] + label = torch.tensor(label) return tensor, label diff --git a/torchgeo/datasets/gid15.py b/torchgeo/datasets/gid15.py index 9f5dafd27b8..83b0f7923bd 100644 --- a/torchgeo/datasets/gid15.py +++ b/torchgeo/datasets/gid15.py @@ -192,7 +192,7 @@ def _load_image(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -209,8 +209,8 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = tensor.to(torch.long) return tensor def _check_integrity(self) -> bool: diff --git a/torchgeo/datasets/globbiomass.py b/torchgeo/datasets/globbiomass.py index 6cd0f2dbee7..218ec905f00 100644 --- a/torchgeo/datasets/globbiomass.py +++ b/torchgeo/datasets/globbiomass.py @@ -189,7 +189,7 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: std_error_paths = [f for f in filepaths if "err" in f] std_err_mask = self._merge_files(std_error_paths, query) - mask = torch.cat((mask, std_err_mask), dim=0) # type: ignore[attr-defined] + mask = torch.cat((mask, std_err_mask), dim=0) sample = {"mask": mask, "crs": self.crs, "bbox": query} diff --git a/torchgeo/datasets/idtrees.py b/torchgeo/datasets/idtrees.py index 720a81b3d32..bb21a79bb2f 100644 --- a/torchgeo/datasets/idtrees.py +++ b/torchgeo/datasets/idtrees.py @@ -5,7 +5,7 @@ import glob import os -from typing import Any, Callable, Dict, List, Optional, Tuple +from typing import Any, Callable, Dict, List, Optional, Tuple, cast import fiona import matplotlib.pyplot as plt @@ -202,7 +202,7 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: data and label at that index """ path = self.images[index] - image = self._load_image(path).to(torch.uint8) # type:ignore[attr-defined] + image = self._load_image(path).to(torch.uint8) hsi = self._load_image(path.replace("RGB", "HSI")) chm = self._load_image(path.replace("RGB", "CHM")) las = self._load_las(path.replace("RGB", "LAS").replace(".tif", ".las")) @@ -239,7 +239,7 @@ def _load_image(self, path: str) -> Tensor: """ with rasterio.open(path) as f: array = f.read(out_shape=self.image_size, resampling=Resampling.bilinear) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_las(self, path: str) -> Tensor: @@ -255,7 +255,7 @@ def _load_las(self, path: str) -> Tensor: las = laspy.read(path) array: "np.typing.NDArray[np.int_]" = np.stack([las.x, las.y, las.z], axis=0) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_boxes(self, path: str) -> Tensor: @@ -268,20 +268,21 @@ def _load_boxes(self, path: str) -> Tensor: the bounding boxes """ base_path = os.path.basename(path) + geometries = cast(Dict[int, Dict[str, Any]], self.geometries) # Find object ids and geometries if self.split == "train": indices = self.labels["rsFile"] == base_path ids = self.labels[indices]["id"].tolist() - geoms = [self.geometries[i]["geometry"]["coordinates"][0][:4] for i in ids] + geoms = [geometries[i]["geometry"]["coordinates"][0][:4] for i in ids] # Test set - Task 2 has no mapping csv. Mapping is inside of geometry else: ids = [ k - for k, v in self.geometries.items() + for k, v in geometries.items() if v["properties"]["plotID"] == base_path ] - geoms = [self.geometries[i]["geometry"]["coordinates"][0][:4] for i in ids] + geoms = [geometries[i]["geometry"]["coordinates"][0][:4] for i in ids] # Convert to pixel coords boxes = [] @@ -294,7 +295,7 @@ def _load_boxes(self, path: str) -> Tensor: ymax = max([coord[1] for coord in coords]) boxes.append([xmin, ymin, xmax, ymax]) - tensor: Tensor = torch.tensor(boxes) # type: ignore[attr-defined] + tensor = torch.tensor(boxes) return tensor def _load_target(self, path: str) -> Tensor: @@ -313,10 +314,12 @@ def _load_target(self, path: str) -> Tensor: # Load object labels classes = self.labels[indices]["taxonID"].tolist() labels = [self.class2idx[c] for c in classes] - tensor: Tensor = torch.tensor(labels) # type: ignore[attr-defined] + tensor = torch.tensor(labels) return tensor - def _load(self, root: str) -> Tuple[List[str], Dict[int, Dict[str, Any]], Any]: + def _load( + self, root: str + ) -> Tuple[List[str], Optional[Dict[int, Dict[str, Any]]], Any]: """Load files, geometries, and labels. Args: @@ -342,7 +345,7 @@ def _load(self, root: str) -> Tuple[List[str], Dict[int, Dict[str, Any]], Any]: images = glob.glob(os.path.join(directory, "RemoteSensing", "RGB", "*.tif")) - return images, geoms, labels # type: ignore[return-value] + return images, geoms, labels def _load_labels(self, directory: str) -> Any: """Load the csv files containing the labels. diff --git a/torchgeo/datasets/inria.py b/torchgeo/datasets/inria.py index a78f43cc6c5..53d61129708 100644 --- a/torchgeo/datasets/inria.py +++ b/torchgeo/datasets/inria.py @@ -121,7 +121,7 @@ def _load_image(self, path: str) -> Tensor: """ with rio.open(path) as img: array = img.read().astype(np.int32) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_target(self, path: str) -> Tensor: @@ -136,7 +136,7 @@ def _load_target(self, path: str) -> Tensor: with rio.open(path) as img: array = img.read().astype(np.int32) array = np.clip(array, 0, 1) - mask: Tensor = torch.from_numpy(array[0]) # type: ignore[attr-defined] + mask = torch.from_numpy(array[0]) return mask def __len__(self) -> int: diff --git a/torchgeo/datasets/landcoverai.py b/torchgeo/datasets/landcoverai.py index d8e2813cb31..0d7e9f22881 100644 --- a/torchgeo/datasets/landcoverai.py +++ b/torchgeo/datasets/landcoverai.py @@ -149,7 +149,7 @@ def _load_image(self, id_: str) -> Tensor: filename = os.path.join(self.root, "output", id_ + ".jpg") with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -167,7 +167,7 @@ def _load_target(self, id_: str) -> Tensor: filename = os.path.join(self.root, "output", id_ + "_m.png") with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _verify(self) -> None: diff --git a/torchgeo/datasets/levircd.py b/torchgeo/datasets/levircd.py index 39db73297b0..2b20f5b35a6 100644 --- a/torchgeo/datasets/levircd.py +++ b/torchgeo/datasets/levircd.py @@ -157,7 +157,7 @@ def _load_image(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -174,9 +174,9 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = torch.clamp(tensor, min=0, max=1) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = torch.clamp(tensor, min=0, max=1) + tensor = tensor.to(torch.long) return tensor def _check_integrity(self) -> bool: diff --git a/torchgeo/datasets/loveda.py b/torchgeo/datasets/loveda.py index a1e2f2146c8..e40661e975d 100644 --- a/torchgeo/datasets/loveda.py +++ b/torchgeo/datasets/loveda.py @@ -215,7 +215,7 @@ def _load_image(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -232,8 +232,8 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = tensor.to(torch.long) return tensor def _check_integrity(self) -> bool: diff --git a/torchgeo/datasets/nasa_marine_debris.py b/torchgeo/datasets/nasa_marine_debris.py index 035a8cdeaf5..001e4cb368a 100644 --- a/torchgeo/datasets/nasa_marine_debris.py +++ b/torchgeo/datasets/nasa_marine_debris.py @@ -123,7 +123,7 @@ def _load_image(self, path: str) -> Tensor: """ with rasterio.open(path) as f: array = f.read() - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_target(self, path: str) -> Tensor: @@ -138,7 +138,7 @@ def _load_target(self, path: str) -> Tensor: array = np.load(path) # boxes contain unecessary value of 1 after xyxy coords array = array[:, :4] - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_files(self) -> List[Dict[str, str]]: diff --git a/torchgeo/datasets/nwpu.py b/torchgeo/datasets/nwpu.py index c035f83a09b..bd96d1f6934 100644 --- a/torchgeo/datasets/nwpu.py +++ b/torchgeo/datasets/nwpu.py @@ -175,7 +175,7 @@ def _load_image(self, id_: int) -> Tensor: ) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor diff --git a/torchgeo/datasets/openbuildings.py b/torchgeo/datasets/openbuildings.py index 7c1c03adbc5..2b630f9f8df 100644 --- a/torchgeo/datasets/openbuildings.py +++ b/torchgeo/datasets/openbuildings.py @@ -325,11 +325,9 @@ def __getitem__(self, query: BoundingBox) -> Dict[str, Any]: masks = rasterio.features.rasterize( shapes, out_shape=(int(height), int(width)), transform=transform ) - masks = torch.tensor(masks).unsqueeze(0) # type: ignore[attr-defined] + masks = torch.tensor(masks).unsqueeze(0) else: - masks = torch.zeros( # type: ignore[attr-defined] - size=(1, int(height), int(width)) - ) + masks = torch.zeros(size=(1, int(height), int(width))) sample = {"mask": masks, "crs": self.crs, "bbox": query} diff --git a/torchgeo/datasets/oscd.py b/torchgeo/datasets/oscd.py index 15ec8a0438d..c29f59b031e 100644 --- a/torchgeo/datasets/oscd.py +++ b/torchgeo/datasets/oscd.py @@ -203,7 +203,7 @@ def _load_image(self, paths: Sequence[str]) -> Tensor: with Image.open(path) as img: images.append(np.array(img)) array: "np.typing.NDArray[np.int_]" = np.stack(images, axis=0).astype(np.int_) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_target(self, path: str) -> Tensor: @@ -218,9 +218,9 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = torch.clamp(tensor, min=0, max=1) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = torch.clamp(tensor, min=0, max=1) + tensor = tensor.to(torch.long) return tensor def _verify(self) -> None: @@ -299,7 +299,7 @@ def get_masked(img: Tensor) -> "np.typing.NDArray[np.uint8]": np.uint8 ) array: "np.typing.NDArray[np.uint8]" = draw_semantic_segmentation_masks( - torch.from_numpy(rgb_img), # type: ignore[attr-defined] + torch.from_numpy(rgb_img), sample["mask"], alpha=alpha, colors=self.colormap, diff --git a/torchgeo/datasets/potsdam.py b/torchgeo/datasets/potsdam.py index 3aa3b85c2f4..192d839b9a2 100644 --- a/torchgeo/datasets/potsdam.py +++ b/torchgeo/datasets/potsdam.py @@ -187,7 +187,7 @@ def _load_image(self, index: int) -> Tensor: path = self.files[index]["image"] with rasterio.open(path) as f: array = f.read() - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _load_target(self, index: int) -> Tensor: @@ -203,9 +203,9 @@ def _load_target(self, index: int) -> Tensor: with Image.open(path) as img: array: "np.typing.NDArray[np.uint8]" = np.array(img.convert("RGB")) array = rgb_to_mask(array, self.colormap) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = tensor.to(torch.long) return tensor def _verify(self) -> None: diff --git a/torchgeo/datasets/seco.py b/torchgeo/datasets/seco.py index f196a7981d2..40616838cea 100644 --- a/torchgeo/datasets/seco.py +++ b/torchgeo/datasets/seco.py @@ -5,7 +5,7 @@ import os from collections import defaultdict -from typing import Callable, Dict, List, Optional, cast +from typing import Callable, Dict, List, Optional import matplotlib.pyplot as plt import numpy as np @@ -184,10 +184,8 @@ def _load_patch(self, scene_name: str, patch_name: str) -> Tensor: pil_image.resize((264, 264), resample=Image.BILINEAR) ) all_data.append(band_data) - image = torch.from_numpy( # type: ignore[attr-defined] - np.stack(all_data, axis=0) - ) - return cast(Tensor, image) + image = torch.from_numpy(np.stack(all_data, axis=0)) + return image def _verify(self) -> None: """Verify the integrity of the dataset. diff --git a/torchgeo/datasets/sen12ms.py b/torchgeo/datasets/sen12ms.py index 5e142382d15..b141aa70ef5 100644 --- a/torchgeo/datasets/sen12ms.py +++ b/torchgeo/datasets/sen12ms.py @@ -192,7 +192,7 @@ def __init__( assert split in ["train", "test"] self._validate_bands(bands) - self.band_indices = torch.tensor( # type: ignore[attr-defined] + self.band_indices = torch.tensor( [self.band_names.index(b) for b in bands] ).long() self.bands = bands @@ -227,10 +227,8 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: s1 = self._load_raster(filename, "s1") s2 = self._load_raster(filename, "s2") - image = torch.cat(tensors=[s1, s2], dim=0) # type: ignore[attr-defined] - image = torch.index_select( # type: ignore[attr-defined] - image, dim=0, index=self.band_indices - ) + image = torch.cat(tensors=[s1, s2], dim=0) + image = torch.index_select(image, dim=0, index=self.band_indices) sample: Dict[str, Tensor] = {"image": image, "mask": lc} @@ -269,7 +267,7 @@ def _load_raster(self, filename: str, source: str) -> Tensor: ) ) as f: array = f.read().astype(np.int32) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _validate_bands(self, bands: Sequence[str]) -> None: diff --git a/torchgeo/datasets/sentinel.py b/torchgeo/datasets/sentinel.py index 4979d4b57fc..b4d2f1de5c3 100644 --- a/torchgeo/datasets/sentinel.py +++ b/torchgeo/datasets/sentinel.py @@ -131,7 +131,7 @@ def plot( # type: ignore[override] raise ValueError("Dataset doesn't contain some of the RGB bands") image = sample["image"][rgb_indices].permute(1, 2, 0) - image = torch.clamp(image / 3000, min=0, max=1) # type: ignore[attr-defined] + image = torch.clamp(image / 3000, min=0, max=1) fig, ax = plt.subplots(1, 1, figsize=(4, 4)) diff --git a/torchgeo/datasets/so2sat.py b/torchgeo/datasets/so2sat.py index 8f399eac37e..cb02bc39ffb 100644 --- a/torchgeo/datasets/so2sat.py +++ b/torchgeo/datasets/so2sat.py @@ -214,20 +214,15 @@ def __getitem__(self, index: int) -> Dict[str, Tensor]: s2 = np.take(s2, indices=self.s2_band_indices, axis=2) # convert one-hot encoding to int64 then torch int - label = torch.tensor( # type: ignore[attr-defined] - f["label"][index].argmax() - ) + label = torch.tensor(f["label"][index].argmax()) s1 = np.rollaxis(s1, 2, 0) # convert to CxHxW format s2 = np.rollaxis(s2, 2, 0) # convert to CxHxW format - s1 = torch.from_numpy(s1) # type: ignore[attr-defined] - s2 = torch.from_numpy(s2) # type: ignore[attr-defined] + s1 = torch.from_numpy(s1) + s2 = torch.from_numpy(s2) - sample = { - "image": torch.cat([s1, s2]), # type: ignore[attr-defined] - "label": label, - } + sample = {"image": torch.cat([s1, s2]), "label": label} if self.transforms is not None: sample = self.transforms(sample) diff --git a/torchgeo/datasets/spacenet.py b/torchgeo/datasets/spacenet.py index 80e1a28b58e..32fb0983cee 100644 --- a/torchgeo/datasets/spacenet.py +++ b/torchgeo/datasets/spacenet.py @@ -150,7 +150,7 @@ def _load_image(self, path: str) -> Tuple[Tensor, Affine, CRS]: filename = os.path.join(path) with rio.open(filename) as img: array = img.read().astype(np.int32) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor, img.transform, img.crs def _load_mask( @@ -195,7 +195,7 @@ def _load_mask( dtype=np.uint8, ) - mask: Tensor = torch.from_numpy(mask_data).long() # type: ignore[attr-defined] + mask = torch.from_numpy(mask_data).long() return mask @@ -937,7 +937,7 @@ def _load_mask( dtype=np.uint8, ) - mask: Tensor = torch.from_numpy(mask_data).long() # type: ignore[attr-defined] + mask = torch.from_numpy(mask_data).long() return mask def plot( diff --git a/torchgeo/datasets/usavars.py b/torchgeo/datasets/usavars.py index 9d8118efddb..6d94ef8b357 100644 --- a/torchgeo/datasets/usavars.py +++ b/torchgeo/datasets/usavars.py @@ -177,7 +177,7 @@ def _load_image(self, path: str) -> Tensor: """ with rasterio.open(path) as f: array: "np.typing.NDArray[np.int_]" = f.read() - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) return tensor def _verify(self) -> None: diff --git a/torchgeo/datasets/utils.py b/torchgeo/datasets/utils.py index 6e9de5a0476..2386cab9915 100644 --- a/torchgeo/datasets/utils.py +++ b/torchgeo/datasets/utils.py @@ -548,7 +548,7 @@ def concat_samples(samples: Iterable[Dict[Any, Any]]) -> Dict[Any, Any]: collated: Dict[Any, Any] = _list_dict_to_dict_list(samples) for key, value in collated.items(): if isinstance(value[0], Tensor): - collated[key] = torch.cat(value) # type: ignore[attr-defined] + collated[key] = torch.cat(value) else: collated[key] = value[0] return collated @@ -573,9 +573,7 @@ def merge_samples(samples: Iterable[Dict[Any, Any]]) -> Dict[Any, Any]: if key in collated and isinstance(value, Tensor): # Take the maximum so that nodata values (zeros) get replaced # by data values whenever possible - collated[key] = torch.maximum( # type: ignore[attr-defined] - collated[key], value - ) + collated[key] = torch.maximum(collated[key], value) else: collated[key] = value return collated @@ -645,7 +643,7 @@ def draw_semantic_segmentation_masks( a version of ``image`` overlayed with the colors given by ``mask`` and ``colors`` """ - classes = torch.unique(mask) # type: ignore[attr-defined] + classes = torch.unique(mask) classes = classes[1:] class_masks = mask == classes[:, None, None] img = draw_segmentation_masks( diff --git a/torchgeo/datasets/vaihingen.py b/torchgeo/datasets/vaihingen.py index 2d3bb88f5a3..1fdc1824e9e 100644 --- a/torchgeo/datasets/vaihingen.py +++ b/torchgeo/datasets/vaihingen.py @@ -185,7 +185,7 @@ def _load_image(self, index: int) -> Tensor: path = self.files[index]["image"] with Image.open(path) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -203,9 +203,9 @@ def _load_target(self, index: int) -> Tensor: with Image.open(path) as img: array: "np.typing.NDArray[np.uint8]" = np.array(img.convert("RGB")) array = rgb_to_mask(array, self.colormap) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = tensor.to(torch.long) return tensor def _verify(self) -> None: diff --git a/torchgeo/datasets/xview.py b/torchgeo/datasets/xview.py index a60055d063e..4cdbb54e8e3 100644 --- a/torchgeo/datasets/xview.py +++ b/torchgeo/datasets/xview.py @@ -158,7 +158,7 @@ def _load_image(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("RGB")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from HxWxC to CxHxW tensor = tensor.permute((2, 0, 1)) return tensor @@ -175,8 +175,8 @@ def _load_target(self, path: str) -> Tensor: filename = os.path.join(path) with Image.open(filename) as img: array: "np.typing.NDArray[np.int_]" = np.array(img.convert("L")) - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] - tensor = tensor.to(torch.long) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) + tensor = tensor.to(torch.long) return tensor def _verify(self) -> None: diff --git a/torchgeo/datasets/zuericrop.py b/torchgeo/datasets/zuericrop.py index 56361dbd808..77f6d1d4c5f 100644 --- a/torchgeo/datasets/zuericrop.py +++ b/torchgeo/datasets/zuericrop.py @@ -83,7 +83,7 @@ def __init__( don't match """ self._validate_bands(bands) - self.band_indices = torch.tensor( # type: ignore[attr-defined] + self.band_indices = torch.tensor( [self.band_names.index(b) for b in bands] ).long() @@ -148,12 +148,10 @@ def _load_image(self, index: int) -> Tensor: with h5py.File(self.filepath, "r") as f: array = f["data"][index, ...] - tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = torch.from_numpy(array) # Convert from TxHxWxC to TxCxHxW tensor = tensor.permute((0, 3, 1, 2)) - tensor = torch.index_select( # type: ignore[attr-defined] - tensor, dim=1, index=self.band_indices - ) + tensor = torch.index_select(tensor, dim=1, index=self.band_indices) return tensor def _load_target(self, index: int) -> Tuple[Tensor, Tensor, Tensor]: @@ -171,40 +169,40 @@ def _load_target(self, index: int) -> Tuple[Tensor, Tensor, Tensor]: mask_array = f["gt"][index, ...] instance_array = f["gt_instance"][index, ...] - mask_tensor = torch.from_numpy(mask_array) # type: ignore[attr-defined] - instance_tensor = torch.from_numpy(instance_array) # type: ignore[attr-defined] + mask_tensor = torch.from_numpy(mask_array) + instance_tensor = torch.from_numpy(instance_array) # Convert from HxWxC to CxHxW mask_tensor = mask_tensor.permute((2, 0, 1)) instance_tensor = instance_tensor.permute((2, 0, 1)) # Convert instance mask of N instances to N binary instance masks - instance_ids = torch.unique(instance_tensor) # type: ignore[attr-defined] + instance_ids = torch.unique(instance_tensor) # Exclude a mask for unknown/background instance_ids = instance_ids[instance_ids != 0] instance_ids = instance_ids[:, None, None] - masks: Tensor = instance_tensor == instance_ids + masks = instance_tensor == instance_ids # Parse labels for each instance labels_list = [] for mask in masks: label = mask_tensor[mask[None, :, :]] - label = torch.unique(label)[0] # type: ignore[attr-defined] + label = torch.unique(label)[0] labels_list.append(label) # Get bounding boxes for each instance boxes_list = [] for mask in masks: - pos = torch.where(mask) # type: ignore[attr-defined] - xmin = torch.min(pos[1]) # type: ignore[attr-defined] - xmax = torch.max(pos[1]) # type: ignore[attr-defined] - ymin = torch.min(pos[0]) # type: ignore[attr-defined] - ymax = torch.max(pos[0]) # type: ignore[attr-defined] + pos = torch.where(mask) + xmin = torch.min(pos[1]) + xmax = torch.max(pos[1]) + ymin = torch.min(pos[0]) + ymax = torch.max(pos[0]) boxes_list.append([xmin, ymin, xmax, ymax]) - masks = masks.to(torch.uint8) # type: ignore[attr-defined] - boxes = torch.tensor(boxes_list).to(torch.float) # type: ignore[attr-defined] - labels = torch.tensor(labels_list).to(torch.long) # type: ignore[attr-defined] + masks = masks.to(torch.uint8) + boxes = torch.tensor(boxes_list).to(torch.float) + labels = torch.tensor(labels_list).to(torch.long) return masks, boxes, labels @@ -292,18 +290,15 @@ def plot( ncols = 2 image, mask = sample["image"][time_step, rgb_indices], sample["mask"] - image = torch.tensor( # type: ignore[attr-defined] - percentile_normalization(image.numpy()) * 255, - dtype=torch.uint8, # type: ignore[attr-defined] + image = torch.tensor( + percentile_normalization(image.numpy()) * 255, dtype=torch.uint8 ) - mask = torch.argmax(mask, dim=0) # type: ignore[attr-defined] + mask = torch.argmax(mask, dim=0) if "prediction" in sample: ncols += 1 - preds = torch.argmax( # type: ignore[attr-defined] - sample["prediction"], dim=0 - ) + preds = torch.argmax(sample["prediction"], dim=0) fig, axs = plt.subplots(ncols=ncols, figsize=(10, 10 * ncols)) diff --git a/torchgeo/losses/qr.py b/torchgeo/losses/qr.py index e24d0d773cf..18f2c948cd7 100644 --- a/torchgeo/losses/qr.py +++ b/torchgeo/losses/qr.py @@ -32,10 +32,10 @@ def forward(self, probs: torch.Tensor, target: torch.Tensor) -> torch.Tensor: """ q = probs q_bar = q.mean(dim=(0, 2, 3)) - qbar_log_S = (q_bar * torch.log(q_bar)).sum() # type: ignore[attr-defined] + qbar_log_S = (q_bar * torch.log(q_bar)).sum() - q_log_p = torch.einsum( # type: ignore[attr-defined] - "bcxy,bcxy->bxy", q, torch.log(target) # type: ignore[attr-defined] + q_log_p = torch.einsum( # type: ignore[no-untyped-call] + "bcxy,bcxy->bxy", q, torch.log(target) ).mean() loss = qbar_log_S - q_log_p @@ -69,10 +69,8 @@ def forward(self, probs: torch.Tensor, target: torch.Tensor) -> torch.Tensor: ).clamp_min(1e-12).expand_as(q) r = F.normalize(z * target, p=1, dim=1) - loss = torch.einsum( # type: ignore[attr-defined] - "bcxy,bcxy->bxy", - r, - torch.log(r) - torch.log(q), # type: ignore[attr-defined] + loss = torch.einsum( # type: ignore[no-untyped-call] + "bcxy,bcxy->bxy", r, torch.log(r) - torch.log(q) ).mean() return cast(torch.Tensor, loss) diff --git a/torchgeo/models/changestar.py b/torchgeo/models/changestar.py index 24c3d6c08b7..e60abad02a0 100644 --- a/torchgeo/models/changestar.py +++ b/torchgeo/models/changestar.py @@ -78,14 +78,10 @@ def forward(self, bi_feature: Tensor) -> List[Tensor]: a list of bidirected output predictions """ batch_size = bi_feature.size(0) - t1t2 = torch.cat( # type: ignore[attr-defined] - [bi_feature[:, 0, :, :, :], bi_feature[:, 1, :, :, :]], dim=1 - ) - t2t1 = torch.cat( # type: ignore[attr-defined] - [bi_feature[:, 1, :, :, :], bi_feature[:, 0, :, :, :]], dim=1 - ) + t1t2 = torch.cat([bi_feature[:, 0, :, :, :], bi_feature[:, 1, :, :, :]], dim=1) + t2t1 = torch.cat([bi_feature[:, 1, :, :, :], bi_feature[:, 0, :, :, :]], dim=1) - c1221 = self.convs(torch.cat([t1t2, t2t1], dim=0)) # type: ignore[attr-defined] + c1221 = self.convs(torch.cat([t1t2, t2t1], dim=0)) c12, c21 = torch.split( c1221, batch_size, dim=0 ) # type: ignore[no-untyped-call] diff --git a/torchgeo/models/fcsiam.py b/torchgeo/models/fcsiam.py index 999b99fd26e..1fbfcddaa23 100644 --- a/torchgeo/models/fcsiam.py +++ b/torchgeo/models/fcsiam.py @@ -108,7 +108,7 @@ def forward(self, x: Tensor) -> Tensor: x2 = x[:, 1] features1, features2 = self.encoder(x1), self.encoder(x2) features = [ - torch.cat([features2[i], features1[i]], dim=1) # type: ignore[attr-defined] + torch.cat([features2[i], features1[i]], dim=1) for i in range(1, len(features1)) ] features.insert(0, features2[0]) diff --git a/torchgeo/models/rcf.py b/torchgeo/models/rcf.py index 6c8640913af..1069b6a0cda 100644 --- a/torchgeo/models/rcf.py +++ b/torchgeo/models/rcf.py @@ -3,7 +3,7 @@ """Implementation of a random convolutional feature projection model.""" -from typing import Optional, cast +from typing import Optional import torch import torch.nn.functional as F @@ -25,6 +25,9 @@ class RCF(Module): This Module is *not* trainable. It is only used as a feature extractor. """ + weights: Tensor + biases: Tensor + def __init__( self, in_channels: int = 4, @@ -55,9 +58,7 @@ def __init__( if seed is None: generator = None else: - generator = torch.Generator().manual_seed( # type: ignore[attr-defined] - seed - ) + generator = torch.Generator().manual_seed(seed) # We register the weight and bias tensors as "buffers". This does two things: # makes them behave correctly when we call .to(...) on the module, and makes @@ -75,11 +76,7 @@ def __init__( ), ) self.register_buffer( - "biases", - torch.zeros( # type: ignore[attr-defined] - features // 2, requires_grad=False - ) - + bias, + "biases", torch.zeros(features // 2, requires_grad=False) + bias ) def forward(self, x: Tensor) -> Tensor: @@ -104,9 +101,9 @@ def forward(self, x: Tensor) -> Tensor: x1b = F.adaptive_avg_pool2d(x1b, (1, 1)).squeeze() if len(x1a.shape) == 1: # case where we passed a single input - output = torch.cat((x1a, x1b), dim=0) # type: ignore[attr-defined] - return cast(Tensor, output) + output = torch.cat((x1a, x1b), dim=0) + return output else: # case where we passed a batch of > 1 inputs assert len(x1a.shape) == 2 - output = torch.cat((x1a, x1b), dim=1) # type: ignore[attr-defined] - return cast(Tensor, output) + output = torch.cat((x1a, x1b), dim=1) + return output diff --git a/torchgeo/models/resnet.py b/torchgeo/models/resnet.py index 7c47a4c124b..ff0b0fb33a1 100644 --- a/torchgeo/models/resnet.py +++ b/torchgeo/models/resnet.py @@ -55,7 +55,7 @@ def _resnet( model = ResNet(block, layers, NUM_CLASSES[sensor], **kwargs) # Replace the first layer with the correct number of input channels - model.conv1 = nn.Conv2d( # type: ignore[attr-defined] + model.conv1 = nn.Conv2d( IN_CHANNELS[sensor][bands], out_channels=64, kernel_size=7, diff --git a/torchgeo/trainers/byol.py b/torchgeo/trainers/byol.py index 44e36a150b2..5080c7128cf 100644 --- a/torchgeo/trainers/byol.py +++ b/torchgeo/trainers/byol.py @@ -4,7 +4,7 @@ """BYOL tasks.""" import random -from typing import Any, Callable, Dict, Optional, Tuple, Union, cast +from typing import Any, Callable, Dict, Optional, Tuple, cast import torch import torch.nn.functional as F @@ -36,8 +36,8 @@ def normalized_mse(x: Tensor, y: Tensor) -> Tensor: """ x = F.normalize(x, dim=-1) y = F.normalize(y, dim=-1) - mse = torch.mean(2 - 2 * (x * y).sum(dim=-1)) # type: ignore[attr-defined] - return cast(Tensor, mse) + mse = torch.mean(2 - 2 * (x * y).sum(dim=-1)) + return mse # TODO: Move this to transforms @@ -89,9 +89,7 @@ def __init__(self, image_size: Tuple[int, int] = (256, 256)) -> None: self.size = image_size self.augmentation = Sequential( - KorniaTransform.Resize( # type: ignore[attr-defined] - size=image_size, align_corners=False - ), + KorniaTransform.Resize(size=image_size, align_corners=False), # Not suitable for multispectral adapt # RandomApply(K.ColorJitter(0.8, 0.8, 0.8, 0.2), p=0.8), # K.RandomGrayscale(p=0.2), @@ -161,7 +159,7 @@ def __init__( model: Module, projection_size: int = 256, hidden_size: int = 4096, - layer: Union[str, int] = -2, + layer: int = -2, ) -> None: """Initializes EncoderWrapper. @@ -180,7 +178,7 @@ def __init__( self._projector: Optional[Module] = None self._projector_dim: Optional[int] = None - self._encoded = torch.empty(0) # type: ignore[attr-defined] + self._encoded = torch.empty(0) self._register_hook() @property @@ -215,7 +213,7 @@ def _hook(self, module: Any, input: Any, output: Tensor) -> None: def _register_hook(self) -> None: """Register a hook for layer that we will extract features from.""" - layer = list(self.model.children())[self.layer] # type: ignore[index] + layer = list(self.model.children())[self.layer] layer.register_forward_hook(self._hook) def forward(self, x: Tensor) -> Tensor: @@ -228,7 +226,7 @@ def forward(self, x: Tensor) -> Tensor: output from the model """ _ = self.model(x) - return cast(Tensor, self._encoded) + return self._encoded class BYOL(Module): @@ -246,7 +244,7 @@ def __init__( self, model: Module, image_size: Tuple[int, int] = (256, 256), - hidden_layer: Union[str, int] = -2, + hidden_layer: int = -2, in_channels: int = 4, projection_size: int = 256, hidden_size: int = 4096, @@ -287,9 +285,7 @@ def __init__( ) # Perform a single forward pass to initialize the wrapper correctly - self.encoder( - torch.zeros(2, self.in_channels, *image_size) # type: ignore[attr-defined] - ) + self.encoder(torch.zeros(2, self.in_channels, *image_size)) def forward(self, x: Tensor) -> Tensor: """Forward pass of the encoder model through the MLP and prediction head. @@ -313,17 +309,17 @@ class BYOLTask(LightningModule): def config_task(self) -> None: """Configures the task based on kwargs parameters passed to the constructor.""" - in_channels = self.hparams["in_channels"] - pretrained = self.hparams["imagenet_pretraining"] + in_channels = self.hyperparams["in_channels"] + pretrained = self.hyperparams["imagenet_pretraining"] encoder = None - if self.hparams["encoder_name"] == "resnet18": + if self.hyperparams["encoder_name"] == "resnet18": encoder = resnet18(pretrained=pretrained) - elif self.hparams["encoder_name"] == "resnet50": + elif self.hyperparams["encoder_name"] == "resnet50": encoder = resnet50(pretrained=pretrained) else: raise ValueError( - f"Encoder type '{self.hparams['encoder_name']}' is not valid." + f"Encoder type '{self.hyperparams['encoder_name']}' is not valid." ) layer = encoder.conv1 @@ -339,15 +335,13 @@ def config_task(self) -> None: # initialize the weights from new channel with the red channel weights copy_weights = 0 # Copying the weights from the old to the new layer - new_layer.weight[:, : layer.in_channels, :, :].data[ - ... # type: ignore[index] - ] = Variable(layer.weight.clone(), requires_grad=True) + new_layer.weight[:, : layer.in_channels, :, :].data[:] = Variable( + layer.weight.clone(), requires_grad=True + ) # Copying the weights of the old layer to the extra channels for i in range(in_channels - layer.in_channels): channel = layer.in_channels + i - new_layer.weight[:, channel : channel + 1, :, :].data[ - ... # type: ignore[index] - ] = Variable( + new_layer.weight[:, channel : channel + 1, :, :].data[:] = Variable( layer.weight[:, copy_weights : copy_weights + 1, ::].clone(), requires_grad=True, ) @@ -368,11 +362,14 @@ def __init__(self, **kwargs: Any) -> None: ValueError: if kwargs arguments are invalid """ super().__init__() - self.save_hyperparameters() # creates `self.hparams` from kwargs + + # Creates `self.hparams` from kwargs + self.save_hyperparameters() # type: ignore[operator] + self.hyperparams = cast(Dict[str, Any], self.hparams) self.config_task() - def forward(self, x: Tensor) -> Any: # type: ignore[override] + def forward(self, *args: Any, **kwargs: Any) -> Any: """Forward pass of the model. Args: @@ -381,7 +378,7 @@ def forward(self, x: Tensor) -> Any: # type: ignore[override] Returns: output from the model """ - return self.model(x) + return self.model(*args, **kwargs) def configure_optimizers(self) -> Dict[str, Any]: """Initialize the optimizer and learning rate scheduler. @@ -390,33 +387,32 @@ def configure_optimizers(self) -> Dict[str, Any]: a "lr dict" according to the pytorch lightning documentation -- https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#configure-optimizers """ - optimizer_class = getattr(optim, self.hparams.get("optimizer", "Adam")) - lr = self.hparams.get("lr", 1e-4) - weight_decay = self.hparams.get("weight_decay", 1e-6) + optimizer_class = getattr(optim, self.hyperparams.get("optimizer", "Adam")) + lr = self.hyperparams.get("lr", 1e-4) + weight_decay = self.hyperparams.get("weight_decay", 1e-6) optimizer = optimizer_class(self.parameters(), lr=lr, weight_decay=weight_decay) return { "optimizer": optimizer, "lr_scheduler": { "scheduler": ReduceLROnPlateau( - optimizer, patience=self.hparams["learning_rate_schedule_patience"] + optimizer, + patience=self.hyperparams["learning_rate_schedule_patience"], ), "monitor": "val_loss", }, } - def training_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> Tensor: - """Training step - reports BYOL loss. + def training_step(self, *args: Any, **kwargs: Any) -> Tensor: + """Compute and return the training loss. Args: - batch: current batch - batch_idx: index of current batch + batch: the output of your DataLoader Returns: training loss """ + batch = args[0] x = batch["image"] with torch.no_grad(): x1, x2 = self.model.augment(x), self.model.augment(x) @@ -424,33 +420,27 @@ def training_step( # type: ignore[override] pred1, pred2 = self.forward(x1), self.forward(x2) with torch.no_grad(): targ1, targ2 = self.model.target(x1), self.model.target(x2) - loss = torch.mean( # type: ignore[attr-defined] - normalized_mse(pred1, targ2) + normalized_mse(pred2, targ1) - ) + loss = torch.mean(normalized_mse(pred1, targ2) + normalized_mse(pred2, targ1)) self.log("train_loss", loss, on_step=True, on_epoch=False) self.model.update_target() - return cast(Tensor, loss) + return loss - def validation_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Logs iteration level validation loss. + def validation_step(self, *args: Any, **kwargs: Any) -> None: + """Compute validation loss. Args: - batch: current batch - batch_idx: index of current batch + batch: the output of your DataLoader """ + batch = args[0] x = batch["image"] x1, x2 = self.model.augment(x), self.model.augment(x) pred1, pred2 = self.forward(x1), self.forward(x2) targ1, targ2 = self.model.target(x1), self.model.target(x2) - loss = torch.mean( # type: ignore[attr-defined] - normalized_mse(pred1, targ2) + normalized_mse(pred2, targ1) - ) + loss = torch.mean(normalized_mse(pred1, targ2) + normalized_mse(pred2, targ1)) self.log("val_loss", loss, on_step=False, on_epoch=True) - def test_step(self, *args: Any) -> None: # type: ignore[override] + def test_step(self, *args: Any, **kwargs: Any) -> Any: """No-op, does nothing.""" diff --git a/torchgeo/trainers/classification.py b/torchgeo/trainers/classification.py index 7646f51a00d..a8171eb468f 100644 --- a/torchgeo/trainers/classification.py +++ b/torchgeo/trainers/classification.py @@ -30,18 +30,20 @@ class ClassificationTask(pl.LightningModule): def config_model(self) -> None: """Configures the model based on kwargs parameters passed to the constructor.""" - in_channels = self.hparams["in_channels"] - classification_model = self.hparams["classification_model"] + in_channels = self.hyperparams["in_channels"] + classification_model = self.hyperparams["classification_model"] imagenet_pretrained = False custom_pretrained = False - if self.hparams["weights"] and not os.path.exists(self.hparams["weights"]): - if self.hparams["weights"] not in ["imagenet", "random"]: + if self.hyperparams["weights"] and not os.path.exists( + self.hyperparams["weights"] + ): + if self.hyperparams["weights"] not in ["imagenet", "random"]: raise ValueError( - f"Weight type '{self.hparams['weights']}' is not valid." + f"Weight type '{self.hyperparams['weights']}' is not valid." ) else: - imagenet_pretrained = self.hparams["weights"] == "imagenet" + imagenet_pretrained = self.hyperparams["weights"] == "imagenet" custom_pretrained = False else: custom_pretrained = True @@ -51,7 +53,7 @@ def config_model(self) -> None: if classification_model in valid_models: self.model = timm.create_model( classification_model, - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], in_chans=in_channels, pretrained=imagenet_pretrained, ) @@ -61,12 +63,12 @@ def config_model(self) -> None: ) if custom_pretrained: - name, state_dict = utils.extract_encoder(self.hparams["weights"]) + name, state_dict = utils.extract_encoder(self.hyperparams["weights"]) - if self.hparams["classification_model"] != name: + if self.hyperparams["classification_model"] != name: raise ValueError( f"Trying to load {name} weights into a " - f"{self.hparams['classification_model']}" + f"{self.hyperparams['classification_model']}" ) self.model = utils.load_state_dict(self.model, state_dict) @@ -74,14 +76,14 @@ def config_task(self) -> None: """Configures the task based on kwargs parameters passed to the constructor.""" self.config_model() - if self.hparams["loss"] == "ce": - self.loss = nn.CrossEntropyLoss() # type: ignore[attr-defined] - elif self.hparams["loss"] == "jaccard": + if self.hyperparams["loss"] == "ce": + self.loss: nn.Module = nn.CrossEntropyLoss() + elif self.hyperparams["loss"] == "jaccard": self.loss = JaccardLoss(mode="multiclass") - elif self.hparams["loss"] == "focal": + elif self.hyperparams["loss"] == "focal": self.loss = FocalLoss(mode="multiclass", normalized=True) else: - raise ValueError(f"Loss type '{self.hparams['loss']}' is not valid.") + raise ValueError(f"Loss type '{self.hyperparams['loss']}' is not valid.") def __init__(self, **kwargs: Any) -> None: """Initialize the LightningModule with a model and loss function. @@ -93,21 +95,28 @@ def __init__(self, **kwargs: Any) -> None: "random_rgb" """ super().__init__() - self.save_hyperparameters() # creates `self.hparams` from kwargs + + # Creates `self.hparams` from kwargs + self.save_hyperparameters() # type: ignore[operator] + self.hyperparams = cast(Dict[str, Any], self.hparams) self.config_task() self.train_metrics = MetricCollection( { "OverallAccuracy": Accuracy( - num_classes=self.hparams["num_classes"], average="micro" + num_classes=self.hyperparams["num_classes"], average="micro" ), "AverageAccuracy": Accuracy( - num_classes=self.hparams["num_classes"], average="macro" + num_classes=self.hyperparams["num_classes"], average="macro" + ), + "JaccardIndex": JaccardIndex( + num_classes=self.hyperparams["num_classes"] ), - "JaccardIndex": JaccardIndex(num_classes=self.hparams["num_classes"]), "F1Score": FBetaScore( - num_classes=self.hparams["num_classes"], beta=1.0, average="micro" + num_classes=self.hyperparams["num_classes"], + beta=1.0, + average="micro", ), }, prefix="train_", @@ -115,7 +124,7 @@ def __init__(self, **kwargs: Any) -> None: self.val_metrics = self.train_metrics.clone(prefix="val_") self.test_metrics = self.train_metrics.clone(prefix="test_") - def forward(self, x: Tensor) -> Any: # type: ignore[override] + def forward(self, *args: Any, **kwargs: Any) -> Any: """Forward pass of the model. Args: @@ -124,20 +133,18 @@ def forward(self, x: Tensor) -> Any: # type: ignore[override] Returns: prediction """ - return self.model(x) + return self.model(*args, **kwargs) - def training_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> Tensor: - """Training step. + def training_step(self, *args: Any, **kwargs: Any) -> Tensor: + """Compute and return the training loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader Returns: training loss """ + batch = args[0] x = batch["image"] y = batch["label"] y_hat = self.forward(x) @@ -161,15 +168,15 @@ def training_epoch_end(self, outputs: Any) -> None: self.log_dict(self.train_metrics.compute()) self.train_metrics.reset() - def validation_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Validation step. + def validation_step(self, *args: Any, **kwargs: Any) -> None: + """Compute validation loss and log example predictions. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader + batch_idx: the index of this batch """ + batch = args[0] + batch_idx = args[1] x = batch["image"] y = batch["label"] y_hat = self.forward(x) @@ -204,15 +211,13 @@ def validation_epoch_end(self, outputs: Any) -> None: self.log_dict(self.val_metrics.compute()) self.val_metrics.reset() - def test_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Test step. + def test_step(self, *args: Any, **kwargs: Any) -> None: + """Compute test loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader """ + batch = args[0] x = batch["image"] y = batch["label"] y_hat = self.forward(x) @@ -241,13 +246,14 @@ def configure_optimizers(self) -> Dict[str, Any]: https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#configure-optimizers """ optimizer = torch.optim.AdamW( - self.model.parameters(), lr=self.hparams["learning_rate"] + self.model.parameters(), lr=self.hyperparams["learning_rate"] ) return { "optimizer": optimizer, "lr_scheduler": { "scheduler": ReduceLROnPlateau( - optimizer, patience=self.hparams["learning_rate_schedule_patience"] + optimizer, + patience=self.hyperparams["learning_rate_schedule_patience"], ), "monitor": "val_loss", }, @@ -261,10 +267,10 @@ def config_task(self) -> None: """Configures the task based on kwargs parameters passed to the constructor.""" self.config_model() - if self.hparams["loss"] == "bce": - self.loss = nn.BCEWithLogitsLoss() # type: ignore[attr-defined] + if self.hyperparams["loss"] == "bce": + self.loss = nn.BCEWithLogitsLoss() else: - raise ValueError(f"Loss type '{self.hparams['loss']}' is not valid.") + raise ValueError(f"Loss type '{self.hyperparams['loss']}' is not valid.") def __init__(self, **kwargs: Any) -> None: """Initialize the LightningModule with a model and loss function. @@ -276,24 +282,27 @@ def __init__(self, **kwargs: Any) -> None: "random_rgb" """ super().__init__(**kwargs) - self.save_hyperparameters() # creates `self.hparams` from kwargs + + # Creates `self.hparams` from kwargs + self.save_hyperparameters() # type: ignore[operator] + self.hyperparams = cast(Dict[str, Any], self.hparams) self.config_task() self.train_metrics = MetricCollection( { "OverallAccuracy": Accuracy( - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], average="micro", multiclass=False, ), "AverageAccuracy": Accuracy( - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], average="macro", multiclass=False, ), "F1Score": FBetaScore( - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], beta=1.0, average="micro", multiclass=False, @@ -304,23 +313,22 @@ def __init__(self, **kwargs: Any) -> None: self.val_metrics = self.train_metrics.clone(prefix="val_") self.test_metrics = self.train_metrics.clone(prefix="test_") - def training_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> Tensor: - """Training step. + def training_step(self, *args: Any, **kwargs: Any) -> Tensor: + """Compute and return the training loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader + Returns: training loss """ + batch = args[0] x = batch["image"] y = batch["label"] y_hat = self.forward(x) - y_hat_hard = torch.softmax(y_hat, dim=-1) # type: ignore[attr-defined] + y_hat_hard = torch.softmax(y_hat, dim=-1) - loss = self.loss(y_hat, y.to(torch.float)) # type: ignore[attr-defined] + loss = self.loss(y_hat, y.to(torch.float)) # by default, the train step logs every `log_every_n_steps` steps where # `log_every_n_steps` is a parameter to the `Trainer` object @@ -329,21 +337,21 @@ def training_step( # type: ignore[override] return cast(Tensor, loss) - def validation_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Validation step. + def validation_step(self, *args: Any, **kwargs: Any) -> None: + """Compute validation loss and log example predictions. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader + batch_idx: the index of this batch """ + batch = args[0] + batch_idx = args[1] x = batch["image"] y = batch["label"] y_hat = self.forward(x) - y_hat_hard = torch.softmax(y_hat, dim=-1) # type: ignore[attr-defined] + y_hat_hard = torch.softmax(y_hat, dim=-1) - loss = self.loss(y_hat, y.to(torch.float)) # type: ignore[attr-defined] + loss = self.loss(y_hat, y.to(torch.float)) self.log("val_loss", loss, on_step=False, on_epoch=True) self.val_metrics(y_hat_hard, y) @@ -363,21 +371,19 @@ def validation_step( # type: ignore[override] except AttributeError: pass - def test_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Test step. + def test_step(self, *args: Any, **kwargs: Any) -> None: + """Compute test loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader """ + batch = args[0] x = batch["image"] y = batch["label"] y_hat = self.forward(x) - y_hat_hard = torch.softmax(y_hat, dim=-1) # type: ignore[attr-defined] + y_hat_hard = torch.softmax(y_hat, dim=-1) - loss = self.loss(y_hat, y.to(torch.float)) # type: ignore[attr-defined] + loss = self.loss(y_hat, y.to(torch.float)) # by default, the test and validation steps only log per *epoch* self.log("test_loss", loss, on_step=False, on_epoch=True) diff --git a/torchgeo/trainers/regression.py b/torchgeo/trainers/regression.py index 6393ceda2ff..326e2eb9ad1 100644 --- a/torchgeo/trainers/regression.py +++ b/torchgeo/trainers/regression.py @@ -3,7 +3,7 @@ """Regression tasks.""" -from typing import Any, Dict +from typing import Any, Dict, cast import pytorch_lightning as pl import torch @@ -28,14 +28,12 @@ class RegressionTask(pl.LightningModule): def config_task(self) -> None: """Configures the task based on kwargs parameters.""" - if self.hparams["model"] == "resnet18": - self.model = models.resnet18(pretrained=self.hparams["pretrained"]) + if self.hyperparams["model"] == "resnet18": + self.model = models.resnet18(pretrained=self.hyperparams["pretrained"]) in_features = self.model.fc.in_features - self.model.fc = nn.Linear( # type: ignore[attr-defined] - in_features, out_features=1 - ) + self.model.fc = nn.Linear(in_features, out_features=1) else: - raise ValueError(f"Model type '{self.hparams['model']}' is not valid.") + raise ValueError(f"Model type '{self.hyperparams['model']}' is not valid.") def __init__(self, **kwargs: Any) -> None: """Initialize a new LightningModule for training simple regression models. @@ -46,7 +44,10 @@ def __init__(self, **kwargs: Any) -> None: learning_rate_schedule_patience: Patience parameter for the LR scheduler """ super().__init__() - self.save_hyperparameters() # creates `self.hparams` from kwargs + + # Creates `self.hparams` from kwargs + self.save_hyperparameters() # type: ignore[operator] + self.hyperparams = cast(Dict[str, Any], self.hparams) self.config_task() self.train_metrics = MetricCollection( @@ -56,22 +57,27 @@ def __init__(self, **kwargs: Any) -> None: self.val_metrics = self.train_metrics.clone(prefix="val_") self.test_metrics = self.train_metrics.clone(prefix="test_") - def forward(self, x: Tensor) -> Any: # type: ignore[override] - """Forward pass of the model.""" - return self.model(x) + def forward(self, *args: Any, **kwargs: Any) -> Any: + """Forward pass of the model. + + Args: + x: tensor of data to run through the model + + Returns: + output from the model + """ + return self.model(*args, **kwargs) - def training_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> Tensor: - """Training step with an MSE loss. + def training_step(self, *args: Any, **kwargs: Any) -> Tensor: + """Compute and return the training loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader Returns: training loss """ + batch = args[0] x = batch["image"] y = batch["label"].view(-1, 1) y_hat = self.forward(x) @@ -92,15 +98,15 @@ def training_epoch_end(self, outputs: Any) -> None: self.log_dict(self.train_metrics.compute()) self.train_metrics.reset() - def validation_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Validation step. + def validation_step(self, *args: Any, **kwargs: Any) -> None: + """Compute validation loss and log example predictions. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader + batch_idx: the index of this batch """ + batch = args[0] + batch_idx = args[1] x = batch["image"] y = batch["label"].view(-1, 1) y_hat = self.forward(x) @@ -133,15 +139,13 @@ def validation_epoch_end(self, outputs: Any) -> None: self.log_dict(self.val_metrics.compute()) self.val_metrics.reset() - def test_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Test step. + def test_step(self, *args: Any, **kwargs: Any) -> None: + """Compute test loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader """ + batch = args[0] x = batch["image"] y = batch["label"].view(-1, 1) y_hat = self.forward(x) @@ -167,13 +171,14 @@ def configure_optimizers(self) -> Dict[str, Any]: https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#configure-optimizers """ optimizer = torch.optim.AdamW( - self.model.parameters(), lr=self.hparams["learning_rate"] + self.model.parameters(), lr=self.hyperparams["learning_rate"] ) return { "optimizer": optimizer, "lr_scheduler": { "scheduler": ReduceLROnPlateau( - optimizer, patience=self.hparams["learning_rate_schedule_patience"] + optimizer, + patience=self.hyperparams["learning_rate_schedule_patience"], ), "monitor": "val_loss", }, diff --git a/torchgeo/trainers/segmentation.py b/torchgeo/trainers/segmentation.py index afc5937a688..f8949958220 100644 --- a/torchgeo/trainers/segmentation.py +++ b/torchgeo/trainers/segmentation.py @@ -27,45 +27,45 @@ class SemanticSegmentationTask(LightningModule): def config_task(self) -> None: """Configures the task based on kwargs parameters passed to the constructor.""" - if self.hparams["segmentation_model"] == "unet": + if self.hyperparams["segmentation_model"] == "unet": self.model = smp.Unet( - encoder_name=self.hparams["encoder_name"], - encoder_weights=self.hparams["encoder_weights"], - in_channels=self.hparams["in_channels"], - classes=self.hparams["num_classes"], + encoder_name=self.hyperparams["encoder_name"], + encoder_weights=self.hyperparams["encoder_weights"], + in_channels=self.hyperparams["in_channels"], + classes=self.hyperparams["num_classes"], ) - elif self.hparams["segmentation_model"] == "deeplabv3+": + elif self.hyperparams["segmentation_model"] == "deeplabv3+": self.model = smp.DeepLabV3Plus( - encoder_name=self.hparams["encoder_name"], - encoder_weights=self.hparams["encoder_weights"], - in_channels=self.hparams["in_channels"], - classes=self.hparams["num_classes"], + encoder_name=self.hyperparams["encoder_name"], + encoder_weights=self.hyperparams["encoder_weights"], + in_channels=self.hyperparams["in_channels"], + classes=self.hyperparams["num_classes"], ) - elif self.hparams["segmentation_model"] == "fcn": + elif self.hyperparams["segmentation_model"] == "fcn": self.model = FCN( - in_channels=self.hparams["in_channels"], - classes=self.hparams["num_classes"], - num_filters=self.hparams["num_filters"], + in_channels=self.hyperparams["in_channels"], + classes=self.hyperparams["num_classes"], + num_filters=self.hyperparams["num_filters"], ) else: raise ValueError( - f"Model type '{self.hparams['segmentation_model']}' is not valid." + f"Model type '{self.hyperparams['segmentation_model']}' is not valid." ) - if self.hparams["loss"] == "ce": - self.loss = nn.CrossEntropyLoss( # type: ignore[attr-defined] + if self.hyperparams["loss"] == "ce": + self.loss = nn.CrossEntropyLoss( ignore_index=-1000 if self.ignore_zeros is None else 0 ) - elif self.hparams["loss"] == "jaccard": + elif self.hyperparams["loss"] == "jaccard": self.loss = smp.losses.JaccardLoss( - mode="multiclass", classes=self.hparams["num_classes"] + mode="multiclass", classes=self.hyperparams["num_classes"] ) - elif self.hparams["loss"] == "focal": + elif self.hyperparams["loss"] == "focal": self.loss = smp.losses.FocalLoss( "multiclass", ignore_index=self.ignore_zeros, normalized=True ) else: - raise ValueError(f"Loss type '{self.hparams['loss']}' is not valid.") + raise ValueError(f"Loss type '{self.hyperparams['loss']}' is not valid.") def __init__(self, **kwargs: Any) -> None: """Initialize the LightningModule with a model and loss function. @@ -84,7 +84,10 @@ def __init__(self, **kwargs: Any) -> None: ValueError: if kwargs arguments are invalid """ super().__init__() - self.save_hyperparameters() # creates `self.hparams` from kwargs + + # Creates `self.hparams` from kwargs + self.save_hyperparameters() # type: ignore[operator] + self.hyperparams = cast(Dict[str, Any], self.hparams) self.ignore_zeros = None if kwargs["ignore_zeros"] else 0 @@ -93,11 +96,11 @@ def __init__(self, **kwargs: Any) -> None: self.train_metrics = MetricCollection( [ Accuracy( - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], ignore_index=self.ignore_zeros, ), JaccardIndex( - num_classes=self.hparams["num_classes"], + num_classes=self.hyperparams["num_classes"], ignore_index=self.ignore_zeros, ), ], @@ -106,7 +109,7 @@ def __init__(self, **kwargs: Any) -> None: self.val_metrics = self.train_metrics.clone(prefix="val_") self.test_metrics = self.train_metrics.clone(prefix="test_") - def forward(self, x: Tensor) -> Any: # type: ignore[override] + def forward(self, *args: Any, **kwargs: Any) -> Any: """Forward pass of the model. Args: @@ -115,20 +118,18 @@ def forward(self, x: Tensor) -> Any: # type: ignore[override] Returns: output from the model """ - return self.model(x) + return self.model(*args, **kwargs) - def training_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> Tensor: - """Training step - reports average accuracy and average JaccardIndex. + def training_step(self, *args: Any, **kwargs: Any) -> Tensor: + """Compute and return the training loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader Returns: training loss """ + batch = args[0] x = batch["image"] y = batch["mask"] y_hat = self.forward(x) @@ -152,18 +153,15 @@ def training_epoch_end(self, outputs: Any) -> None: self.log_dict(self.train_metrics.compute()) self.train_metrics.reset() - def validation_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Validation step - reports average accuracy and average JaccardIndex. - - Logs the first 10 validation samples to tensorboard as images with 3 subplots - showing the image, mask, and predictions. + def validation_step(self, *args: Any, **kwargs: Any) -> None: + """Compute validation loss and log example predictions. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader + batch_idx: the index of this batch """ + batch = args[0] + batch_idx = args[1] x = batch["image"] y = batch["mask"] y_hat = self.forward(x) @@ -198,15 +196,13 @@ def validation_epoch_end(self, outputs: Any) -> None: self.log_dict(self.val_metrics.compute()) self.val_metrics.reset() - def test_step( # type: ignore[override] - self, batch: Dict[str, Any], batch_idx: int - ) -> None: - """Test step identical to the validation step. + def test_step(self, *args: Any, **kwargs: Any) -> None: + """Compute test loss. Args: - batch: Current batch - batch_idx: Index of current batch + batch: the output of your DataLoader """ + batch = args[0] x = batch["image"] y = batch["mask"] y_hat = self.forward(x) @@ -235,13 +231,14 @@ def configure_optimizers(self) -> Dict[str, Any]: https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#configure-optimizers """ optimizer = torch.optim.Adam( - self.model.parameters(), lr=self.hparams["learning_rate"] + self.model.parameters(), lr=self.hyperparams["learning_rate"] ) return { "optimizer": optimizer, "lr_scheduler": { "scheduler": ReduceLROnPlateau( - optimizer, patience=self.hparams["learning_rate_schedule_patience"] + optimizer, + patience=self.hyperparams["learning_rate_schedule_patience"], ), "monitor": "val_loss", }, diff --git a/torchgeo/trainers/utils.py b/torchgeo/trainers/utils.py index e2e08a56702..8e04815c937 100644 --- a/torchgeo/trainers/utils.py +++ b/torchgeo/trainers/utils.py @@ -5,7 +5,7 @@ import warnings from collections import OrderedDict -from typing import Dict, Optional, Tuple, Union +from typing import Optional, Tuple, Union, cast import torch import torch.nn as nn @@ -18,7 +18,7 @@ Conv2d.__module__ = "nn.Conv2d" -def extract_encoder(path: str) -> Tuple[str, Dict[str, Tensor]]: +def extract_encoder(path: str) -> Tuple[str, "OrderedDict[str, Tensor]"]: """Extracts an encoder from a pytorch lightning checkpoint file. Args: @@ -32,7 +32,7 @@ def extract_encoder(path: str) -> Tuple[str, Dict[str, Tensor]]: checkpoint['hyper_parameters'] """ checkpoint = torch.load( # type: ignore[no-untyped-call] - path, map_location=torch.device("cpu") # type: ignore[attr-defined] + path, map_location=torch.device("cpu") ) if "classification_model" in checkpoint["hyper_parameters"]: @@ -60,7 +60,7 @@ def extract_encoder(path: str) -> Tuple[str, Dict[str, Tensor]]: return name, state_dict -def load_state_dict(model: Module, state_dict: Dict[str, Tensor]) -> Module: +def load_state_dict(model: Module, state_dict: "OrderedDict[str, Tensor]") -> Module: """Load pretrained resnet weights to a model. Args: @@ -74,9 +74,9 @@ def load_state_dict(model: Module, state_dict: Dict[str, Tensor]) -> Module: If input channels in model != pretrained model input channels If num output classes in model != pretrained model num classes """ - in_channels = model.conv1.in_channels # type: ignore[union-attr] + in_channels = cast(nn.Module, model.conv1).in_channels expected_in_channels = state_dict["conv1.weight"].shape[1] - num_classes = model.fc.out_features # type: ignore[union-attr] + num_classes = cast(nn.Module, model.fc).out_features expected_num_classes = state_dict["fc.weight"].shape[0] if in_channels != expected_in_channels: @@ -93,7 +93,7 @@ def load_state_dict(model: Module, state_dict: Dict[str, Tensor]) -> Module: ) del state_dict["fc.weight"], state_dict["fc.bias"] - model.load_state_dict(state_dict, strict=False) # type: ignore[arg-type] + model.load_state_dict(state_dict, strict=False) return model @@ -126,8 +126,7 @@ def reinit_initial_conv_layer( if keep_rgb_weights: w_old = layer.weight.data[:, :3, :, :].clone() if use_bias: - # mypy doesn't realize that bias isn't None here... - b_old = layer.bias.data.clone() # type: ignore[union-attr] + b_old = cast(Tensor, layer.bias).data.clone() updated_stride = layer.stride if new_stride is None else new_stride updated_padding = layer.padding if new_padding is None else new_padding @@ -150,6 +149,6 @@ def reinit_initial_conv_layer( if keep_rgb_weights: new_layer.weight.data[:, :3, :, :] = w_old if use_bias: - new_layer.bias.data = b_old # type: ignore[union-attr] + cast(Tensor, new_layer.bias).data = b_old return new_layer diff --git a/torchgeo/transforms/indices.py b/torchgeo/transforms/indices.py index aea72a080f2..b002b845903 100644 --- a/torchgeo/transforms/indices.py +++ b/torchgeo/transforms/indices.py @@ -74,9 +74,7 @@ def forward(self, sample: Dict[str, Tensor]) -> Dict[str, Tensor]: ) index = index.unsqueeze(self.dim) - sample["image"] = torch.cat( # type: ignore[attr-defined] - [sample["image"], index], dim=self.dim - ) + sample["image"] = torch.cat([sample["image"], index], dim=self.dim) return sample @@ -359,8 +357,6 @@ def forward(self, sample: Dict[str, Tensor]) -> Dict[str, Tensor]: ) index = index.unsqueeze(self.dim) - sample["image"] = torch.cat( # type: ignore[attr-defined] - [sample["image"], index], dim=self.dim - ) + sample["image"] = torch.cat([sample["image"], index], dim=self.dim) return sample diff --git a/torchgeo/transforms/transforms.py b/torchgeo/transforms/transforms.py index 67be28c31bb..550a295e5cb 100644 --- a/torchgeo/transforms/transforms.py +++ b/torchgeo/transforms/transforms.py @@ -51,12 +51,10 @@ def forward(self, sample: Dict[str, Tensor]) -> Dict[str, Tensor]: # Kornia augmentations require masks & boxes to be float if "mask" in self.data_keys: mask_dtype = sample["mask"].dtype - sample["mask"] = sample["mask"].to(torch.float) # type:ignore[attr-defined] + sample["mask"] = sample["mask"].to(torch.float) if "boxes" in self.data_keys: boxes_dtype = sample["boxes"].dtype - sample["boxes"] = sample["boxes"].to( - torch.float # type:ignore[attr-defined] - ) + sample["boxes"] = sample["boxes"].to(torch.float) inputs = [sample[k] for k in self.data_keys] outputs_list: Union[Tensor, List[Tensor]] = self.augs(*inputs) From 1d8e010442f12faf775cad28768384b951f1679c Mon Sep 17 00:00:00 2001 From: Ashwin Nair Date: Tue, 15 Mar 2022 17:36:51 +0400 Subject: [PATCH 2/2] Update hook (#464) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ee443d2def8..19fd7a2db5c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,9 +24,9 @@ repos: additional_dependencies: ["toml"] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.931 + rev: v0.940 hooks: - id: mypy args: [--strict, --ignore-missing-imports, --show-error-codes] - additional_dependencies: [torch>=1.7, torchmetrics>=0.7, pytorch-lightning>=1.3, pytest>=6, omegaconf>=2.1, kornia>=0.6, numpy>=1.22.0] + additional_dependencies: [torch>=1.11, torchmetrics>=0.7, pytorch-lightning>=1.3, pytest>=6, omegaconf>=2.1, kornia>=0.6, numpy>=1.22.0] exclude: (build|data|dist|logo|logs|output)/