From b2f6615a59c1047a91affef2ed893d38839c7e27 Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Thu, 20 May 2021 12:47:27 +0530 Subject: [PATCH 1/8] fix --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 58daa471f5c..ef4cdc0cee0 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = -W # turn warnings into errors +SPHINXOPTS = # turn warnings into errors SPHINXBUILD = sphinx-build SPHINXPROJ = torchvision SOURCEDIR = source From fa9eb089988ff02d484a1fea4984bf5175cce110 Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Sat, 31 Jul 2021 00:04:15 +0530 Subject: [PATCH 2/8] add functional PIL typings --- torchvision/transforms/functional_pil.py | 93 ++++++++++++++++++------ 1 file changed, 71 insertions(+), 22 deletions(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 3829637fdb7..74d1cff60ca 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -1,5 +1,5 @@ import numbers -from typing import Any, List, Sequence +from typing import Any, Dict, List, Optional, Sequence, Tuple, Union import numpy as np import torch @@ -34,7 +34,7 @@ def _get_image_num_channels(img: Any) -> int: @torch.jit.unused -def hflip(img): +def hflip(img: Image.Image) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -42,7 +42,7 @@ def hflip(img): @torch.jit.unused -def vflip(img): +def vflip(img: Image.Image) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -50,7 +50,7 @@ def vflip(img): @torch.jit.unused -def adjust_brightness(img, brightness_factor): +def adjust_brightness(img: Image.Image, brightness_factor: float) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -60,7 +60,7 @@ def adjust_brightness(img, brightness_factor): @torch.jit.unused -def adjust_contrast(img, contrast_factor): +def adjust_contrast(img: Image.Image, contrast_factor: float) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -70,7 +70,7 @@ def adjust_contrast(img, contrast_factor): @torch.jit.unused -def adjust_saturation(img, saturation_factor): +def adjust_saturation(img: Image.Image, saturation_factor: float) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -80,7 +80,7 @@ def adjust_saturation(img, saturation_factor): @torch.jit.unused -def adjust_hue(img, hue_factor): +def adjust_hue(img: Image.Image, hue_factor: float) -> Image.Image: if not(-0.5 <= hue_factor <= 0.5): raise ValueError('hue_factor ({}) is not in [-0.5, 0.5].'.format(hue_factor)) @@ -104,7 +104,12 @@ def adjust_hue(img, hue_factor): @torch.jit.unused -def adjust_gamma(img, gamma, gain=1): +def adjust_gamma( + img: Image.Image, + gamma: float, + gain: int = 1, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -121,7 +126,13 @@ def adjust_gamma(img, gamma, gain=1): @torch.jit.unused -def pad(img, padding, fill=0, padding_mode="constant"): +def pad( + img: Image.Image, + padding: Union[int, List, Tuple], + fill: Union[str, int, Tuple] = 0, + padding_mode: str = "constant", +) -> Image.Image: + if not _is_pil_image(img): raise TypeError("img should be PIL Image. Got {}".format(type(img))) @@ -196,7 +207,14 @@ def pad(img, padding, fill=0, padding_mode="constant"): @torch.jit.unused -def crop(img: Image.Image, top: int, left: int, height: int, width: int) -> Image.Image: +def crop( + img: Image.Image, + top: int, + left: int, + height: int, + width: int, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -204,7 +222,13 @@ def crop(img: Image.Image, top: int, left: int, height: int, width: int) -> Imag @torch.jit.unused -def resize(img, size, interpolation=Image.BILINEAR, max_size=None): +def resize( + img: Image.Image, + size: Union[Sequence, int], + interpolation=Image.BILINEAR, + max_size: Optional[int] = None, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) if not (isinstance(size, int) or (isinstance(size, Sequence) and len(size) in (1, 2))): @@ -242,7 +266,12 @@ def resize(img, size, interpolation=Image.BILINEAR, max_size=None): @torch.jit.unused -def _parse_fill(fill, img, name="fillcolor"): +def _parse_fill( + fill: Union[int, float, List, Tuple], + img: Image.Image, + name: str = "fillcolor", +) -> Dict[str, Union[int, float, List, Tuple]]: + # Process fill color for affine transforms num_bands = len(img.getbands()) if fill is None: @@ -261,7 +290,13 @@ def _parse_fill(fill, img, name="fillcolor"): @torch.jit.unused -def affine(img, matrix, interpolation=0, fill=None): +def affine( + img: Image.Image, + matrix, + interpolation: int = 0, + fill: Optional[Union[int, float, List, Tuple]] = None, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -271,7 +306,15 @@ def affine(img, matrix, interpolation=0, fill=None): @torch.jit.unused -def rotate(img, angle, interpolation=0, expand=False, center=None, fill=None): +def rotate( + img: Image.Image, + angle: float, + interpolation: int = 0, + expand: bool = False, + center: Optional[Tuple[int, int]] = None, + fill: Optional[Union[int, float, List, Tuple]] = None, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError("img should be PIL Image. Got {}".format(type(img))) @@ -280,7 +323,13 @@ def rotate(img, angle, interpolation=0, expand=False, center=None, fill=None): @torch.jit.unused -def perspective(img, perspective_coeffs, interpolation=Image.BICUBIC, fill=None): +def perspective( + img: Image.Image, + perspective_coeffs: float, + interpolation=Image.BICUBIC, + fill: Optional[Union[int, float, List, Tuple]] = None, +) -> Image.Image: + if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -290,7 +339,7 @@ def perspective(img, perspective_coeffs, interpolation=Image.BICUBIC, fill=None) @torch.jit.unused -def to_grayscale(img, num_output_channels): +def to_grayscale(img: Image.Image, num_output_channels: int) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -308,28 +357,28 @@ def to_grayscale(img, num_output_channels): @torch.jit.unused -def invert(img): +def invert(img: Image.Image) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) return ImageOps.invert(img) @torch.jit.unused -def posterize(img, bits): +def posterize(img: Image.Image, bits: int) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) return ImageOps.posterize(img, bits) @torch.jit.unused -def solarize(img, threshold): +def solarize(img: Image.Image, threshold: int) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) return ImageOps.solarize(img, threshold) @torch.jit.unused -def adjust_sharpness(img, sharpness_factor): +def adjust_sharpness(img: Image.Image, sharpness_factor: float) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) @@ -339,14 +388,14 @@ def adjust_sharpness(img, sharpness_factor): @torch.jit.unused -def autocontrast(img): +def autocontrast(img: Image.Image) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) return ImageOps.autocontrast(img) @torch.jit.unused -def equalize(img): +def equalize(img: Image.Image) -> Image.Image: if not _is_pil_image(img): raise TypeError('img should be PIL Image. Got {}'.format(type(img))) return ImageOps.equalize(img) From 1e6dd9edb36edc3e2dfa0de1f735bf929fe0e8b4 Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Sat, 31 Jul 2021 00:09:05 +0530 Subject: [PATCH 3/8] fix types --- torchvision/transforms/functional_pil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 74d1cff60ca..f373cf56ec9 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -107,7 +107,7 @@ def adjust_hue(img: Image.Image, hue_factor: float) -> Image.Image: def adjust_gamma( img: Image.Image, gamma: float, - gain: int = 1, + gain: float = 1, ) -> Image.Image: if not _is_pil_image(img): From 9d294f885e0a6178110765624bf0e3ef76537baf Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Tue, 17 Aug 2021 00:32:04 +0530 Subject: [PATCH 4/8] fix types --- torchvision/transforms/functional_pil.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index f373cf56ec9..092945ce507 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -107,7 +107,7 @@ def adjust_hue(img: Image.Image, hue_factor: float) -> Image.Image: def adjust_gamma( img: Image.Image, gamma: float, - gain: float = 1, + gain: float = 1.0, ) -> Image.Image: if not _is_pil_image(img): @@ -128,8 +128,8 @@ def adjust_gamma( @torch.jit.unused def pad( img: Image.Image, - padding: Union[int, List, Tuple], - fill: Union[str, int, Tuple] = 0, + padding: Union[int, List[int], Tuple[int, ...]], + fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]], padding_mode: str = "constant", ) -> Image.Image: @@ -224,8 +224,8 @@ def crop( @torch.jit.unused def resize( img: Image.Image, - size: Union[Sequence, int], - interpolation=Image.BILINEAR, + size: Union[Sequence[int], int], + interpolation: int = Image.BILINEAR, max_size: Optional[int] = None, ) -> Image.Image: @@ -267,7 +267,7 @@ def resize( @torch.jit.unused def _parse_fill( - fill: Union[int, float, List, Tuple], + fill: Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]], img: Image.Image, name: str = "fillcolor", ) -> Dict[str, Union[int, float, List, Tuple]]: @@ -292,9 +292,9 @@ def _parse_fill( @torch.jit.unused def affine( img: Image.Image, - matrix, + matrix: List[float], interpolation: int = 0, - fill: Optional[Union[int, float, List, Tuple]] = None, + fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): @@ -312,7 +312,7 @@ def rotate( interpolation: int = 0, expand: bool = False, center: Optional[Tuple[int, int]] = None, - fill: Optional[Union[int, float, List, Tuple]] = None, + fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): @@ -327,7 +327,7 @@ def perspective( img: Image.Image, perspective_coeffs: float, interpolation=Image.BICUBIC, - fill: Optional[Union[int, float, List, Tuple]] = None, + fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): From 6bfd004deec72856844e155e05b419530363c283 Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Tue, 17 Aug 2021 00:34:59 +0530 Subject: [PATCH 5/8] fix a small one --- torchvision/transforms/functional_pil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 092945ce507..6e5c2b1f14a 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -326,7 +326,7 @@ def rotate( def perspective( img: Image.Image, perspective_coeffs: float, - interpolation=Image.BICUBIC, + interpolation: int = Image.BICUBIC, fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, ) -> Image.Image: From 0dce8534e1f4d3d34e315ef4e273455f9b2129ea Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Tue, 17 Aug 2021 00:52:32 +0530 Subject: [PATCH 6/8] small fix --- torchvision/transforms/functional_pil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 6e5c2b1f14a..30e469789d4 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -270,7 +270,7 @@ def _parse_fill( fill: Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]], img: Image.Image, name: str = "fillcolor", -) -> Dict[str, Union[int, float, List, Tuple]]: +) -> Dict[str, Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]]: # Process fill color for affine transforms num_bands = len(img.getbands()) From b6e1638444a1be60c2217fa72687f2a33aefec8e Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Tue, 17 Aug 2021 19:40:26 +0530 Subject: [PATCH 7/8] fix type --- torchvision/transforms/functional_pil.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 30e469789d4..1c0dfffef15 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -129,7 +129,7 @@ def adjust_gamma( def pad( img: Image.Image, padding: Union[int, List[int], Tuple[int, ...]], - fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]], + fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0, padding_mode: str = "constant", ) -> Image.Image: @@ -267,10 +267,10 @@ def resize( @torch.jit.unused def _parse_fill( - fill: Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]], + fill: Optional[Union[float, List[float], Tuple[float, ...]]], img: Image.Image, name: str = "fillcolor", -) -> Dict[str, Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]]: +) -> Dict[str, Optional[Union[float, List[float], Tuple[float, ...]]]]: # Process fill color for affine transforms num_bands = len(img.getbands()) @@ -294,7 +294,7 @@ def affine( img: Image.Image, matrix: List[float], interpolation: int = 0, - fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, + fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): @@ -312,7 +312,7 @@ def rotate( interpolation: int = 0, expand: bool = False, center: Optional[Tuple[int, int]] = None, - fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, + fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): @@ -327,7 +327,7 @@ def perspective( img: Image.Image, perspective_coeffs: float, interpolation: int = Image.BICUBIC, - fill: Optional[Union[numbers.Number, List[numbers.Number], Tuple[numbers.Number, ...]]] = 0, + fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0, ) -> Image.Image: if not _is_pil_image(img): From 3de8a936a1c8eb9f54e595f4a4c1591798ea792d Mon Sep 17 00:00:00 2001 From: Aditya Oke Date: Tue, 17 Aug 2021 22:55:39 +0530 Subject: [PATCH 8/8] fix interpolation types --- torchvision/transforms/functional_pil.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchvision/transforms/functional_pil.py b/torchvision/transforms/functional_pil.py index 1c0dfffef15..0f3d1d87bb4 100644 --- a/torchvision/transforms/functional_pil.py +++ b/torchvision/transforms/functional_pil.py @@ -293,7 +293,7 @@ def _parse_fill( def affine( img: Image.Image, matrix: List[float], - interpolation: int = 0, + interpolation: int = Image.NEAREST, fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0, ) -> Image.Image: @@ -309,7 +309,7 @@ def affine( def rotate( img: Image.Image, angle: float, - interpolation: int = 0, + interpolation: int = Image.NEAREST, expand: bool = False, center: Optional[Tuple[int, int]] = None, fill: Optional[Union[float, List[float], Tuple[float, ...]]] = 0,