From cfdf7e9038e659de737a03fb2ec33d095aabb16b Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Wed, 2 Nov 2022 15:51:21 +0000 Subject: [PATCH 1/4] Ported `resize` --- .../transforms/functional/_geometry.py | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/torchvision/prototype/transforms/functional/_geometry.py b/torchvision/prototype/transforms/functional/_geometry.py index 9ed8a965ee3..a5661a3faa6 100644 --- a/torchvision/prototype/transforms/functional/_geometry.py +++ b/torchvision/prototype/transforms/functional/_geometry.py @@ -4,6 +4,7 @@ import PIL.Image import torch +from torch.nn.functional import interpolate from torchvision.prototype import features from torchvision.transforms import functional_pil as _FP, functional_tensor as _FT from torchvision.transforms.functional import ( @@ -122,13 +123,30 @@ def resize_image_tensor( if image.numel() > 0: image = image.reshape(-1, num_channels, old_height, old_width) - image = _FT.resize( + align_corners: Optional[bool] = None + if interpolation == InterpolationMode.BILINEAR or interpolation == InterpolationMode.BICUBIC: + align_corners = False + elif antialias: + raise ValueError("Antialias option is supported for bilinear and bicubic interpolation modes only") + + dtype = image.dtype + fp = torch.is_floating_point(image) + if not fp: + image = image.to(dtype=torch.float32) + + image = interpolate( image, size=[new_height, new_width], - interpolation=interpolation.value, + mode=interpolation.value, + align_corners=align_corners, antialias=antialias, ) + if not fp: + if interpolation == InterpolationMode.BICUBIC and dtype == torch.uint8: + image = image.clamp_(min=0, max=255) + image = image.round_().to(dtype=dtype) + return image.reshape(shape[:-3] + (num_channels, new_height, new_width)) @@ -1317,9 +1335,11 @@ def resized_crop( def _parse_five_crop_size(size: List[int]) -> List[int]: if isinstance(size, numbers.Number): - size = [int(size), int(size)] + s = int(size) + size = [s, s] elif isinstance(size, (tuple, list)) and len(size) == 1: - size = [size[0], size[0]] + s = size[0] + size = [s, s] if len(size) != 2: raise ValueError("Please provide only two dimensions (h, w) for size.") From e86be020fa077703d2983e1f2ee97bf48fafca69 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Wed, 2 Nov 2022 16:28:11 +0000 Subject: [PATCH 2/4] Align with previous behaviour --- torchvision/prototype/transforms/functional/_geometry.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/torchvision/prototype/transforms/functional/_geometry.py b/torchvision/prototype/transforms/functional/_geometry.py index a5661a3faa6..47bd39611b9 100644 --- a/torchvision/prototype/transforms/functional/_geometry.py +++ b/torchvision/prototype/transforms/functional/_geometry.py @@ -130,8 +130,8 @@ def resize_image_tensor( raise ValueError("Antialias option is supported for bilinear and bicubic interpolation modes only") dtype = image.dtype - fp = torch.is_floating_point(image) - if not fp: + need_cast = dtype != torch.float32 and dtype != torch.float64 + if need_cast: image = image.to(dtype=torch.float32) image = interpolate( @@ -142,7 +142,7 @@ def resize_image_tensor( antialias=antialias, ) - if not fp: + if need_cast: if interpolation == InterpolationMode.BICUBIC and dtype == torch.uint8: image = image.clamp_(min=0, max=255) image = image.round_().to(dtype=dtype) From 5d6f9ea0d9e66ebda3e43c4937576933a0ca198c Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Thu, 3 Nov 2022 09:01:24 +0000 Subject: [PATCH 3/4] Update torchvision/prototype/transforms/functional/_geometry.py Co-authored-by: Philip Meier --- torchvision/prototype/transforms/functional/_geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/prototype/transforms/functional/_geometry.py b/torchvision/prototype/transforms/functional/_geometry.py index 2f7af4818ea..f0cb8dd1cc2 100644 --- a/torchvision/prototype/transforms/functional/_geometry.py +++ b/torchvision/prototype/transforms/functional/_geometry.py @@ -130,7 +130,7 @@ def resize_image_tensor( raise ValueError("Antialias option is supported for bilinear and bicubic interpolation modes only") dtype = image.dtype - need_cast = dtype != torch.float32 and dtype != torch.float64 + need_cast = dtype not in (torch.float32, torch.float64) if need_cast: image = image.to(dtype=torch.float32) From d8ead3fffebeac82b11b1b7a4ec328188dab267b Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Thu, 3 Nov 2022 09:03:47 +0000 Subject: [PATCH 4/4] Moving input verification on top of method. --- .../prototype/transforms/functional/_geometry.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/torchvision/prototype/transforms/functional/_geometry.py b/torchvision/prototype/transforms/functional/_geometry.py index f0cb8dd1cc2..95f620f68b7 100644 --- a/torchvision/prototype/transforms/functional/_geometry.py +++ b/torchvision/prototype/transforms/functional/_geometry.py @@ -116,6 +116,12 @@ def resize_image_tensor( max_size: Optional[int] = None, antialias: bool = False, ) -> torch.Tensor: + align_corners: Optional[bool] = None + if interpolation == InterpolationMode.BILINEAR or interpolation == InterpolationMode.BICUBIC: + align_corners = False + elif antialias: + raise ValueError("Antialias option is supported for bilinear and bicubic interpolation modes only") + shape = image.shape num_channels, old_height, old_width = shape[-3:] new_height, new_width = _compute_resized_output_size((old_height, old_width), size=size, max_size=max_size) @@ -123,12 +129,6 @@ def resize_image_tensor( if image.numel() > 0: image = image.reshape(-1, num_channels, old_height, old_width) - align_corners: Optional[bool] = None - if interpolation == InterpolationMode.BILINEAR or interpolation == InterpolationMode.BICUBIC: - align_corners = False - elif antialias: - raise ValueError("Antialias option is supported for bilinear and bicubic interpolation modes only") - dtype = image.dtype need_cast = dtype not in (torch.float32, torch.float64) if need_cast: