Albumentations

Latest version: v1.4.21

Safety actively analyzes 682361 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 2 of 7

1.4.15

- 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](https://github.com/sponsors/albumentations-team). 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](https://github.com/albumentations-team/albumentations).
3. **Got ideas or facing issues?** We'd love to hear from you. Share your thoughts in our [issues](https://github.com/albumentations-team/albumentations/issues) or join the conversation on our [Discord server](https://discord.gg/AmMnDBdzYs)

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/](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](https://github.com/user-attachments/assets/c135694a-ffd2-478b-ac00-ee8d37a1c476)

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:

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

1.4.14

- 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](https://github.com/sponsors/albumentations-team). 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](https://github.com/albumentations-team/albumentations).
3. **Got ideas or facing issues?** We'd love to hear from you. Share your thoughts in our [issues](https://github.com/albumentations-team/albumentations/issues) or join the conversation on our [Discord server](https://discord.gg/AmMnDBdzYs)

Transforms
Added `GridElasticDeform` transform

![image](https://github.com/user-attachments/assets/574c0b71-33cd-4b8b-a3c3-808326eddd2f)

python
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

python
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

What's Changed
* Updated mixing parameters by ternaus in https://github.com/albumentations-team/albumentations/pull/1859
* Updated TextImage by ternaus in https://github.com/albumentations-team/albumentations/pull/1860
* Fix contigous by ternaus in https://github.com/albumentations-team/albumentations/pull/1862

**Full Changelog**: https://github.com/albumentations-team/albumentations/compare/1.4.12...1.4.13

1.4.12

- 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](https://github.com/sponsors/albumentations-team). 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](https://github.com/albumentations-team/albumentations).
3. **Got ideas or facing issues?** We'd love to hear from you. Share your thoughts in our [issues](https://github.com/albumentations-team/albumentations/issues) or join the conversation on our [Discord server](https://discord.gg/AmMnDBdzYs)

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](https://albumentations.ai/docs/examples/example_textimage/)

![image](https://github.com/user-attachments/assets/ab59dcbf-8198-4179-88f6-403a092b4ed8)

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.

python
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](https://albumentations.ai/docs/examples/example_multi_target/)

Contributors ternaus, ayasyrev

`get_params_dependent_on data`

Relevant for those who build custom transforms.

Old way
python
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
python
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:
python
def get_params_dependent_on_targets(self, params: dict[str, Any]) -> dict[str, np.ndarray]:
image = params["image"]
shape = image.shape


New way:
python
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

1.4.11

- 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](https://github.com/sponsors/albumentations-team). 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](https://github.com/albumentations-team/albumentations).
3. Got ideas or facing issues? We'd love to hear from you. Share your thoughts in our [issues](https://github.com/albumentations-team/albumentations/issues) or join the conversation on our [Discord server for Albumentations](https://discord.gg/AmMnDBdzYs)

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](https://github.com/albumentations-team/albumentations_examples/blob/main/notebooks/example_OverlayElements.ipynb)

![image](https://github.com/albumentations-team/albumentations/assets/5481618/2e0ebf10-fda4-430f-bfd2-b00d5825d9b2)

Affine
Added balanced sampling for `scale_limit`

From [FAQ](https://albumentations.ai/docs/faq/#how-to-perform-balanced-scaling):

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.

python
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:
python
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:
python
GridDropout(
holes_number_x=XXX,
holes_numver_y=YYY,
unit_size_min=ZZZ,
unit_size_max=PPP
)

New way:

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


by ternaus

RandomSunFlare
Old way:

python
RandomSunFlare(
num_flare_circles_lower = XXX,
num_flare_circles_upper = YYY
)


new way:
python
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

1.4.10

Hotfix release that addresses issues introduced in 1.4.9

There were two issues in GaussNoise that this release addresses:

- Default value of 0.5 for `noise_scale_factor`, which is different from the behavior before version 1.4.9. Now default value = 1, which means random noise is created for every point independently
- Noise was truncated before adding to the image, so that `gauss >=0`. Fixed.

Page 2 of 7

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.