RandomElasticTransform layer

[source]

RandomElasticTransform class

keras.layers.RandomElasticTransform(
    factor=1.0,
    scale=1.0,
    interpolation="bilinear",
    fill_mode="reflect",
    fill_value=0.0,
    value_range=(0, 255),
    seed=None,
    data_format=None,
    **kwargs
)

A preprocessing layer that applies random elastic transformations.

This layer distorts input images by applying elastic deformations,
simulating a physically realistic transformation. The magnitude of the
distortion is controlled by the `scale` parameter, while the `factor`
determines the probability of applying the transformation.

**Note:** This layer is safe to use inside a [`tf.data`](https://www.tensorflow.org/api_docs/python/tf/data) or `grain` pipeline
(independently of which backend you're using).

# Arguments
    factor: A single float or a tuple of two floats.
        `factor` controls the probability of applying the transformation.
        - `factor=0.0` ensures no erasing is applied.
        - `factor=1.0` means erasing is always applied.
        - If a tuple `(min, max)` is provided, a probability value
          is sampled between `min` and `max` for each image.
        - If a single float is provided, a probability is sampled
          between `0.0` and the given float.
        Default is 1.0.
    scale: A float or a tuple of two floats defining the magnitude of
        the distortion applied.
        - If a tuple `(min, max)` is provided, a random scale value is
          sampled within this range.
        - If a single float is provided, a random scale value is sampled
          between `0.0` and the given float.
        Default is 1.0.
    interpolation: Interpolation mode. Supported values: `"nearest"`,
        `"bilinear"`.
    fill_mode: Points outside the boundaries of the input are filled
        according to the given mode. Available methods are `"constant"`,
        `"nearest"`, `"wrap"` and `"reflect"`. Defaults to `"constant"`.
        - `"reflect"`: `(d c b a | a b c d | d c b a)`
            The input is extended by reflecting about the edge of the last
            pixel.
        - `"constant"`: `(k k k k | a b c d | k k k k)`
            The input is extended by filling all values beyond
            the edge with the same constant value k specified by
            `fill_value`.
        - `"wrap"`: `(a b c d | a b c d | a b c d)`
            The input is extended by wrapping around to the opposite edge.
        - `"nearest"`: `(a a a a | a b c d | d d d d)`
            The input is extended by the nearest pixel.
        Note that when using torch backend, `"reflect"` is redirected to
        `"mirror"` `(c d c b | a b c d | c b a b)` because torch does not
        support `"reflect"`.
        Note that torch backend does not support `"wrap"`.
    fill_value: a float represents the value to be filled outside the
        boundaries when `fill_mode="constant"`.
    value_range: the range of values the incoming images will have.
        Represented as a two-number tuple written `[low, high]`. This is
        typically either `[0, 1]` or `[0, 255]` depending on how your
        preprocessing pipeline is set up.
    seed: Integer. Used to create a random seed.

# Example
layer = keras.layers.RandomElasticTransform(bounding_box_format="xyxy")
images = np.random.randint(0, 255, (4, 224, 224, 3), dtype="uint8")

bounding_boxes = {
    "boxes": np.array([
        [[10, 20, 100, 150], [50, 60, 200, 250]],
        [[15, 25, 110, 160], [55, 65, 210, 260]],
        [[20, 30, 120, 170], [60, 70, 220, 270]],
        [[25, 35, 130, 180], [65, 75, 230, 280]],
    ], dtype="float32"),
    "labels": np.array([[0, 1], [1, 2], [2, 3], [0, 3]], dtype="int32")
}

labels = keras.ops.one_hot(
    np.array([0, 1, 2, 3]),
    num_classes=4
)

segmentation_masks = np.random.randint(0, 3, (4, 224, 224, 1), dtype="uint8")

output = layer(
    {
        "images": images,
        "bounding_boxes": bounding_boxes,
        "labels": labels,
        "segmentation_masks": segmentation_masks
    },
    training=True
)