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
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


@@ -100,3 +100,104 @@ class Compose:
lambda function, Lambda function that takes in an img to apply transformations on.
"""
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.
"""
import random
import numpy as np

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

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 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 .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_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_mix_up, check_positive_degrees, check_uniform_augment_py, check_auto_contrast
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)


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:
"""
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)


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):
"""
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


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):
"""Wrapper method to check the parameters of crop."""

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



def check_random_select_subpolicy_op(method):
"""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 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
from mindspore import log as logger
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)]
transforms1 = [
py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6),
py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor()
]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)

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

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

# Generate dataset
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)]
transforms = [
py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6),
py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor()
]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
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 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
from mindspore import log as logger
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)]
transforms1 = [
py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor()
]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)

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

# First dataset
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)]
transforms1 = [
py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor()
]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)

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

# First dataset
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 = [
py_vision.Decode(),
py_vision.RandomChoice(transforms_list),
py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor()
]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
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 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
from mindspore import log as logger
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)]
transforms1 = [
py_vision.Decode(),
py_vision.RandomOrder(transforms_list),
py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor()
]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1)
transform1 = py_transforms.Compose(transforms1)
transforms2 = [
py_vision.Decode(),
py_vision.ToTensor()
]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2)
transform2 = py_transforms.Compose(transforms2)
# First dataset
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 = [
py_vision.Decode(),
py_vision.RandomOrder(transforms_list),
py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor()
]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms)
transform = py_transforms.Compose(transforms)
# Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)


Loading…
Cancel
Save