Source code for augraphy.base.oneof
import random
import numpy as np
from augraphy.base.augmentation import Augmentation
from augraphy.base.augmentationsequence import AugmentationSequence
[docs]
class OneOf(Augmentation):
"""Given a list of Augmentations, selects one to apply.
:param augmentations: A list of Augmentations to choose from.
:type augmentations: list
:param p: The probability that this augmentation will be applied.
:type p: float, optional
"""
def __init__(self, augmentations, p=1):
"""Constructor method"""
self.augmentations = augmentations
self.augmentation_probabilities = self.compute_probability(self.augmentations)
self.p = p
# Randomly selects an Augmentation to apply to data.
def __call__(self, image, layer=None, force=False):
if force or self.should_run():
# Select one augmentation using the max value in probability values
augmentation = self.augmentations[np.argmax(self.augmentation_probabilities)]
# Applies the selected Augmentation.
image = augmentation(image, force=True)
return image, [augmentation]
# Constructs a string containing the representations
# of each augmentation
def __repr__(self):
r = "OneOf([\n"
for augmentation in self.augmentations:
r += f"\t{repr(augmentation)}\n"
r += f"], p={self.p})"
return r
[docs]
def compute_probability(self, augmentations):
"""For each Augmentation in the input list, compute the probability of applying that Augmentation.
:param augmentations: Augmentations to compute probability list for.
:type augmentations: list
"""
# generate random 0-1 value for each augmentation
augmentation_probabilities = [random.uniform(0, 1.0) for augmentation in augmentations]
probability_sum = sum(augmentation_probabilities)
# generate weighted probability by using (probability/ sum of probabilities)
augmentation_probabilities = [
augmentation_probability / probability_sum for augmentation_probability in augmentation_probabilities
]
return augmentation_probabilities