From 8efe2528dc4ae49ec44e4325345a864927ba6989 Mon Sep 17 00:00:00 2001 From: function2 Date: Wed, 26 Jul 2023 01:53:23 +0800 Subject: [PATCH 1/5] fix lazy rand affine Signed-off-by: function2 --- monai/transforms/spatial/array.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index d37e69650c..4460aa1c86 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -2523,6 +2523,7 @@ def __call__( img = convert_to_tensor(img, track_meta=get_track_meta()) if lazy_: if self._do_transform: + self.rand_affine_grid(sp_size, randomize=False, lazy=True) affine = self.rand_affine_grid.get_transformation_matrix() else: affine = convert_to_dst_type(torch.eye(len(sp_size) + 1), img, dtype=self.rand_affine_grid.dtype)[0] @@ -2530,7 +2531,7 @@ def __call__( if grid is None: grid = self.get_identity_grid(sp_size, lazy_) if self._do_transform: - grid = self.rand_affine_grid(grid=grid, randomize=randomize, lazy=lazy_) + grid = self.rand_affine_grid(grid=grid, randomize=False, lazy=lazy_) affine = self.rand_affine_grid.get_transformation_matrix() return affine_func( # type: ignore img, From 6f9f56b54367569a5c7748195339cdb93efc35db Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Fri, 28 Jul 2023 14:27:41 +0100 Subject: [PATCH 2/5] Update array.py --- monai/transforms/spatial/array.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index 4460aa1c86..654f408cb0 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -2523,7 +2523,7 @@ def __call__( img = convert_to_tensor(img, track_meta=get_track_meta()) if lazy_: if self._do_transform: - self.rand_affine_grid(sp_size, randomize=False, lazy=True) + self.rand_affine_grid(sp_size, randomize=randomize, lazy=True) affine = self.rand_affine_grid.get_transformation_matrix() else: affine = convert_to_dst_type(torch.eye(len(sp_size) + 1), img, dtype=self.rand_affine_grid.dtype)[0] @@ -2531,7 +2531,7 @@ def __call__( if grid is None: grid = self.get_identity_grid(sp_size, lazy_) if self._do_transform: - grid = self.rand_affine_grid(grid=grid, randomize=False, lazy=lazy_) + grid = self.rand_affine_grid(grid=grid, randomize=randomize, lazy=lazy_) affine = self.rand_affine_grid.get_transformation_matrix() return affine_func( # type: ignore img, From 6134967ca03ceec6d6ce65e40fe65572e3bcfea2 Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Fri, 28 Jul 2023 14:31:15 +0100 Subject: [PATCH 3/5] adds a test case test_rand_affine.py --- tests/test_rand_affine.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_rand_affine.py b/tests/test_rand_affine.py index 83aafe9773..915b14bf51 100644 --- a/tests/test_rand_affine.py +++ b/tests/test_rand_affine.py @@ -145,6 +145,7 @@ def test_rand_affine(self, input_param, input_data, expected_val): g = RandAffine(**input_param) g.set_random_state(123) result = g(**input_data) + g.rand_affine_grid.affine = torch.eye(4, dtype=torch.float64) # reset affine test_resampler_lazy(g, result, input_param, input_data, seed=123) if input_param.get("cache_grid", False): self.assertTrue(g._cached_grid is not None) From d452bd16f2459a46f3e93e4aff117caf401d7a51 Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Fri, 28 Jul 2023 18:40:22 +0100 Subject: [PATCH 4/5] generate grid when `grid is None` --- monai/transforms/spatial/array.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index 654f408cb0..6d95acb3d1 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -2523,7 +2523,8 @@ def __call__( img = convert_to_tensor(img, track_meta=get_track_meta()) if lazy_: if self._do_transform: - self.rand_affine_grid(sp_size, randomize=randomize, lazy=True) + if grid is None: + self.rand_affine_grid(sp_size, randomize=randomize, lazy=True) affine = self.rand_affine_grid.get_transformation_matrix() else: affine = convert_to_dst_type(torch.eye(len(sp_size) + 1), img, dtype=self.rand_affine_grid.dtype)[0] From 436bca692ccf1473ab7c3420abbeabcee88b0f7a Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Fri, 28 Jul 2023 18:42:19 +0100 Subject: [PATCH 5/5] backward compatibility for RandAffined --- monai/transforms/spatial/dictionary.py | 1 + 1 file changed, 1 insertion(+) diff --git a/monai/transforms/spatial/dictionary.py b/monai/transforms/spatial/dictionary.py index 79742f0582..6f53b10fc2 100644 --- a/monai/transforms/spatial/dictionary.py +++ b/monai/transforms/spatial/dictionary.py @@ -1141,6 +1141,7 @@ def __call__( grid = self.rand_affine.get_identity_grid(sp_size, lazy=lazy_) if self._do_transform: # add some random factors grid = self.rand_affine.rand_affine_grid(sp_size, grid=grid, lazy=lazy_) + grid = 0 if grid is None else grid # always provide a grid to self.rand_affine for key, mode, padding_mode in self.key_iterator(d, self.mode, self.padding_mode): # do the transform