From 126c594963cea402085b0608e427fda50a9edf39 Mon Sep 17 00:00:00 2001 From: vballoli Date: Mon, 14 Sep 2020 00:10:38 +0530 Subject: [PATCH 1/8] Add float support to ColorJitter --- torchvision/transforms/transforms.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/torchvision/transforms/transforms.py b/torchvision/transforms/transforms.py index b995101c3c7..974248d6266 100644 --- a/torchvision/transforms/transforms.py +++ b/torchvision/transforms/transforms.py @@ -3,7 +3,7 @@ import random import warnings from collections.abc import Sequence -from typing import Tuple, List, Optional +from typing import Tuple, List, Optional, Union import torch from PIL import Image @@ -1018,8 +1018,9 @@ def __init__(self, brightness=0, contrast=0, saturation=0, hue=0): self.hue = self._check_input(hue, 'hue', center=0, bound=(-0.5, 0.5), clip_first_on_zero=False) + @staticmethod @torch.jit.unused - def _check_input(self, value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): + def _check_input(value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): if isinstance(value, numbers.Number): if value < 0: raise ValueError("If {} is a single number, it must be non negative.".format(name)) @@ -1040,7 +1041,7 @@ def _check_input(self, value, name, center=1, bound=(0, float('inf')), clip_firs @staticmethod @torch.jit.unused - def get_params(brightness, contrast, saturation, hue): + def get_params(brightness: Union[float, tuple], contrast: Union[float, tuple], saturation: Union[float, tuple], hue: Union[float, tuple]): """Get a randomized transform to be applied on image. Arguments are same as that of __init__. @@ -1052,18 +1053,26 @@ def get_params(brightness, contrast, saturation, hue): transforms = [] if brightness is not None: + if isinstance(brightness, float): + ColorJitter._check_input(brightness, 'brightness') brightness_factor = random.uniform(brightness[0], brightness[1]) transforms.append(Lambda(lambda img: F.adjust_brightness(img, brightness_factor))) if contrast is not None: + if isinstance(contrast, float): + ColorJitter._check_input(contrast, 'contrast') contrast_factor = random.uniform(contrast[0], contrast[1]) transforms.append(Lambda(lambda img: F.adjust_contrast(img, contrast_factor))) if saturation is not None: + if isinstance(saturation, float): + ColorJitter._check_input(saturation, 'saturation') saturation_factor = random.uniform(saturation[0], saturation[1]) transforms.append(Lambda(lambda img: F.adjust_saturation(img, saturation_factor))) if hue is not None: + if isinstance(hue, float): + ColorJitter._check_input(hue, 'hue') hue_factor = random.uniform(hue[0], hue[1]) transforms.append(Lambda(lambda img: F.adjust_hue(img, hue_factor))) From aabc455843ed66817f8eac427219b40c2a73ce58 Mon Sep 17 00:00:00 2001 From: vballoli Date: Mon, 14 Sep 2020 01:00:38 +0530 Subject: [PATCH 2/8] Fix byclass EMNIST --- torchvision/datasets/mnist.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/torchvision/datasets/mnist.py b/torchvision/datasets/mnist.py index 8cf82c30a0f..c28d5479d2c 100644 --- a/torchvision/datasets/mnist.py +++ b/torchvision/datasets/mnist.py @@ -247,10 +247,10 @@ class EMNIST(MNIST): md5 = "58c8d27c78d21e728a6bc7b3cc06412e" splits = ('byclass', 'bymerge', 'balanced', 'letters', 'digits', 'mnist') # Merged Classes assumes Same structure for both uppercase and lowercase version - _merged_classes = set(['C', 'I', 'J', 'K', 'L', 'M', 'O', 'P', 'S', 'U', 'V', 'W', 'X', 'Y', 'Z']) + _merged_classes = set(['c', 'i', 'j', 'k', 'l', 'm', 'o', 'p', 's', 'u', 'v', 'w', 'x', 'y', 'z']) _all_classes = set(list(string.digits + string.ascii_letters)) classes_split_dict = { - 'byclass': list(_all_classes), + 'byclass': sorted(list(_all_classes)), 'bymerge': sorted(list(_all_classes - _merged_classes)), 'balanced': sorted(list(_all_classes - _merged_classes)), 'letters': list(string.ascii_lowercase), @@ -265,6 +265,9 @@ def __init__(self, root: str, split: str, **kwargs: Any) -> None: super(EMNIST, self).__init__(root, **kwargs) self.classes = self.classes_split_dict[self.split] + if self.target_transform is None and self.split == 'letters': + self.target_transform = lambda x: x+1 + @staticmethod def _training_file(split) -> str: return 'training_{}.pt'.format(split) From 945e056a0a9c8926f036374534ab49e276470186 Mon Sep 17 00:00:00 2001 From: vballoli Date: Mon, 14 Sep 2020 01:31:55 +0530 Subject: [PATCH 3/8] Fix bymerge, balance, letters EMNIST --- torchvision/datasets/mnist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/datasets/mnist.py b/torchvision/datasets/mnist.py index c28d5479d2c..dba9d1c12ca 100644 --- a/torchvision/datasets/mnist.py +++ b/torchvision/datasets/mnist.py @@ -266,7 +266,7 @@ def __init__(self, root: str, split: str, **kwargs: Any) -> None: self.classes = self.classes_split_dict[self.split] if self.target_transform is None and self.split == 'letters': - self.target_transform = lambda x: x+1 + self.target_transform = lambda x: x-1 @staticmethod def _training_file(split) -> str: From 87b2548961af8c4e45f95db04df99e119b1acb44 Mon Sep 17 00:00:00 2001 From: vballoli Date: Mon, 14 Sep 2020 01:36:36 +0530 Subject: [PATCH 4/8] Fix whitespace indent --- torchvision/datasets/mnist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/datasets/mnist.py b/torchvision/datasets/mnist.py index dba9d1c12ca..c51836db0a2 100644 --- a/torchvision/datasets/mnist.py +++ b/torchvision/datasets/mnist.py @@ -266,7 +266,7 @@ def __init__(self, root: str, split: str, **kwargs: Any) -> None: self.classes = self.classes_split_dict[self.split] if self.target_transform is None and self.split == 'letters': - self.target_transform = lambda x: x-1 + self.target_transform = lambda x: x - 1 @staticmethod def _training_file(split) -> str: From 4d8762be6d7e74d3aad763d291639560775f5e81 Mon Sep 17 00:00:00 2001 From: Vaibhav Balloli Date: Mon, 14 Sep 2020 01:40:18 +0530 Subject: [PATCH 5/8] Revert unrelated file changes --- torchvision/transforms/transforms.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/torchvision/transforms/transforms.py b/torchvision/transforms/transforms.py index 974248d6266..38892b6e3b3 100644 --- a/torchvision/transforms/transforms.py +++ b/torchvision/transforms/transforms.py @@ -3,7 +3,7 @@ import random import warnings from collections.abc import Sequence -from typing import Tuple, List, Optional, Union +from typing import Tuple, List, Optional import torch from PIL import Image @@ -1018,7 +1018,6 @@ def __init__(self, brightness=0, contrast=0, saturation=0, hue=0): self.hue = self._check_input(hue, 'hue', center=0, bound=(-0.5, 0.5), clip_first_on_zero=False) - @staticmethod @torch.jit.unused def _check_input(value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): if isinstance(value, numbers.Number): @@ -1053,26 +1052,18 @@ def get_params(brightness: Union[float, tuple], contrast: Union[float, tuple], s transforms = [] if brightness is not None: - if isinstance(brightness, float): - ColorJitter._check_input(brightness, 'brightness') brightness_factor = random.uniform(brightness[0], brightness[1]) transforms.append(Lambda(lambda img: F.adjust_brightness(img, brightness_factor))) if contrast is not None: - if isinstance(contrast, float): - ColorJitter._check_input(contrast, 'contrast') contrast_factor = random.uniform(contrast[0], contrast[1]) transforms.append(Lambda(lambda img: F.adjust_contrast(img, contrast_factor))) if saturation is not None: - if isinstance(saturation, float): - ColorJitter._check_input(saturation, 'saturation') saturation_factor = random.uniform(saturation[0], saturation[1]) transforms.append(Lambda(lambda img: F.adjust_saturation(img, saturation_factor))) if hue is not None: - if isinstance(hue, float): - ColorJitter._check_input(hue, 'hue') hue_factor = random.uniform(hue[0], hue[1]) transforms.append(Lambda(lambda img: F.adjust_hue(img, hue_factor))) From 8bf3c05eba16d93d7b220cba816459244f466d68 Mon Sep 17 00:00:00 2001 From: Vaibhav Balloli Date: Mon, 14 Sep 2020 01:41:14 +0530 Subject: [PATCH 6/8] Revert unrelated file changes --- torchvision/transforms/transforms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchvision/transforms/transforms.py b/torchvision/transforms/transforms.py index 38892b6e3b3..b995101c3c7 100644 --- a/torchvision/transforms/transforms.py +++ b/torchvision/transforms/transforms.py @@ -1019,7 +1019,7 @@ def __init__(self, brightness=0, contrast=0, saturation=0, hue=0): clip_first_on_zero=False) @torch.jit.unused - def _check_input(value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): + def _check_input(self, value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): if isinstance(value, numbers.Number): if value < 0: raise ValueError("If {} is a single number, it must be non negative.".format(name)) @@ -1040,7 +1040,7 @@ def _check_input(value, name, center=1, bound=(0, float('inf')), clip_first_on_z @staticmethod @torch.jit.unused - def get_params(brightness: Union[float, tuple], contrast: Union[float, tuple], saturation: Union[float, tuple], hue: Union[float, tuple]): + def get_params(brightness, contrast, saturation, hue): """Get a randomized transform to be applied on image. Arguments are same as that of __init__. From 8cb45319200d7a22c0b9b7f5132b588ab26b1564 Mon Sep 17 00:00:00 2001 From: Vasileios Vryniotis Date: Fri, 23 Oct 2020 11:44:50 +0100 Subject: [PATCH 7/8] Removing unnecessary type conversions. --- torchvision/datasets/mnist.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchvision/datasets/mnist.py b/torchvision/datasets/mnist.py index c51836db0a2..fe344a3d32a 100644 --- a/torchvision/datasets/mnist.py +++ b/torchvision/datasets/mnist.py @@ -247,8 +247,8 @@ class EMNIST(MNIST): md5 = "58c8d27c78d21e728a6bc7b3cc06412e" splits = ('byclass', 'bymerge', 'balanced', 'letters', 'digits', 'mnist') # Merged Classes assumes Same structure for both uppercase and lowercase version - _merged_classes = set(['c', 'i', 'j', 'k', 'l', 'm', 'o', 'p', 's', 'u', 'v', 'w', 'x', 'y', 'z']) - _all_classes = set(list(string.digits + string.ascii_letters)) + _merged_classes = {'c', 'i', 'j', 'k', 'l', 'm', 'o', 'p', 's', 'u', 'v', 'w', 'x', 'y', 'z'} + _all_classes = set(string.digits + string.ascii_letters) classes_split_dict = { 'byclass': sorted(list(_all_classes)), 'bymerge': sorted(list(_all_classes - _merged_classes)), From fa7dd623a05c51cf01ba7eccfc692dca28635239 Mon Sep 17 00:00:00 2001 From: Vasileios Vryniotis Date: Fri, 23 Oct 2020 12:04:42 +0100 Subject: [PATCH 8/8] Removing the transform and adding dummy class instead. --- torchvision/datasets/mnist.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/torchvision/datasets/mnist.py b/torchvision/datasets/mnist.py index fe344a3d32a..ea1c7d24c7a 100644 --- a/torchvision/datasets/mnist.py +++ b/torchvision/datasets/mnist.py @@ -253,7 +253,7 @@ class EMNIST(MNIST): 'byclass': sorted(list(_all_classes)), 'bymerge': sorted(list(_all_classes - _merged_classes)), 'balanced': sorted(list(_all_classes - _merged_classes)), - 'letters': list(string.ascii_lowercase), + 'letters': ['N/A'] + list(string.ascii_lowercase), 'digits': list(string.digits), 'mnist': list(string.digits), } @@ -265,9 +265,6 @@ def __init__(self, root: str, split: str, **kwargs: Any) -> None: super(EMNIST, self).__init__(root, **kwargs) self.classes = self.classes_split_dict[self.split] - if self.target_transform is None and self.split == 'letters': - self.target_transform = lambda x: x - 1 - @staticmethod def _training_file(split) -> str: return 'training_{}.pt'.format(split)