From 1159655a664579565ee4a65b55a3ad099afcefa7 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 30 Sep 2021 11:03:21 +0800 Subject: [PATCH 1/5] [DLMED] fix crop performance issue Signed-off-by: Nic Ma --- monai/transforms/croppad/array.py | 4 ++-- monai/transforms/intensity/array.py | 3 ++- monai/transforms/utils.py | 12 ++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/monai/transforms/croppad/array.py b/monai/transforms/croppad/array.py index 1c3bbf6833..c904631bed 100644 --- a/monai/transforms/croppad/array.py +++ b/monai/transforms/croppad/array.py @@ -419,7 +419,7 @@ def __init__( if roi_start_torch.numel() == 1: self.slices = [slice(int(roi_start_torch.item()), int(roi_end_torch.item()))] else: - self.slices = [slice(int(s.item()), int(e.item())) for s, e in zip(roi_start_torch, roi_end_torch)] + self.slices = [slice(int(s), int(e)) for s, e in zip(roi_start_torch.tolist(), roi_end_torch.tolist())] def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: """ @@ -966,7 +966,7 @@ def __call__( results: List[NdarrayOrTensor] = [] if self.centers is not None: for center in self.centers: - cropper = SpatialCrop(roi_center=tuple(center), roi_size=self.spatial_size) + cropper = SpatialCrop(roi_center=center, roi_size=self.spatial_size) results.append(cropper(img)) return results diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index 0e9f922888..2dc1ed1a94 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -739,7 +739,8 @@ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: epsilon = 1e-7 img_min = img.min() img_range = img.max() - img_min - return ((img - img_min) / float(img_range + epsilon)) ** self.gamma * img_range + img_min + ret: NdarrayOrTensor = ((img - img_min) / float(img_range + epsilon)) ** self.gamma * img_range + img_min + return ret class RandAdjustContrast(RandomizableTransform): diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index 01a62e36ff..3eefc08555 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -291,6 +291,9 @@ def map_binary_to_indices( else: bg_indices = nonzero(~label_flat) + # no need to save the indices in GPU, otherwise, still need to move to CPU at runtime when crop by indices + fg_indices, *_ = convert_data_type(fg_indices, device=torch.device("cpu"), dtype=torch.int16) + bg_indices, *_ = convert_data_type(bg_indices, device=torch.device("cpu"), dtype=torch.int16) return fg_indices, bg_indices @@ -389,7 +392,7 @@ def correct_crop_centers( centers: List[Union[int, torch.Tensor]], spatial_size: Union[Sequence[int], int], label_spatial_shape: Sequence[int], -) -> List[int]: +): """ Utility to correct the crop center if the crop size is bigger than the image size. @@ -422,9 +425,7 @@ def correct_crop_centers( center_i = valid_end[i] - 1 centers[i] = center_i - corrected_centers: List[int] = [c.item() if isinstance(c, torch.Tensor) else c for c in centers] # type: ignore - - return corrected_centers + return centers def generate_pos_neg_label_crop_centers( @@ -476,8 +477,7 @@ def generate_pos_neg_label_crop_centers( idx = indices_to_use[random_int] center = unravel_index(idx, label_spatial_shape) # shift center to range of valid centers - center_ori = list(center) - centers.append(correct_crop_centers(center_ori, spatial_size, label_spatial_shape)) + centers.append(correct_crop_centers(center, spatial_size, label_spatial_shape)) return centers From 3f453122127bbce6d2de22157c41e52f0bea1703 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 30 Sep 2021 11:52:39 +0800 Subject: [PATCH 2/5] [DLMED] fix CI test Signed-off-by: Nic Ma --- monai/transforms/utils_pytorch_numpy_unification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/transforms/utils_pytorch_numpy_unification.py b/monai/transforms/utils_pytorch_numpy_unification.py index 3fe2402504..2c370a4707 100644 --- a/monai/transforms/utils_pytorch_numpy_unification.py +++ b/monai/transforms/utils_pytorch_numpy_unification.py @@ -178,7 +178,7 @@ def unravel_index(idx, shape): coord.append(idx % dim) idx = floor_divide(idx, dim) return torch.stack(coord[::-1]) - return np.unravel_index(np.asarray(idx, dtype=int), shape) + return np.asarray(np.unravel_index(idx, shape)) def unravel_indices(idx, shape): From 5117aafb8b9245d88228083e5943a6a01ba6780e Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 30 Sep 2021 13:53:56 +0800 Subject: [PATCH 3/5] [DLMED] use default to avoid overflow Signed-off-by: Nic Ma --- monai/transforms/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index 3eefc08555..92237fd77e 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -292,8 +292,8 @@ def map_binary_to_indices( bg_indices = nonzero(~label_flat) # no need to save the indices in GPU, otherwise, still need to move to CPU at runtime when crop by indices - fg_indices, *_ = convert_data_type(fg_indices, device=torch.device("cpu"), dtype=torch.int16) - bg_indices, *_ = convert_data_type(bg_indices, device=torch.device("cpu"), dtype=torch.int16) + fg_indices, *_ = convert_data_type(fg_indices, device=torch.device("cpu")) + bg_indices, *_ = convert_data_type(bg_indices, device=torch.device("cpu")) return fg_indices, bg_indices From ca674c4779600884ba269cab178720ae43dc00e4 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 30 Sep 2021 14:22:46 +0800 Subject: [PATCH 4/5] [DLMED] fix CI error Signed-off-by: Nic Ma --- monai/transforms/spatial/array.py | 2 +- monai/transforms/utils.py | 2 +- tests/test_generate_pos_neg_label_crop_centers.py | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index 62ac5d2c3e..174e2f4421 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -220,7 +220,7 @@ def __call__( convert_data_type(transform, torch.Tensor, data_array_t.device, dtype=_dtype)[0], spatial_size=output_shape if output_spatial_shape is None else output_spatial_shape, ).squeeze(0) - output_data, *_ = convert_to_dst_type(output_data, data_array, dtype=_dtype) + output_data, *_ = convert_to_dst_type(output_data, data_array, dtype=torch.float32) new_affine = to_affine_nd(affine, new_affine) # type: ignore return output_data, affine, new_affine diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index 92237fd77e..26110081bb 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -397,7 +397,7 @@ def correct_crop_centers( Utility to correct the crop center if the crop size is bigger than the image size. Args: - ceters: pre-computed crop centers, will correct based on the valid region. + centers: pre-computed crop centers of every dim, will correct based on the valid region. spatial_size: spatial size of the ROIs to be sampled. label_spatial_shape: spatial shape of the original label data to compare with ROI. diff --git a/tests/test_generate_pos_neg_label_crop_centers.py b/tests/test_generate_pos_neg_label_crop_centers.py index b263f10e55..b8f2840757 100644 --- a/tests/test_generate_pos_neg_label_crop_centers.py +++ b/tests/test_generate_pos_neg_label_crop_centers.py @@ -53,7 +53,9 @@ def test_type_shape(self, input_data, expected_type, expected_count, expected_sh # check for consistency between numpy, torch and torch.cuda results.append(result) if len(results) > 1: - assert_allclose(results[0], results[-1]) + # compare every crop center + for x, y in zip(results[0], results[-1]): + assert_allclose(x, y, type_test=False) if __name__ == "__main__": From 66c8ffa815590b75037835af2f4fb5b9aea89f60 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 1 Oct 2021 18:26:12 +0800 Subject: [PATCH 5/5] [DLMED] fix CI test issue Signed-off-by: Nic Ma --- tests/test_generate_label_classes_crop_centers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_generate_label_classes_crop_centers.py b/tests/test_generate_label_classes_crop_centers.py index cc068504bf..0e40750276 100644 --- a/tests/test_generate_label_classes_crop_centers.py +++ b/tests/test_generate_label_classes_crop_centers.py @@ -61,7 +61,8 @@ def test_type_shape(self, input_data, expected_type, expected_count, expected_sh # check for consistency between numpy, torch and torch.cuda results.append(result) if len(results) > 1: - assert_allclose(results[0], results[-1]) + for x, y in zip(result[0], result[-1]): + assert_allclose(x, y, type_test=False) if __name__ == "__main__":