updated UA parameter check, fixed PyLint errors. fixed UA parameter validator bug Updated UA C++ description Changed py and cpp UA decorator namestags/v0.5.0-beta
| @@ -45,7 +45,7 @@ import mindspore._c_dataengine as cde | |||
| from .utils import Inter, Border | |||
| from .validators import check_prob, check_crop, check_resize_interpolation, check_random_resize_crop, \ | |||
| check_normalize_c, check_random_crop, check_random_color_adjust, check_random_rotation, \ | |||
| check_resize, check_rescale, check_pad, check_cutout, check_uniform_augmentation | |||
| check_resize, check_rescale, check_pad, check_cutout, check_uniform_augment_cpp | |||
| DE_C_INTER_MODE = {Inter.NEAREST: cde.InterpolationMode.DE_INTER_NEAREST_NEIGHBOUR, | |||
| Inter.LINEAR: cde.InterpolationMode.DE_INTER_LINEAR, | |||
| @@ -456,7 +456,7 @@ class UniformAugment(cde.UniformAugOp): | |||
| Args: | |||
| operations: list of C++ operations (python OPs are not accepted). | |||
| num_ops (int): number of OPs to be selected and applied. | |||
| num_ops (int, optional): number of OPs to be selected and applied (default=2). | |||
| Examples: | |||
| >>> transforms_list = [c_transforms.RandomHorizontalFlip(), | |||
| @@ -470,7 +470,7 @@ class UniformAugment(cde.UniformAugOp): | |||
| >>> operations=transforms_all, num_parallel_workers=1) | |||
| """ | |||
| @check_uniform_augmentation | |||
| @check_uniform_augment_cpp | |||
| def __init__(self, operations, num_ops=2): | |||
| self.operations = operations | |||
| self.num_ops = num_ops | |||
| @@ -32,7 +32,7 @@ from .validators import check_prob, check_crop, check_resize_interpolation, chec | |||
| check_normalize_py, check_random_crop, check_random_color_adjust, check_random_rotation, \ | |||
| check_transforms_list, check_random_apply, check_ten_crop, check_num_channels, check_pad, \ | |||
| check_random_perspective, check_random_erasing, check_cutout, check_linear_transform, check_random_affine, \ | |||
| check_mix_up | |||
| check_mix_up, check_positive_degrees, check_uniform_augment_py | |||
| from .utils import Inter, Border | |||
| DE_PY_INTER_MODE = {Inter.NEAREST: Image.NEAREST, | |||
| @@ -1329,6 +1329,7 @@ class RandomColor: | |||
| >>> py_transforms.ToTensor()]) | |||
| """ | |||
| @check_positive_degrees | |||
| def __init__(self, degrees=(0.1, 1.9)): | |||
| self.degrees = degrees | |||
| @@ -1361,6 +1362,7 @@ class RandomSharpness: | |||
| """ | |||
| @check_positive_degrees | |||
| def __init__(self, degrees=(0.1, 1.9)): | |||
| self.degrees = degrees | |||
| @@ -1458,6 +1460,7 @@ class UniformAugment: | |||
| Uniformly select and apply a number of transforms sequentially from | |||
| a list of transforms. Randomly assigns a probability to each transform for | |||
| each image to decide whether apply it or not. | |||
| All the transforms in transform list must have the same input/output data type. | |||
| Args: | |||
| transforms (list): List of transformations to be chosen from to apply. | |||
| @@ -1473,6 +1476,7 @@ class UniformAugment: | |||
| >>> py_transforms.ToTensor()]) | |||
| """ | |||
| @check_uniform_augment_py | |||
| def __init__(self, transforms, num_ops=2): | |||
| self.transforms = transforms | |||
| self.num_ops = num_ops | |||
| @@ -1427,17 +1427,6 @@ def random_color(img, degrees): | |||
| if not is_pil(img): | |||
| raise TypeError('img should be PIL Image. Got {}'.format(type(img))) | |||
| if isinstance(degrees, (list, tuple)): | |||
| if len(degrees) != 2: | |||
| raise ValueError("Degrees must be a sequence length 2.") | |||
| if degrees[0] < 0: | |||
| raise ValueError("Degree value must be non-negative.") | |||
| if degrees[0] > degrees[1]: | |||
| raise ValueError("Degrees should be in (min,max) format. Got (max,min).") | |||
| else: | |||
| raise TypeError("Degrees must be a sequence in (min,max) format.") | |||
| v = (degrees[1] - degrees[0]) * random.random() + degrees[0] | |||
| return ImageEnhance.Color(img).enhance(v) | |||
| @@ -1459,17 +1448,6 @@ def random_sharpness(img, degrees): | |||
| if not is_pil(img): | |||
| raise TypeError('img should be PIL Image. Got {}'.format(type(img))) | |||
| if isinstance(degrees, (list, tuple)): | |||
| if len(degrees) != 2: | |||
| raise ValueError("Degrees must be a sequence length 2.") | |||
| if degrees[0] < 0: | |||
| raise ValueError("Degree value must be non-negative.") | |||
| if degrees[0] > degrees[1]: | |||
| raise ValueError("Degrees should be in (min,max) format. Got (max,min).") | |||
| else: | |||
| raise TypeError("Degrees must be a sequence in (min,max) format.") | |||
| v = (degrees[1] - degrees[0]) * random.random() + degrees[0] | |||
| return ImageEnhance.Sharpness(img).enhance(v) | |||
| @@ -1537,6 +1515,7 @@ def uniform_augment(img, transforms, num_ops): | |||
| Uniformly select and apply a number of transforms sequentially from | |||
| a list of transforms. Randomly assigns a probability to each transform for | |||
| each image to decide whether apply it or not. | |||
| All the transforms in transform list must have the same input/output data type. | |||
| Args: | |||
| img: Image to be applied transformation. | |||
| @@ -1545,23 +1524,14 @@ def uniform_augment(img, transforms, num_ops): | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| if transforms is None: | |||
| raise ValueError("transforms is not provided.") | |||
| if not isinstance(transforms, list): | |||
| raise ValueError("The transforms needs to be a list.") | |||
| if not isinstance(num_ops, int): | |||
| raise ValueError("Number of operations should be a positive integer.") | |||
| if num_ops < 1: | |||
| raise ValueError("Number of operators should equal or greater than one.") | |||
| """ | |||
| for _ in range(num_ops): | |||
| AugmentOp = random.choice(transforms) | |||
| op_idx = np.random.choice(len(transforms), size=num_ops, replace=False) | |||
| for idx in op_idx: | |||
| AugmentOp = transforms[idx] | |||
| pr = random.random() | |||
| if random.random() < pr: | |||
| img = AugmentOp(img.copy()) | |||
| transforms.remove(AugmentOp) | |||
| return img | |||
| @@ -816,8 +816,8 @@ def check_rescale(method): | |||
| return new_method | |||
| def check_uniform_augmentation(method): | |||
| """Wrapper method to check the parameters of UniformAugmentation.""" | |||
| def check_uniform_augment_cpp(method): | |||
| """Wrapper method to check the parameters of UniformAugment cpp op.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| @@ -850,3 +850,60 @@ def check_uniform_augmentation(method): | |||
| return method(self, **kwargs) | |||
| return new_method | |||
| def check_uniform_augment_py(method): | |||
| """Wrapper method to check the parameters of python UniformAugment op.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| transforms, num_ops = (list(args) + 2 * [None])[:2] | |||
| if "transforms" in kwargs: | |||
| transforms = kwargs.get("transforms") | |||
| if transforms is None: | |||
| raise ValueError("transforms is not provided.") | |||
| if not transforms: | |||
| raise ValueError("transforms list is empty.") | |||
| check_list(transforms) | |||
| for transform in transforms: | |||
| if isinstance(transform, TensorOp): | |||
| raise ValueError("transform list only accepts Python operations.") | |||
| kwargs["transforms"] = transforms | |||
| if "num_ops" in kwargs: | |||
| num_ops = kwargs.get("num_ops") | |||
| if num_ops is not None: | |||
| check_type(num_ops, int) | |||
| check_positive(num_ops) | |||
| if num_ops > len(transforms): | |||
| raise ValueError("num_ops cannot be greater than the length of transforms list.") | |||
| kwargs["num_ops"] = num_ops | |||
| return method(self, **kwargs) | |||
| return new_method | |||
| def check_positive_degrees(method): | |||
| """A wrapper method to check degrees parameter in RandSharpness and RandColor""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| degrees = (list(args) + [None])[0] | |||
| if "degrees" in kwargs: | |||
| degrees = kwargs.get("degrees") | |||
| if degrees is not None: | |||
| if isinstance(degrees, (list, tuple)): | |||
| if len(degrees) != 2: | |||
| raise ValueError("Degrees must be a sequence with length 2.") | |||
| if degrees[0] < 0: | |||
| raise ValueError("Degrees range must be non-negative.") | |||
| if degrees[0] > degrees[1]: | |||
| raise ValueError("Degrees should be in (min,max) format. Got (max,min).") | |||
| else: | |||
| raise TypeError("Degrees must be a sequence in (min,max) format.") | |||
| return method(self, **kwargs) | |||
| return new_method | |||