Skip to content

Releases: albumentations-team/albumentations

Albumentations 1.4.20 Release Notes

24 Oct 23:45
759d8de
Compare
Choose a tag to compare

Hotfix version.

Albumentations 1.4.19 Release Notes

23 Oct 20:36
13a510d
Compare
Choose a tag to compare
  • Support Our Work
  • Transforms
  • Core
  • Bug Fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

Transforms

Added mask_interpolation to all transforms that use mask interpolation, including:

by @ternaus

Core

  • Minimal supported python version is 3.9
  • Removed dependency on scikit-image
  • Updated Random number generator from np.random.state to np.random.generator. Second is 50% faster => speedups in all transforms that heavily use random generator
  • Where possible moved from cv2.LUT to stringzilla lut
  • Added parameter mask_interpolation to Compose that overrides mask interpolation value in all transforms in that Compose, now can use more accurate cv2.INTER_NEAREST_EXACT for semantic segmentation and can work with depth and heatmap estimation using cubic, area, linear, etc

BugFixes

Albumentations 1.4.18 Release Notes

08 Oct 22:32
47f9592
Compare
Choose a tag to compare
  • Support Our Work
  • Transforms
  • Core
  • Deprecations
  • Bugfixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

Transforms

GridDistortion

Screenshot 2024-10-08 at 15 06 03

Added support for keypoints

GridDropout

Screenshot 2024-10-08 at 15 08 04

Added support for keypoints and bounding boxes

GridElasticDeform

Screenshot 2024-10-08 at 15 10 24

Added support for keypoints and bounding boxes

MaskDropout

Screenshot 2024-10-08 at 15 11 53

Added support for keypoints and bounding boxes

Morphological

Screenshot 2024-10-08 at 15 13 36

Added support for bounding boxes and keypoints

OpticalDistortion

Screenshot 2024-10-08 at 15 18 23

Added support for keypoints

PixelDropout

Screenshot 2024-10-08 at 15 19 46

Added support for keypoints and bonding boxes

XYMasking

Screenshot 2024-10-08 at 15 21 52

Added support for bounding boxes and keypoints

Core

Added support for masks as numpy arrays of the shape (num_masks, height, width)

Now you can apply transforms to masks as:

masks = <numpy array with shape (num_masks, height, width)>

transform(image=image, masks=masks)

Deprecations

Removed MixUp as it was doing almost exactly the same as TemplateTransform

Bugfixes

  • Bugfix in RandomFog
  • Bugfix in PlankianJitter
  • Several people reported issue with masks as list of numpy arrays, I guess it was fixed as a part of some other work as I cannot reproduce it. Just in case added tests for that case.

Albumentations 1.4.17 Release Notes

30 Sep 22:33
e7d5ef1
Compare
Choose a tag to compare
  • Support Our Work
  • Transforms
  • Core

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

Transforms

CoarseDropout

  1. Added Bounding Box support
  2. remove_invisible=False keeps keypoints
Screenshot 2024-09-30 at 15 25 53

by @ternaus

ElasticTransform

Added support for keypoints

Screenshot 2024-09-30 at 15 29 36

by @ternaus

Core

Added RandomOrder Compose

Select N transforms to apply. Selected transforms will be called in random order with force_apply=True. 
Transforms probabilities will be normalized to one 1, so in this case transforms probabilities works as weights. 
This transform is like SomeOf, but transforms are called with random order. 
It will not replay random order in ReplayCompose.

Albumentations 1.4.16 Release Notes

22 Sep 20:42
9eeb60d
Compare
Choose a tag to compare
  • Support Our Work
  • UI Tool
  • Transforms
  • Improvements and Bug Fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

UI Tool

For visual debug wrote a tool that allows visually inspect effects of augmentations on the image.

You can find it at https://explore.albumentations.ai/

  • Works for all ImageOnly transforms
  • Authorized users can upload their own images

it is work in progress. It is not stable and polished yet, but if you have feedback or proposals - just write in the Discord Server mentioned above.

Transforms

  • Updated and extended docstrings in all ImageOnly transforms.
  • All ImageOnly transforms support both uint8 and float32 inputs

RandomSnow

Added texture method to RandomSnow

Screenshot 2024-09-14 at 19 09 52

RandomSunflare

Added physics_based method to RandomSunFlare
Screenshot 2024-09-14 at 19 10 41

Bugfixes and improvements

  • Bugfix in albucore dependency. Now every Albumnetations version is tailored to a specific albucore version. Added pre-commit hook to automatically check it on every commit.
  • BugFix in TextImage transform, after rewriting bbox processing in a vectorized form, transform was failing.
  • As a part of the work to remove scikit-image dependency @momincks rewrote bbox_affine in a plain numpy
  • Bugfix. It was unexpected, but people use bounding bboxes that are less than 1 pixel. Removed constrant on a minimum bounding box being 1x1
  • Bugfix in bounding box filtering. Now if all bounding boxes were filtered return not empty array, but empty array of shape (0, 4)

Albumentations 1.4.15 Release Notes

13 Sep 01:54
c0af803
Compare
Choose a tag to compare
  • Support Our Work
  • UI Tool
  • Core
  • Transforms
  • Improvements and Bug Fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

UI Tool

For visual debug wrote a tool that allows visually inspect effects of augmentations on the image.

You can find it at https://explore.albumentations.ai/

RIght now supports only ImageOnly transforms, and not all but a subset of them.

it is work in progress. It is not stable and polished yet, but if you have feedback or proposals - just write in the Discord Server mentioned above.

Screenshot 2024-09-12 at 18 11 49

Core

Bounding box and keypoint processing was vectorized

  • You can pass numpy array to compose and not only list of lists.
  • Presumably transforms will work faster, but did not benchmark.

Transforms

Affine

  • Reflection padding correctly works In Affine and ShiftScaleRotate

CLAHE

  • Added support for float32 images

Equalize

  • Added support for float32 images

FancyPCA

  • Added support for float32 images
  • Added support for any number of channels

PixelDistributionAdaptation

  • Added support for float32
  • Added support for anyu number of channels

Flip

Still works, but deprecated. It was a very strange transform, I cannot find use case, where you needed to use it.

It was equivalent to:

OneOf([Transpose, VerticalFlip, HorizontalFlip]) 

Most likely if you needed transform that does not create artifacts, you should look at:

  • Natural images => HorizontalFlip (Symmetry group has 2 elements, meaning will effectively increase your dataset 2x)
  • Images that look natural when you vertically flip them => VerticalFlip (Symmetry group has 2 elements, meaning will effectively increase your dataset 2x)
  • Images that need to preserve parity, for example texts, but we may expect rotated documents => RandomRotate90 (Symmetry group has 2 elements, meaning will effectively increase your dataset 4x)
  • Images that you can flip and rotate as you wish => D4 (Symmetry group has 8 elements, meaning will effectively increase your dataset 8x)

ToGray

Now you can define the number of output channels in the resulting gray image. All channels will be the same.

Extended ways one can get grayscale image. Most of them can work with any number of channels as input

  • weighted_average: Uses a weighted sum of RGB channels (0.299R + 0.587G + 0.114B)
    Works only with 3-channel images. Provides realistic results based on human perception.
  • from_lab: Extracts the L channel from the LAB color space.
    Works only with 3-channel images. Gives perceptually uniform results.
  • desaturation: Averages the maximum and minimum values across channels.
    Works with any number of channels. Fast but may not preserve perceived brightness well.
  • average: Simple average of all channels.
    Works with any number of channels. Fast but may not give realistic results.
  • max: Takes the maximum value across all channels.
    Works with any number of channels. Tends to produce brighter results.
  • pca: Applies Principal Component Analysis to reduce channels.
    Works with any number of channels. Can preserve more information but is computationally intensive.

SafeRotate

Now uses Affine under the hood.

Improvements and Bug Fixes

  • Bugfix in GridElasticDeform by @4pygmalion
  • Speedups in to_float and from_float
  • Bugfix in PadIfNeeded. Did not work when empty bounding boxes were passed.

Albumentations 1.4.14 Release Notes

16 Aug 00:22
fa2a6d1
Compare
Choose a tag to compare
  • Support Our Work
  • Transforms
  • Improvements and Bug Fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

Transforms

Added GridElasticDeform transform

image

Grid-based Elastic deformation Albumentation implementation

This class applies elastic transformations using a grid-based approach.
The granularity and intensity of the distortions can be controlled using
the dimensions of the overlaying distortion grid and the magnitude parameter.
Larger grid sizes result in finer, less severe distortions.

Args:
    num_grid_xy (tuple[int, int]): Number of grid cells along the width and height.
        Specified as (grid_width, grid_height). Each value must be greater than 1.
    magnitude (int): Maximum pixel-wise displacement for distortion. Must be greater than 0.
    interpolation (int): Interpolation method to be used for the image transformation.
        Default: cv2.INTER_LINEAR
    mask_interpolation (int): Interpolation method to be used for mask transformation.
        Default: cv2.INTER_NEAREST
    p (float): Probability of applying the transform. Default: 1.0.

Targets:
    image, mask

Image types:
    uint8, float32

Example:
    >>> transform = GridElasticDeform(num_grid_xy=(4, 4), magnitude=10, p=1.0)
    >>> result = transform(image=image, mask=mask)
    >>> transformed_image, transformed_mask = result['image'], result['mask']

Note:
    This transformation is particularly useful for data augmentation in medical imaging
    and other domains where elastic deformations can simulate realistic variations.

by @4pygmalion

PadIfNeeded

Now reflection padding correctly with bounding boxes and keypoints

by @ternaus

RandomShadow

  • Works with any number of channels
  • Intensity of the shadow is not hardcoded constant anymore but could be sampled
Simulates shadows for the image by reducing the brightness of the image in shadow regions.

Args:
    shadow_roi (tuple): region of the image where shadows
        will appear (x_min, y_min, x_max, y_max). All values should be in range [0, 1].
    num_shadows_limit (tuple): Lower and upper limits for the possible number of shadows.
        Default: (1, 2).
    shadow_dimension (int): number of edges in the shadow polygons. Default: 5.
    shadow_intensity_range (tuple): Range for the shadow intensity.
        Should be two float values between 0 and 1. Default: (0.5, 0.5).
    p (float): probability of applying the transform. Default: 0.5.

Targets:
    image

Image types:
    uint8, float32

Reference:
    https://github.com/UjjwalSaxena/Automold--Road-Augmentation-Library

by @JonasKlotz

Improvements and Bug Fixes

  • BugFix in Affine. Now fit_output=True works correctly with bounding boxes. by @ternaus
  • BugFix in ColorJitter. By @maremun
  • Speedup in CoarseDropout. By @thomaoc1
  • Check for updates does not use logger anymore. by @ternaus
  • Bugfix in HistorgramMatching. Before it output array of ones. Now works as expected. by @ternaus

1.4.13

05 Aug 23:00
39895a8
Compare
Choose a tag to compare

What's Changed

Full Changelog: 1.4.12...1.4.13

Albumentations 1.4.12 Release Notes

27 Jul 00:28
bc42cc7
Compare
Choose a tag to compare
  • Support Our Work
  • Transforms
  • Core Functionality
  • Deprecations
  • Improvements and Bug Fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click away.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server

Transforms

Added TextImage transform

Allows adding text on top of images. Works with np,unit8 and np.float32 images with any number of channels.

Additional functionalities:

  • Insert random stopwords
  • Delete random words
  • Swap word order

Example notebook

image

Core functionality

Added images target

You can now apply the same transform to a list of images of the same shape, not just one image.

Use cases:

  • Video: Split video into frames and apply the transform.
  • Slices of 3D volumes: For example, in medical imaging.
import albumentations as A

transform = A.Compose([A.Affine(p=1)])

transformed = transform(images=<list of images>)

transformed_images = transformed["images"]

Note:
You can apply the same transform to any number of images, masks, bounding boxes, and sets of keypoints using the additional_targets functionality notebook with examples

Contributors @ternaus, @ayasyrev

get_params_dependent_on data

Relevant for those who build custom transforms.

Old way

@property
def targets_as_params(self) -> list[str]:
        return <list of targets>

def get_params_dependent_on_targets(self, params: dict[str, Any]) -> dict[str, np.ndarray]:
    image = params["image"]
....

New way

def get_params_dependent_on_data(self, params: dict[str, Any], data: dict[str, Any]) -> dict[str, np.ndarray]:
    image = data["image"]

Contributor @ayasyrev

Added shape to params

Old way:

def get_params_dependent_on_targets(self, params: dict[str, Any]) -> dict[str, np.ndarray]:
    image = params["image"]
    shape = image.shape

New way:

def get_params_dependent_on_data(self, params: dict[str, Any], data: dict[str, Any]) -> dict[str, np.ndarray]:
    shape = params["shape"]

Contributor @ayasyrev

Deprecations

Elastic Transform

Deprecated parameter alpha_affine in ElasticTransform. To have Affine effects on your image, use the Affine transform.

Contributor @ternaus

Improvements and Bug Fixes

  • Removed dependency on scikit-learn. Contributor: @ternaus
  • Added instructions on how to disable the new version availability message. Contributor: @ternaus
  • Bugfix in constant padding with nonzero values in CropAndPad, Affine, PadIfNeeded, and Rotate. Contributor: @ternaus

Albumentations 1.4.11 Release Notes

05 Jul 02:10
bd644a3
Compare
Choose a tag to compare
  • Support our work
  • Transforms
  • Core functionality
  • Deprecations
  • Improvements and bug fixes

Support Our Work

  1. Love the library? You can contribute to its development by becoming a sponsor for the library. Your support is invaluable, and every contribution makes a difference.
  2. Haven't starred our repo yet? Show your support with a ⭐! It's just only one mouse click.
  3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our issues or join the conversation on our Discord server for Albumentations

Transforms

Added OverlayElements transform

Allows to paste set of images + corresponding masks to the image.
It is not entirely CopyAndPaste as "masks", "bounding boxes" and "keypoints" are not supported, but step in that direction.

Example Notebook

image

Affine

Added balanced sampling for scale_limit

From FAQ:

The default scaling logic in RandomScale, ShiftScaleRotate, and Affine transformations is biased towards upscaling.

For example, if scale_limit = (0.5, 2), a user might expect that the image will be scaled down in half of the cases and scaled up in the other half. However, in reality, the image will be scaled up in 75% of the cases and scaled down in only 25% of the cases. This is because the default behavior samples uniformly from the interval [0.5, 2], and the interval [0.5, 1] is three times smaller than [1, 2].

To achieve balanced scaling, you can use Affine with balanced_scale=True, which ensures that the probability of scaling up and scaling down is equal.

balanced_scale_transform = A.Compose([A.Affine(scale=(0.5, 2), balanced_scale=True)])

by @ternaus

RandomSizedBBoxSafeCrop

Added support for keypoints

by @ternaus

BBoxSafeRandomCrop

Added support for keypoints

by @ternaus

RandomToneCurve

  1. Now can sample noise per channel
  2. Works with any number of channels
  3. Now works not just with uint8, but with float32 images as well

by @zakajd

ISONoise

  1. BugFix
  2. Now works not just with uint8, but with float32 images as well

by @ternaus

Core

Added strict parameter to Compose

If strict=True only targets that are expected could be passed.
If strict = False, user can pass data with extra keys. Such data would not be affected by transforms.

Request came from users that use pipelines in the form:

transform = A.Compose([....])

data = A.Compose(**data)

by @ayasyrev

Refactoring

Crop module was heavily refactored, all tests and checks pass, but we will see.

Deprecations

Grid Dropout

Old way:

 GridDropout(
 holes_number_x=XXX,
 holes_numver_y=YYY,
 unit_size_min=ZZZ,
 unit_size_max=PPP 
 )

New way:

GridDropout(
holes_number_xy = (XXX, YYY),
unit_size_range = (ZZZ, PPP)
)

by @ternaus

RandomSunFlare

Old way:

RandomSunFlare(
num_flare_circles_lower = XXX,
num_flare_circles_upper = YYY
)

new way:

RandomSunFlare(num_flare_circles_range = (XXX, YYY))

Bugfixes

  • Bugfix in ISONoise, as it returned zeros. by @ternaus
  • BugFix in Affine as during rotation image, mask, keypoints have one center point for rotation and bounding box another => we need to create two separate affine matrices. by @ternaus
  • Small fix in Error Message by @philipp-fischer
  • Bugfix that affected many transforms, where users specified probability as number and not as p=number. Say for VerticalFlip(0.5) you could expect 50% chance, but 0.5 was attributed not to p but to always_apply which meant that the transform was always applied. by @ayasyrev