Browse Source

!6019 [MD] Move Random(Choice/Apply/Order) from vision to transforms module

Merge pull request !6019 from nhussain/move_random_choice_apply
tags/v1.0.0
mindspore-ci-bot Gitee 5 years ago
parent
commit
cf7d6eddc4
9 changed files with 209 additions and 208 deletions
  1. +102
    -1
      mindspore/dataset/transforms/py_transforms.py
  2. +52
    -0
      mindspore/dataset/transforms/py_transforms_util.py
  3. +31
    -0
      mindspore/dataset/transforms/validators.py
  4. +1
    -102
      mindspore/dataset/vision/py_transforms.py
  5. +0
    -50
      mindspore/dataset/vision/py_transforms_util.py
  6. +0
    -32
      mindspore/dataset/vision/validators.py
  7. +8
    -8
      tests/ut/python/dataset/test_random_apply.py
  8. +9
    -9
      tests/ut/python/dataset/test_random_choice.py
  9. +6
    -6
      tests/ut/python/dataset/test_random_order.py

+ 102
- 1
mindspore/dataset/transforms/py_transforms.py View File

@@ -17,7 +17,7 @@
This module py_transforms is implemented basing on Python. It provides common This module py_transforms is implemented basing on Python. It provides common
operations including OneHotOp. operations including OneHotOp.
""" """
from .validators import check_one_hot_op, check_compose_list
from .validators import check_one_hot_op, check_compose_list, check_random_apply, check_transforms_list
from . import py_transforms_util as util from . import py_transforms_util as util




@@ -100,3 +100,104 @@ class Compose:
lambda function, Lambda function that takes in an img to apply transformations on. lambda function, Lambda function that takes in an img to apply transformations on.
""" """
return util.compose(img, self.transforms) return util.compose(img, self.transforms)


class RandomApply:
"""
Randomly perform a series of transforms with a given probability.

Args:
transforms (list): List of transformations to apply.
prob (float, optional): The probability to apply the transformation list (default=0.5).

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose
>>>
>>> Compose([py_vision.Decode(),
>>> py_vision.RandomApply(transforms_list, prob=0.6),
>>> py_vision.ToTensor()])
"""

@check_random_apply
def __init__(self, transforms, prob=0.5):
self.prob = prob
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to be randomly applied a list transformations.

Returns:
img (PIL image), Transformed image.
"""
return util.random_apply(img, self.transforms, self.prob)


class RandomChoice:
"""
Randomly select one transform from a series of transforms and applies that on the image.

Args:
transforms (list): List of transformations to be chosen from to apply.

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose, RandomChoice
>>>
>>> Compose([py_vision.Decode(),
>>> RandomChoice(transforms_list),
>>> py_vision.ToTensor()])
"""

@check_transforms_list
def __init__(self, transforms):
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to be applied transformation.

Returns:
img (PIL image), Transformed image.
"""
return util.random_choice(img, self.transforms)


class RandomOrder:
"""
Perform a series of transforms to the input PIL image in a random order.

Args:
transforms (list): List of the transformations to apply.

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose
>>>
>>> Compose([py_vision.Decode(),
>>> py_vision.RandomOrder(transforms_list),
>>> py_vision.ToTensor()])
"""

@check_transforms_list
def __init__(self, transforms):
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to apply transformations in a random order.

Returns:
img (PIL image), Transformed image.
"""
return util.random_order(img, self.transforms)

+ 52
- 0
mindspore/dataset/transforms/py_transforms_util.py View File

@@ -15,7 +15,9 @@
""" """
Built-in py_transforms_utils functions. Built-in py_transforms_utils functions.
""" """
import random
import numpy as np import numpy as np

from ..core.py_util_helpers import is_numpy from ..core.py_util_helpers import is_numpy




@@ -63,3 +65,53 @@ def one_hot_encoding(label, num_classes, epsilon):
one_hot_label[index, label[index]] = 1 one_hot_label[index, label[index]] = 1


return (1 - epsilon) * one_hot_label + epsilon / num_classes return (1 - epsilon) * one_hot_label + epsilon / num_classes


def random_order(img, transforms):
"""
Applies a list of transforms in a random order.

Args:
img: Image to be applied transformations in a random order.
transforms (list): List of the transformations to be applied.

Returns:
img, Transformed image.
"""
random.shuffle(transforms)
for transform in transforms:
img = transform(img)
return img


def random_apply(img, transforms, prob):
"""
Apply a list of transformation, randomly with a given probability.

Args:
img: Image to be randomly applied a list transformations.
transforms (list): List of transformations to be applied.
prob (float): The probability to apply the transformation list.

Returns:
img, Transformed image.
"""
if prob < random.random():
return img
for transform in transforms:
img = transform(img)
return img


def random_choice(img, transforms):
"""
Random selects one transform from a list of transforms and applies that on the image.

Args:
img: Image to be applied transformation.
transforms (list): List of transformations to be chosen from to apply.

Returns:
img, Transformed image.
"""
return random.choice(transforms)(img)

+ 31
- 0
mindspore/dataset/transforms/validators.py View File

@@ -216,3 +216,34 @@ def check_compose_list(method):
return method(self, *args, **kwargs) return method(self, *args, **kwargs)


return new_method return new_method


def check_random_apply(method):
"""Wrapper method to check the parameters of random apply."""

@wraps(method)
def new_method(self, *args, **kwargs):
[transforms, prob], _ = parse_user_args(method, *args, **kwargs)
type_check(transforms, (list,), "transforms")

if prob is not None:
type_check(prob, (float, int,), "prob")
check_value(prob, [0., 1.], "prob")

return method(self, *args, **kwargs)

return new_method


def check_transforms_list(method):
"""Wrapper method to check the parameters of transform list."""

@wraps(method)
def new_method(self, *args, **kwargs):
[transforms], _ = parse_user_args(method, *args, **kwargs)

type_check(transforms, (list,), "transforms")

return method(self, *args, **kwargs)

return new_method

+ 1
- 102
mindspore/dataset/vision/py_transforms.py View File

@@ -30,7 +30,7 @@ from . import py_transforms_util as util
from .c_transforms import parse_padding from .c_transforms import parse_padding
from .validators import check_prob, check_crop, check_resize_interpolation, check_random_resize_crop, \ from .validators import check_prob, check_crop, check_resize_interpolation, check_random_resize_crop, \
check_normalize_py, check_random_crop, check_random_color_adjust, check_random_rotation, \ 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_ten_crop, check_num_channels, check_pad, \
check_random_perspective, check_random_erasing, check_cutout, check_linear_transform, check_random_affine, \ check_random_perspective, check_random_erasing, check_cutout, check_linear_transform, check_random_affine, \
check_mix_up, check_positive_degrees, check_uniform_augment_py, check_auto_contrast check_mix_up, check_positive_degrees, check_uniform_augment_py, check_auto_contrast
from .utils import Inter, Border from .utils import Inter, Border
@@ -609,107 +609,6 @@ class RandomRotation:
return util.random_rotation(img, self.degrees, self.resample, self.expand, self.center, self.fill_value) return util.random_rotation(img, self.degrees, self.resample, self.expand, self.center, self.fill_value)




class RandomOrder:
"""
Perform a series of transforms to the input PIL image in a random order.

Args:
transforms (list): List of the transformations to apply.

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose
>>>
>>> Compose([py_vision.Decode(),
>>> py_vision.RandomOrder(transforms_list),
>>> py_vision.ToTensor()])
"""

@check_transforms_list
def __init__(self, transforms):
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to apply transformations in a random order.

Returns:
img (PIL image), Transformed image.
"""
return util.random_order(img, self.transforms)


class RandomApply:
"""
Randomly perform a series of transforms with a given probability.

Args:
transforms (list): List of transformations to apply.
prob (float, optional): The probability to apply the transformation list (default=0.5).

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose
>>>
>>> Compose([py_vision.Decode(),
>>> py_vision.RandomApply(transforms_list, prob=0.6),
>>> py_vision.ToTensor()])
"""

@check_random_apply
def __init__(self, transforms, prob=0.5):
self.prob = prob
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to be randomly applied a list transformations.

Returns:
img (PIL image), Transformed image.
"""
return util.random_apply(img, self.transforms, self.prob)


class RandomChoice:
"""
Randomly select one transform from a series of transforms and apply that transform on the image.

Args:
transforms (list): List of transformations to be chosen from to apply.

Examples:
>>> import mindspore.dataset.vision.py_transforms as py_vision
>>> from mindspore.dataset.transforms.py_transforms import Compose
>>>
>>> Compose([py_vision.Decode(),
>>> py_vision.RandomChoice(transforms_list),
>>> py_vision.ToTensor()])
"""

@check_transforms_list
def __init__(self, transforms):
self.transforms = transforms

def __call__(self, img):
"""
Call method.

Args:
img (PIL image): Image to apply transformation.

Returns:
img (PIL image), Transformed image.
"""
return util.random_choice(img, self.transforms)


class FiveCrop: class FiveCrop:
""" """
Generate 5 cropped images (one central image and four corners images). Generate 5 cropped images (one central image and four corners images).


+ 0
- 50
mindspore/dataset/vision/py_transforms_util.py View File

@@ -701,56 +701,6 @@ def random_rotation(img, degrees, resample, expand, center, fill_value):
return rotate(img, angle, resample, expand, center, fill_value) return rotate(img, angle, resample, expand, center, fill_value)




def random_order(img, transforms):
"""
Applies a list of transforms in a random order.

Args:
img: Image to be applied transformations in a random order.
transforms (list): List of the transformations to be applied.

Returns:
img, Transformed image.
"""
random.shuffle(transforms)
for transform in transforms:
img = transform(img)
return img


def random_apply(img, transforms, prob):
"""
Apply a list of transformation, randomly with a given probability.

Args:
img: Image to be randomly applied a list transformations.
transforms (list): List of transformations to be applied.
prob (float): The probability to apply the transformation list.

Returns:
img, Transformed image.
"""
if prob < random.random():
return img
for transform in transforms:
img = transform(img)
return img


def random_choice(img, transforms):
"""
Random selects one transform from a list of transforms and applies that on the image.

Args:
img: Image to be applied transformation.
transforms (list): List of transformations to be chosen from to apply.

Returns:
img, Transformed image.
"""
return random.choice(transforms)(img)


def five_crop(img, size): def five_crop(img, size):
""" """
Generate 5 cropped images (one central and four corners). Generate 5 cropped images (one central and four corners).


+ 0
- 32
mindspore/dataset/vision/validators.py View File

@@ -347,37 +347,6 @@ def check_random_rotation(method):
return new_method return new_method




def check_transforms_list(method):
"""Wrapper method to check the parameters of transform list."""

@wraps(method)
def new_method(self, *args, **kwargs):
[transforms], _ = parse_user_args(method, *args, **kwargs)

type_check(transforms, (list,), "transforms")

return method(self, *args, **kwargs)

return new_method


def check_random_apply(method):
"""Wrapper method to check the parameters of random apply."""

@wraps(method)
def new_method(self, *args, **kwargs):
[transforms, prob], _ = parse_user_args(method, *args, **kwargs)
type_check(transforms, (list,), "transforms")

if prob is not None:
type_check(prob, (float, int,), "prob")
check_value(prob, [0., 1.], "prob")

return method(self, *args, **kwargs)

return new_method


def check_ten_crop(method): def check_ten_crop(method):
"""Wrapper method to check the parameters of crop.""" """Wrapper method to check the parameters of crop."""


@@ -678,7 +647,6 @@ def check_positive_degrees(method):
return new_method return new_method





def check_random_select_subpolicy_op(method): def check_random_select_subpolicy_op(method):
"""Wrapper method to check the parameters of RandomSelectSubpolicyOp.""" """Wrapper method to check the parameters of RandomSelectSubpolicyOp."""




+ 8
- 8
tests/ut/python/dataset/test_random_apply.py View File

@@ -17,7 +17,7 @@ Testing RandomApply op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds import mindspore.dataset as ds
import mindspore.dataset.transforms.py_transforms
import mindspore.dataset.transforms.py_transforms as py_transforms
import mindspore.dataset.vision.py_transforms as py_vision import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, config_get_set_seed, \ from util import visualize_list, config_get_set_seed, \
@@ -38,16 +38,16 @@ def test_random_apply_op(plot=False):
transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6),
py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)


transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2)
transform2 = py_transforms.Compose(transforms2)


# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@@ -79,10 +79,10 @@ def test_random_apply_md5():
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
# Note: using default value "prob=0.5" # Note: using default value "prob=0.5"
py_vision.RandomApply(transforms_list),
py_transforms.RandomApply(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)


# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@@ -111,10 +111,10 @@ def test_random_apply_exception_random_crop_badinput():
py_vision.RandomRotation(30)] py_vision.RandomRotation(30)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6),
py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
data = data.map(operations=transform, input_columns=["image"]) data = data.map(operations=transform, input_columns=["image"])


+ 9
- 9
tests/ut/python/dataset/test_random_choice.py View File

@@ -17,7 +17,7 @@ Testing RandomChoice op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds import mindspore.dataset as ds
import mindspore.dataset.transforms.py_transforms
import mindspore.dataset.transforms.py_transforms as py_transforms
import mindspore.dataset.vision.py_transforms as py_vision import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, diff_mse from util import visualize_list, diff_mse
@@ -35,16 +35,16 @@ def test_random_choice_op(plot=False):
transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)


transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2)
transform2 = py_transforms.Compose(transforms2)


# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@@ -73,17 +73,17 @@ def test_random_choice_comp(plot=False):
transforms_list = [py_vision.CenterCrop(64)] transforms_list = [py_vision.CenterCrop(64)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)


transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.CenterCrop(64), py_vision.CenterCrop(64),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2)
transform2 = py_transforms.Compose(transforms2)


# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@@ -117,10 +117,10 @@ def test_random_choice_exception_random_crop_badinput():
transforms_list = [py_vision.RandomCrop(5000)] transforms_list = [py_vision.RandomCrop(5000)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
data = data.map(operations=transform, input_columns=["image"]) data = data.map(operations=transform, input_columns=["image"])


+ 6
- 6
tests/ut/python/dataset/test_random_order.py View File

@@ -17,7 +17,7 @@ Testing RandomOrder op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds import mindspore.dataset as ds
import mindspore.dataset.transforms.py_transforms
import mindspore.dataset.transforms.py_transforms as py_transforms
import mindspore.dataset.vision.py_transforms as py_vision import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, config_get_set_seed, \ from util import visualize_list, config_get_set_seed, \
@@ -38,16 +38,16 @@ def test_random_order_op(plot=False):
transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomOrder(transforms_list),
py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)
transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2)
transform2 = py_transforms.Compose(transforms2)
# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@@ -78,10 +78,10 @@ def test_random_order_md5():
transforms_list = [py_vision.RandomCrop(64), py_vision.RandomRotation(30)] transforms_list = [py_vision.RandomCrop(64), py_vision.RandomRotation(30)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomOrder(transforms_list),
py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)


Loading…
Cancel
Save