diff --git a/monai/transforms/croppad/dictionary.py b/monai/transforms/croppad/dictionary.py index 750add4a28..d68c4c4779 100644 --- a/monai/transforms/croppad/dictionary.py +++ b/monai/transforms/croppad/dictionary.py @@ -543,8 +543,11 @@ def randomize(self, data: Optional[Any] = None) -> None: def __call__(self, data: Mapping[Hashable, np.ndarray]) -> List[Dict[Hashable, np.ndarray]]: ret = [] - d = dict(data) for i in range(self.num_samples): + d = dict(data) + # deep copy all the unmodified data + for key in set(data.keys()).difference(set(self.keys)): + d[key] = deepcopy(data[key]) cropped = self.cropper(d) # add `patch_index` to the meta data for key in self.key_iterator(d): diff --git a/tests/test_rand_spatial_crop_samplesd.py b/tests/test_rand_spatial_crop_samplesd.py index 09688f44b7..3f5eee7b27 100644 --- a/tests/test_rand_spatial_crop_samplesd.py +++ b/tests/test_rand_spatial_crop_samplesd.py @@ -14,7 +14,7 @@ import numpy as np from parameterized import parameterized -from monai.transforms import RandSpatialCropSamplesd +from monai.transforms import Compose, RandSpatialCropSamplesd, ToTensord TEST_CASE_1 = [ {"keys": ["img", "seg"], "num_samples": 4, "roi_size": [2, 2, 2], "random_center": True}, @@ -76,6 +76,22 @@ def test_shape(self, input_param, input_data, expected_shape, expected_last): np.testing.assert_allclose(item["img"], expected_last["img"]) np.testing.assert_allclose(item["seg"], expected_last["seg"]) + def test_deep_copy(self): + data = {"img": np.ones((1, 10, 11, 12))} + num_samples = 3 + sampler = RandSpatialCropSamplesd( + keys=["img"], + roi_size=(3, 3, 3), + num_samples=num_samples, + random_center=True, + random_size=False, + ) + transform = Compose([ToTensord(keys="img"), sampler]) + samples = transform(data) + self.assertEqual(len(samples), num_samples) + for sample in samples: + self.assertEqual(len(sample["img_transforms"]), len(transform)) + if __name__ == "__main__": unittest.main()