From c3a41885df990aa04b77c72efa2c26d03e3e7f9a Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 8 Oct 2021 18:12:04 +0800 Subject: [PATCH 1/2] [DLMED] enhance random computation Signed-off-by: Nic Ma --- monai/transforms/intensity/array.py | 17 +++++++---------- monai/transforms/intensity/dictionary.py | 21 ++++++++------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index fd4aceb376..0e451f153f 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -90,27 +90,24 @@ class RandGaussianNoise(RandomizableTransform): backend = [TransformBackends.TORCH, TransformBackends.NUMPY] - def __init__(self, prob: float = 0.1, mean: Union[Sequence[float], float] = 0.0, std: float = 0.1) -> None: + def __init__(self, prob: float = 0.1, mean: float = 0.0, std: float = 0.1) -> None: RandomizableTransform.__init__(self, prob) self.mean = mean self.std = std - self._noise: np.ndarray - def randomize(self, im_shape: Sequence[int]) -> None: - super().randomize(None) - self._noise = self.R.normal(self.mean, self.R.uniform(0, self.std), size=im_shape) + def _add_noise(self, img: NdarrayOrTensor) -> NdarrayOrTensor: + noise = self.R.normal(self.mean, self.R.uniform(0, self.std), size=img.shape) + noise_, *_ = convert_to_dst_type(noise, img) + return img + noise_ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: """ Apply the transform to `img`. """ - self.randomize(img.shape) - if self._noise is None: - raise RuntimeError("randomized factor should not be None.") + super().randomize(None) if not self._do_transform: return img - noise, *_ = convert_to_dst_type(self._noise, img) - return img + noise + return self._add_noise(img) class RandRicianNoise(RandomizableTransform): diff --git a/monai/transforms/intensity/dictionary.py b/monai/transforms/intensity/dictionary.py index d921aaeb36..dbbfe3cba0 100644 --- a/monai/transforms/intensity/dictionary.py +++ b/monai/transforms/intensity/dictionary.py @@ -168,24 +168,19 @@ def __init__( self.std = std self._noise: List[np.ndarray] = [] - def randomize(self, im_shape: Sequence[int]) -> None: - super().randomize(None) - self._noise.clear() - for m in self.mean: - self._noise.append(self.R.normal(m, self.R.uniform(0, self.std), size=im_shape)) + def _add_noise(self, img: NdarrayTensor, mean: float) -> NdarrayTensor: + noise = self.R.normal(mean, self.R.uniform(0, self.std), size=img.shape) + noise_, *_ = convert_to_dst_type(noise, img) + return img + noise_ def __call__(self, data: Mapping[Hashable, NdarrayTensor]) -> Dict[Hashable, NdarrayTensor]: d = dict(data) - - image_shape = d[self.keys[0]].shape # image shape from the first data key - self.randomize(image_shape) - if len(self._noise) != len(self.keys): - raise RuntimeError("inconsistent noise items and keys.") + super().randomize(None) if not self._do_transform: return d - for key, noise in self.key_iterator(d, self._noise): - noise, *_ = convert_to_dst_type(noise, d[key]) - d[key] = d[key] + noise + + for key, mean in self.key_iterator(d, self.mean): + d[key] = self._add_noise(img=d[key], mean=mean) return d From bac94a5216f3fb8d06f241e1e5c98706547d5fa2 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 8 Oct 2021 21:41:58 +0800 Subject: [PATCH 2/2] [DLMED] update according to comments Signed-off-by: Nic Ma --- monai/transforms/intensity/array.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index 0e451f153f..86a865c237 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -95,8 +95,12 @@ def __init__(self, prob: float = 0.1, mean: float = 0.0, std: float = 0.1) -> No self.mean = mean self.std = std + def randomize(self, data: Any) -> None: + super().randomize(None) + self._rand_std = self.R.uniform(0, self.std) + def _add_noise(self, img: NdarrayOrTensor) -> NdarrayOrTensor: - noise = self.R.normal(self.mean, self.R.uniform(0, self.std), size=img.shape) + noise = self.R.normal(self.mean, self._rand_std, size=img.shape) noise_, *_ = convert_to_dst_type(noise, img) return img + noise_ @@ -104,7 +108,7 @@ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: """ Apply the transform to `img`. """ - super().randomize(None) + self.randomize(None) if not self._do_transform: return img return self._add_noise(img)