Spaces:
Configuration error
Configuration error
| try: | |
| import imgaug as ia | |
| except ImportError as e: | |
| raise ImportError( | |
| "You are trying to import an augmentation that depends on the imgaug library, but imgaug is not installed. To " | |
| "install a version of Albumentations that contains imgaug please run 'pip install -U albumentations[imgaug]'" | |
| ) from e | |
| try: | |
| from imgaug import augmenters as iaa | |
| except ImportError: | |
| import imgaug.imgaug.augmenters as iaa | |
| import warnings | |
| from custom_albumentations.core.bbox_utils import ( | |
| convert_bboxes_from_albumentations, | |
| convert_bboxes_to_albumentations, | |
| ) | |
| from custom_albumentations.core.keypoints_utils import ( | |
| convert_keypoints_from_albumentations, | |
| convert_keypoints_to_albumentations, | |
| ) | |
| from ..augmentations import Perspective | |
| from ..core.transforms_interface import ( | |
| BasicTransform, | |
| DualTransform, | |
| ImageOnlyTransform, | |
| to_tuple, | |
| ) | |
| __all__ = [ | |
| "BasicIAATransform", | |
| "DualIAATransform", | |
| "ImageOnlyIAATransform", | |
| "IAAEmboss", | |
| "IAASuperpixels", | |
| "IAASharpen", | |
| "IAAAdditiveGaussianNoise", | |
| "IAACropAndPad", | |
| "IAAFliplr", | |
| "IAAFlipud", | |
| "IAAAffine", | |
| "IAAPiecewiseAffine", | |
| "IAAPerspective", | |
| ] | |
| class BasicIAATransform(BasicTransform): | |
| def __init__(self, always_apply=False, p=0.5): | |
| super(BasicIAATransform, self).__init__(always_apply, p) | |
| def processor(self): | |
| return iaa.Noop() | |
| def update_params(self, params, **kwargs): | |
| params = super(BasicIAATransform, self).update_params(params, **kwargs) | |
| params["deterministic_processor"] = self.processor.to_deterministic() | |
| return params | |
| def apply(self, img, deterministic_processor=None, **params): | |
| return deterministic_processor.augment_image(img) | |
| class DualIAATransform(DualTransform, BasicIAATransform): | |
| def apply_to_bboxes(self, bboxes, deterministic_processor=None, rows=0, cols=0, **params): | |
| if len(bboxes) > 0: | |
| bboxes = convert_bboxes_from_albumentations(bboxes, "pascal_voc", rows=rows, cols=cols) | |
| bboxes_t = ia.BoundingBoxesOnImage([ia.BoundingBox(*bbox[:4]) for bbox in bboxes], (rows, cols)) | |
| bboxes_t = deterministic_processor.augment_bounding_boxes([bboxes_t])[0].bounding_boxes | |
| bboxes_t = [ | |
| [bbox.x1, bbox.y1, bbox.x2, bbox.y2] + list(bbox_orig[4:]) | |
| for (bbox, bbox_orig) in zip(bboxes_t, bboxes) | |
| ] | |
| bboxes = convert_bboxes_to_albumentations(bboxes_t, "pascal_voc", rows=rows, cols=cols) | |
| return bboxes | |
| """Applies transformation to keypoints. | |
| Notes: | |
| Since IAA supports only xy keypoints, scale and orientation will remain unchanged. | |
| TODO: | |
| Emit a warning message if child classes of DualIAATransform are instantiated | |
| inside Compose with keypoints format other than 'xy'. | |
| """ | |
| def apply_to_keypoints(self, keypoints, deterministic_processor=None, rows=0, cols=0, **params): | |
| if len(keypoints) > 0: | |
| keypoints = convert_keypoints_from_albumentations(keypoints, "xy", rows=rows, cols=cols) | |
| keypoints_t = ia.KeypointsOnImage([ia.Keypoint(*kp[:2]) for kp in keypoints], (rows, cols)) | |
| keypoints_t = deterministic_processor.augment_keypoints([keypoints_t])[0].keypoints | |
| bboxes_t = [[kp.x, kp.y] + list(kp_orig[2:]) for (kp, kp_orig) in zip(keypoints_t, keypoints)] | |
| keypoints = convert_keypoints_to_albumentations(bboxes_t, "xy", rows=rows, cols=cols) | |
| return keypoints | |
| class ImageOnlyIAATransform(ImageOnlyTransform, BasicIAATransform): | |
| pass | |
| class IAACropAndPad(DualIAATransform): | |
| """This augmentation is deprecated. Please use CropAndPad instead.""" | |
| def __init__(self, px=None, percent=None, pad_mode="constant", pad_cval=0, keep_size=True, always_apply=False, p=1): | |
| super(IAACropAndPad, self).__init__(always_apply, p) | |
| self.px = px | |
| self.percent = percent | |
| self.pad_mode = pad_mode | |
| self.pad_cval = pad_cval | |
| self.keep_size = keep_size | |
| warnings.warn("IAACropAndPad is deprecated. Please use CropAndPad instead", FutureWarning) | |
| def processor(self): | |
| return iaa.CropAndPad(self.px, self.percent, self.pad_mode, self.pad_cval, self.keep_size) | |
| def get_transform_init_args_names(self): | |
| return ("px", "percent", "pad_mode", "pad_cval", "keep_size") | |
| class IAAFliplr(DualIAATransform): | |
| """This augmentation is deprecated. Please use HorizontalFlip instead.""" | |
| def __init__(self, always_apply=False, p=0.5): | |
| super().__init__(always_apply, p) | |
| warnings.warn("IAAFliplr is deprecated. Please use HorizontalFlip instead.", FutureWarning) | |
| def processor(self): | |
| return iaa.Fliplr(1) | |
| def get_transform_init_args_names(self): | |
| return () | |
| class IAAFlipud(DualIAATransform): | |
| """This augmentation is deprecated. Please use VerticalFlip instead.""" | |
| def __init__(self, always_apply=False, p=0.5): | |
| super().__init__(always_apply, p) | |
| warnings.warn("IAAFlipud is deprecated. Please use VerticalFlip instead.", FutureWarning) | |
| def processor(self): | |
| return iaa.Flipud(1) | |
| def get_transform_init_args_names(self): | |
| return () | |
| class IAAEmboss(ImageOnlyIAATransform): | |
| """Emboss the input image and overlays the result with the original image. | |
| This augmentation is deprecated. Please use Emboss instead. | |
| Args: | |
| alpha ((float, float)): range to choose the visibility of the embossed image. At 0, only the original image is | |
| visible,at 1.0 only its embossed version is visible. Default: (0.2, 0.5). | |
| strength ((float, float)): strength range of the embossing. Default: (0.2, 0.7). | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image | |
| """ | |
| def __init__(self, alpha=(0.2, 0.5), strength=(0.2, 0.7), always_apply=False, p=0.5): | |
| super(IAAEmboss, self).__init__(always_apply, p) | |
| self.alpha = to_tuple(alpha, 0.0) | |
| self.strength = to_tuple(strength, 0.0) | |
| warnings.warn("This augmentation is deprecated. Please use Emboss instead", FutureWarning) | |
| def processor(self): | |
| return iaa.Emboss(self.alpha, self.strength) | |
| def get_transform_init_args_names(self): | |
| return ("alpha", "strength") | |
| class IAASuperpixels(ImageOnlyIAATransform): | |
| """Completely or partially transform the input image to its superpixel representation. Uses skimage's version | |
| of the SLIC algorithm. May be slow. | |
| This augmentation is deprecated. Please use Superpixels instead. | |
| Args: | |
| p_replace (float): defines the probability of any superpixel area being replaced by the superpixel, i.e. by | |
| the average pixel color within its area. Default: 0.1. | |
| n_segments (int): target number of superpixels to generate. Default: 100. | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image | |
| """ | |
| def __init__(self, p_replace=0.1, n_segments=100, always_apply=False, p=0.5): | |
| super(IAASuperpixels, self).__init__(always_apply, p) | |
| self.p_replace = p_replace | |
| self.n_segments = n_segments | |
| warnings.warn("IAASuperpixels is deprecated. Please use Superpixels instead.", FutureWarning) | |
| def processor(self): | |
| return iaa.Superpixels(p_replace=self.p_replace, n_segments=self.n_segments) | |
| def get_transform_init_args_names(self): | |
| return ("p_replace", "n_segments") | |
| class IAASharpen(ImageOnlyIAATransform): | |
| """Sharpen the input image and overlays the result with the original image. | |
| This augmentation is deprecated. Please use Sharpen instead | |
| Args: | |
| alpha ((float, float)): range to choose the visibility of the sharpened image. At 0, only the original image is | |
| visible, at 1.0 only its sharpened version is visible. Default: (0.2, 0.5). | |
| lightness ((float, float)): range to choose the lightness of the sharpened image. Default: (0.5, 1.0). | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image | |
| """ | |
| def __init__(self, alpha=(0.2, 0.5), lightness=(0.5, 1.0), always_apply=False, p=0.5): | |
| super(IAASharpen, self).__init__(always_apply, p) | |
| self.alpha = to_tuple(alpha, 0) | |
| self.lightness = to_tuple(lightness, 0) | |
| warnings.warn("IAASharpen is deprecated. Please use Sharpen instead", FutureWarning) | |
| def processor(self): | |
| return iaa.Sharpen(self.alpha, self.lightness) | |
| def get_transform_init_args_names(self): | |
| return ("alpha", "lightness") | |
| class IAAAdditiveGaussianNoise(ImageOnlyIAATransform): | |
| """Add gaussian noise to the input image. | |
| This augmentation is deprecated. Please use GaussNoise instead. | |
| Args: | |
| loc (int): mean of the normal distribution that generates the noise. Default: 0. | |
| scale ((float, float)): standard deviation of the normal distribution that generates the noise. | |
| Default: (0.01 * 255, 0.05 * 255). | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image | |
| """ | |
| def __init__(self, loc=0, scale=(0.01 * 255, 0.05 * 255), per_channel=False, always_apply=False, p=0.5): | |
| super(IAAAdditiveGaussianNoise, self).__init__(always_apply, p) | |
| self.loc = loc | |
| self.scale = to_tuple(scale, 0.0) | |
| self.per_channel = per_channel | |
| warnings.warn("IAAAdditiveGaussianNoise is deprecated. Please use GaussNoise instead", FutureWarning) | |
| def processor(self): | |
| return iaa.AdditiveGaussianNoise(self.loc, self.scale, self.per_channel) | |
| def get_transform_init_args_names(self): | |
| return ("loc", "scale", "per_channel") | |
| class IAAPiecewiseAffine(DualIAATransform): | |
| """Place a regular grid of points on the input and randomly move the neighbourhood of these point around | |
| via affine transformations. | |
| This augmentation is deprecated. Please use PiecewiseAffine instead. | |
| Note: This class introduce interpolation artifacts to mask if it has values other than {0;1} | |
| Args: | |
| scale ((float, float): factor range that determines how far each point is moved. Default: (0.03, 0.05). | |
| nb_rows (int): number of rows of points that the regular grid should have. Default: 4. | |
| nb_cols (int): number of columns of points that the regular grid should have. Default: 4. | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image, mask | |
| """ | |
| def __init__( | |
| self, scale=(0.03, 0.05), nb_rows=4, nb_cols=4, order=1, cval=0, mode="constant", always_apply=False, p=0.5 | |
| ): | |
| super(IAAPiecewiseAffine, self).__init__(always_apply, p) | |
| self.scale = to_tuple(scale, 0.0) | |
| self.nb_rows = nb_rows | |
| self.nb_cols = nb_cols | |
| self.order = order | |
| self.cval = cval | |
| self.mode = mode | |
| warnings.warn("This IAAPiecewiseAffine is deprecated. Please use PiecewiseAffine instead", FutureWarning) | |
| def processor(self): | |
| return iaa.PiecewiseAffine(self.scale, self.nb_rows, self.nb_cols, self.order, self.cval, self.mode) | |
| def get_transform_init_args_names(self): | |
| return ("scale", "nb_rows", "nb_cols", "order", "cval", "mode") | |
| class IAAAffine(DualIAATransform): | |
| """Place a regular grid of points on the input and randomly move the neighbourhood of these point around | |
| via affine transformations. | |
| This augmentation is deprecated. Please use Affine instead. | |
| Note: This class introduce interpolation artifacts to mask if it has values other than {0;1} | |
| Args: | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image, mask | |
| """ | |
| def __init__( | |
| self, | |
| scale=1.0, | |
| translate_percent=None, | |
| translate_px=None, | |
| rotate=0.0, | |
| shear=0.0, | |
| order=1, | |
| cval=0, | |
| mode="reflect", | |
| always_apply=False, | |
| p=0.5, | |
| ): | |
| super(IAAAffine, self).__init__(always_apply, p) | |
| self.scale = to_tuple(scale, 1.0) | |
| self.translate_percent = to_tuple(translate_percent, 0) | |
| self.translate_px = to_tuple(translate_px, 0) | |
| self.rotate = to_tuple(rotate) | |
| self.shear = to_tuple(shear) | |
| self.order = order | |
| self.cval = cval | |
| self.mode = mode | |
| warnings.warn("This IAAAffine is deprecated. Please use Affine instead", FutureWarning) | |
| def processor(self): | |
| return iaa.Affine( | |
| self.scale, | |
| self.translate_percent, | |
| self.translate_px, | |
| self.rotate, | |
| self.shear, | |
| self.order, | |
| self.cval, | |
| self.mode, | |
| ) | |
| def get_transform_init_args_names(self): | |
| return ("scale", "translate_percent", "translate_px", "rotate", "shear", "order", "cval", "mode") | |
| class IAAPerspective(Perspective): | |
| """Perform a random four point perspective transform of the input. | |
| This augmentation is deprecated. Please use Perspective instead. | |
| Note: This class introduce interpolation artifacts to mask if it has values other than {0;1} | |
| Args: | |
| scale ((float, float): standard deviation of the normal distributions. These are used to sample | |
| the random distances of the subimage's corners from the full image's corners. Default: (0.05, 0.1). | |
| p (float): probability of applying the transform. Default: 0.5. | |
| Targets: | |
| image, mask | |
| """ | |
| def __init__(self, scale=(0.05, 0.1), keep_size=True, always_apply=False, p=0.5): | |
| super(IAAPerspective, self).__init__(always_apply, p) | |
| self.scale = to_tuple(scale, 1.0) | |
| self.keep_size = keep_size | |
| warnings.warn("This IAAPerspective is deprecated. Please use Perspective instead", FutureWarning) | |
| def processor(self): | |
| return iaa.PerspectiveTransform(self.scale, keep_size=self.keep_size) | |
| def get_transform_init_args_names(self): | |
| return ("scale", "keep_size") | |