From bfffc44db6e6c06a50722b540dbb39a945aadb11 Mon Sep 17 00:00:00 2001 From: JonasHell Date: Wed, 9 Nov 2022 15:17:15 +0100 Subject: [PATCH 1/4] add data-dependent PoissonNoise --- torch_em/transform/raw.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/torch_em/transform/raw.py b/torch_em/transform/raw.py index 0db45a72..b5051b1b 100644 --- a/torch_em/transform/raw.py +++ b/torch_em/transform/raw.py @@ -122,6 +122,7 @@ class AdditivePoissonNoise(): """ Add random Poisson noise to image. """ + # TODO: not sure if this does make sense for data that is already normalized def __init__(self, lam=(0.0, 0.75)): self.lam = lam @@ -131,6 +132,23 @@ def __call__(self, img): return img + poisson_noise +class PoissonNoise(): + """ + Add random data-dependent Poisson noise to image. + """ + def __init__(self, multiplier=(1.0, 10.0), clip_kwargs={'a_min': 0, 'a_max': 1}): + self.multiplier = multiplier + self.clip_kwargs = clip_kwargs + + def __call__(self, img, multiplier=None): + multiplier = np.random.uniform(self.multiplier[0], self.multiplier[1]) + offset = img.min() + poisson_noise = np.random.poisson((img - offset) * multiplier) / multiplier + offset + if self.clip_kwargs: + return np.clip(poisson_noise, **self.clip_kwargs) + return poisson_noise + + class GaussianBlur(): """ Blur the image. @@ -182,7 +200,7 @@ def get_default_mean_teacher_augmentations(p=0.5): normalize, transforms.RandomApply([GaussianBlur()], p=p), transforms.RandomApply([AdditiveGaussianNoise()], p=p), - transforms.RandomApply([AdditivePoissonNoise()], p=p) + transforms.RandomApply([PoissonNoise()], p=p) ]) aug2 = transforms.RandomApply([RandomContrast()], p=p) return get_raw_transform( From e84b22de1ebc6e00653decba66782e00db081541 Mon Sep 17 00:00:00 2001 From: JonasHell Date: Wed, 9 Nov 2022 15:20:29 +0100 Subject: [PATCH 2/4] fix additive Poisson noise --- torch_em/transform/raw.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/torch_em/transform/raw.py b/torch_em/transform/raw.py index b5051b1b..f1e03197 100644 --- a/torch_em/transform/raw.py +++ b/torch_em/transform/raw.py @@ -122,13 +122,17 @@ class AdditivePoissonNoise(): """ Add random Poisson noise to image. """ - # TODO: not sure if this does make sense for data that is already normalized - def __init__(self, lam=(0.0, 0.75)): + # TODO: not sure if Poisson noise like this does make sense + # for data that is already normalized + def __init__(self, lam=(0.0, 0.3), clip_kwargs={'a_min': 0, 'a_max': 1}): self.lam = lam + self.clip_kwargs = clip_kwargs def __call__(self, img): lam = np.random.uniform(self.lam[0], self.lam[1]) - poisson_noise = np.random.poisson(lam, size=img.shape) + poisson_noise = np.random.poisson(lam, size=img.shape) / lam + if self.clip_kwargs: + return np.clip(img + poisson_noise, 0, 1) return img + poisson_noise From 5c9e766d19b12b437d414bdd0bba126bc231c590 Mon Sep 17 00:00:00 2001 From: JonasHell Date: Wed, 9 Nov 2022 15:52:05 +0100 Subject: [PATCH 3/4] fix torch incompatibility of numpy --- torch_em/transform/raw.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/torch_em/transform/raw.py b/torch_em/transform/raw.py index f1e03197..8772f625 100644 --- a/torch_em/transform/raw.py +++ b/torch_em/transform/raw.py @@ -144,10 +144,13 @@ def __init__(self, multiplier=(1.0, 10.0), clip_kwargs={'a_min': 0, 'a_max': 1}) self.multiplier = multiplier self.clip_kwargs = clip_kwargs - def __call__(self, img, multiplier=None): + def __call__(self, img): multiplier = np.random.uniform(self.multiplier[0], self.multiplier[1]) offset = img.min() - poisson_noise = np.random.poisson((img - offset) * multiplier) / multiplier + offset + poisson_noise = np.random.poisson((img - offset) * multiplier) + if isinstance(img, torch.Tensor): + poisson_noise = torch.Tensor(poisson_noise) + poisson_noise = poisson_noise / multiplier + offset if self.clip_kwargs: return np.clip(poisson_noise, **self.clip_kwargs) return poisson_noise From f7f23cfbc30161949ba4fd8698f99c5fc36497fa Mon Sep 17 00:00:00 2001 From: JonasHell Date: Thu, 10 Nov 2022 14:11:50 +0100 Subject: [PATCH 4/4] reduce default strength of noise augemntations --- torch_em/transform/raw.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/torch_em/transform/raw.py b/torch_em/transform/raw.py index 8772f625..277196f0 100644 --- a/torch_em/transform/raw.py +++ b/torch_em/transform/raw.py @@ -92,7 +92,7 @@ class RandomContrast(): """ Adjust contrast by scaling image to `mean + alpha * (image - mean)`. """ - def __init__(self, alpha=(0.05, 4), mean=0.5, clip_kwargs={'a_min': 0, 'a_max': 1}): + def __init__(self, alpha=(0.5, 2), mean=0.5, clip_kwargs={'a_min': 0, 'a_max': 1}): self.alpha = alpha self.mean = mean self.clip_kwargs = clip_kwargs @@ -109,12 +109,15 @@ class AdditiveGaussianNoise(): """ Add random Gaussian noise to image. """ - def __init__(self, scale=(0.0, 0.75)): + def __init__(self, scale=(0.0, 0.3), clip_kwargs={'a_min': 0, 'a_max': 1}): self.scale = scale + self.clip_kwargs = clip_kwargs def __call__(self, img): std = np.random.uniform(self.scale[0], self.scale[1]) gaussian_noise = np.random.normal(0, std, size=img.shape) + if self.clip_kwargs: + return np.clip(img + gaussian_noise, 0, 1) return img + gaussian_noise @@ -124,7 +127,7 @@ class AdditivePoissonNoise(): """ # TODO: not sure if Poisson noise like this does make sense # for data that is already normalized - def __init__(self, lam=(0.0, 0.3), clip_kwargs={'a_min': 0, 'a_max': 1}): + def __init__(self, lam=(0.0, 0.1), clip_kwargs={'a_min': 0, 'a_max': 1}): self.lam = lam self.clip_kwargs = clip_kwargs @@ -140,7 +143,7 @@ class PoissonNoise(): """ Add random data-dependent Poisson noise to image. """ - def __init__(self, multiplier=(1.0, 10.0), clip_kwargs={'a_min': 0, 'a_max': 1}): + def __init__(self, multiplier=(5.0, 10.0), clip_kwargs={'a_min': 0, 'a_max': 1}): self.multiplier = multiplier self.clip_kwargs = clip_kwargs @@ -160,7 +163,7 @@ class GaussianBlur(): """ Blur the image. """ - def __init__(self, kernel_size=(2, 24), sigma=(0, 5)): + def __init__(self, kernel_size=(2, 12), sigma=(0, 2.5)): self.kernel_size = kernel_size self.sigma = sigma @@ -201,13 +204,13 @@ def get_raw_transform(normalizer=standardize, augmentation1=None, augmentation2= # The default values are made for an image with pixel values in # range [0, 1]. That the image is in this range is ensured by an # initial normalizations step. -def get_default_mean_teacher_augmentations(p=0.5): +def get_default_mean_teacher_augmentations(p=0.3): norm = normalize aug1 = transforms.Compose([ normalize, transforms.RandomApply([GaussianBlur()], p=p), - transforms.RandomApply([AdditiveGaussianNoise()], p=p), - transforms.RandomApply([PoissonNoise()], p=p) + transforms.RandomApply([PoissonNoise()], p=p/2), + transforms.RandomApply([AdditiveGaussianNoise()], p=p/2), ]) aug2 = transforms.RandomApply([RandomContrast()], p=p) return get_raw_transform(