Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_register(self):
"""
Test register.
"""
dtype = "int"
def add1(t, x):
return x + 1
def flip_sub_width(t, x):
return x - t.width
T.Transform.register_type(dtype, add1)
T.HFlipTransform.register_type(dtype, flip_sub_width)
transforms = T.TransformList(
[
T.ScaleTransform(0, 0, 0, 0, 0),
T.CropTransform(0, 0, 0, 0),
T.HFlipTransform(3),
]
)
self.assertEqual(transforms.apply_int(3), 2)
with self.assertRaises(AssertionError):
T.HFlipTransform.register_type(dtype, lambda x: 1)
def apply_segmentation(self, segmentation: np.ndarray) -> np.ndarray:
"""
Apply resize on the full-image segmentation.
Args:
segmentation (ndarray): of shape HxW. The array should have integer
or bool dtype.
Returns:
ndarray: resized segmentation.
"""
segmentation = self.apply_image(segmentation, interp="nearest")
return segmentation
class GridSampleTransform(Transform):
def __init__(self, grid: np.ndarray, interp: str):
"""
Args:
grid (ndarray): grid has x and y input pixel locations which are
used to compute output. Grid has values in the range of [-1, 1],
which is normalized by the input height and width. The dimension
is `N x H x W x 2`.
interp (str): interpolation methods. Options include `nearest` and
`bilinear`.
"""
super().__init__()
self._set_attributes(locals())
def apply_image(self, img: np.ndarray, interp: str = None) -> np.ndarray:
"""
Apply grid sampling on the image(s).
x0, y0, x1, y1 = self.src_rect
new_coords = coords.astype(np.float32)
new_coords[:, 0] -= 0.5 * (x0 + x1)
new_coords[:, 1] -= 0.5 * (y0 + y1)
new_coords[:, 0] *= w / (x1 - x0)
new_coords[:, 1] *= h / (y1 - y0)
new_coords[:, 0] += 0.5 * w
new_coords[:, 1] += 0.5 * h
return new_coords
def apply_segmentation(self, segmentation):
segmentation = self.apply_image(segmentation, interp=Image.NEAREST)
return segmentation
class ResizeTransform(Transform):
"""
Resize the image to a target size.
"""
def __init__(self, h, w, new_h, new_w, interp):
"""
Args:
h, w (int): original image size
new_h, new_w (int): new image size
interp: PIL interpolation methods
"""
# TODO decide on PIL vs opencv
super().__init__()
self._set_attributes(locals())
def apply_image(self, img, interp=None):
Args:
coords (ndarray): floating point array of shape Nx2. Each row is
(x, y).
Returns:
ndarray: the flipped coordinates.
Note:
The inputs are floating point coordinates, not pixel indices.
Therefore they are flipped by `(W - x, H - y)`, not
`(W - 1 - x, H - 1 - y)`.
"""
coords[:, 0] = self.width - coords[:, 0]
return coords
class VFlipTransform(Transform):
"""
Perform vertical flip.
"""
def __init__(self, height: int):
super().__init__()
self._set_attributes(locals())
def apply_image(self, img: np.ndarray) -> np.ndarray:
"""
Flip the image(s).
Args:
img (ndarray): of shape HxW, HxWxC, or NxHxWxC. The array can be
of type uint8 in range [0, 255], or floating point in range
[0, 1] or [0, 255].
img (ndarray): uint8 or floating point images with 1 or 3 channels.
Returns:
ndarray: the transformed image
TransformList: contain the transforms that's used.
"""
for g in transform_gens:
assert isinstance(g, TransformGen), g
check_dtype(img)
tfms = []
for g in transform_gens:
tfm = g.get_transform(img)
assert isinstance(
tfm, Transform
), "TransformGen {} must return an instance of Transform! Got {} instead".format(g, tfm)
img = tfm.apply_image(img)
tfms.append(tfm)
return img, TransformList(tfms)
def __init__(self, transforms: list):
"""
Args:
transforms (list[Transform]): list of transforms to perform.
"""
super().__init__()
for t in transforms:
assert isinstance(t, Transform), t
self.transforms = transforms
return self
def __radd__(self, other: "TransformList") -> "TransformList":
"""
Args:
other (TransformList): transformation to add.
Returns:
TransformList: list of transforms.
"""
others = (
other.transforms if isinstance(other, TransformList) else [other]
)
return TransformList(others + self.transforms)
class HFlipTransform(Transform):
"""
Perform horizontal flip.
"""
def __init__(self, width: int):
super().__init__()
self._set_attributes(locals())
def apply_image(self, img: np.ndarray) -> np.ndarray:
"""
Flip the image(s).
Args:
img (ndarray): of shape HxW, HxWxC, or NxHxWxC. The array can be
of type uint8 in range [0, 255], or floating point in range
[0, 1] or [0, 255].
class NoOpTransform(Transform):
"""
A transform that does nothing.
"""
def __init__(self):
super().__init__()
def apply_image(self, img: np.ndarray) -> np.ndarray:
return img
def apply_coords(self, coords: np.ndarray) -> np.ndarray:
return coords
class ScaleTransform(Transform):
"""
Resize the image to a target size.
"""
def __init__(self, h: int, w: int, new_h: int, new_w: int, interp: str):
"""
Args:
h, w (int): original image size.
new_h, new_w (int): new image size.
interp (str): interpolation methods. Options includes `nearest`, `linear`
(3D-only), `bilinear`, `bicubic` (4D-only), and `area`.
Details can be found in:
https://pytorch.org/docs/stable/nn.functional.html
"""
super().__init__()
self._set_attributes(locals())
Args:
coords (ndarray): floating point array of shape Nx2. Each row is
(x, y).
Returns:
ndarray: the flipped coordinates.
Note:
The inputs are floating point coordinates, not pixel indices.
Therefore they are flipped by `(W - x, H - y)`, not
`(W - 1 - x, H - 1 - y)`.
"""
coords[:, 1] = self.height - coords[:, 1]
return coords
class NoOpTransform(Transform):
"""
A transform that does nothing.
"""
def __init__(self):
super().__init__()
def apply_image(self, img: np.ndarray) -> np.ndarray:
return img
def apply_coords(self, coords: np.ndarray) -> np.ndarray:
return coords
class ScaleTransform(Transform):
"""
# -*- coding: utf-8 -*-
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
# File: transform.py
import numpy as np
from fvcore.transforms.transform import HFlipTransform, NoOpTransform, Transform
from PIL import Image
__all__ = ["ExtentTransform", "ResizeTransform"]
class ExtentTransform(Transform):
"""
Extracts a subregion from the source image and scales it to the output size.
The fill color is used to map pixels from the source rect that fall outside
the source image.
See: https://pillow.readthedocs.io/en/latest/PIL.html#PIL.ImageTransform.ExtentTransform
"""
def __init__(self, src_rect, output_size, interp=Image.LINEAR, fill=0):
"""
Args:
src_rect (x0, y0, x1, y1): src coordinates
output_size (h, w): dst image size
interp: PIL interpolation methods
fill: Fill color used when src_rect extends outside image