From 3312b938b2bc56795952d9b09e77a8bf094c762f Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Mon, 13 Jul 2026 12:02:40 +0100 Subject: [PATCH 1/2] perf(RandCropBoxByPosNegLabeld): avoid N-fold mask allocation in randomize Replace convert_box_to_mask + amax with direct per-box slicing into a single (1,H,W,D) union mask. This eliminates the (N_boxes,H,W,D) int16 intermediate, reducing peak memory and improving randomize() throughput by ~2-3x on typical 3D volumes. - randomize(): 2.05-2.95x speedup (3 configs, interleaved medians) - full __call__: 1.81-2.49x speedup - Numerics: bit-identical (mask, indices, centers all equal) - Peak RSS: unchanged (fg/bg index arrays dominate) Signed-off-by: Soumya Snigdha Kundu --- monai/apps/detection/transforms/dictionary.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/monai/apps/detection/transforms/dictionary.py b/monai/apps/detection/transforms/dictionary.py index fcb6b842d78..1c7dcc98458 100644 --- a/monai/apps/detection/transforms/dictionary.py +++ b/monai/apps/detection/transforms/dictionary.py @@ -37,7 +37,7 @@ StandardizeEmptyBox, ZoomBox, ) -from monai.apps.detection.transforms.box_ops import convert_box_to_mask + from monai.config import KeysCollection, SequenceStr from monai.config.type_definitions import DtypeLike, NdarrayOrTensor from monai.data.box_utils import COMPUTE_DTYPE, BoxMode, clip_boxes_to_image @@ -1154,10 +1154,13 @@ def randomize( # type: ignore # As along as the cropped patch contains a box, it is considered as a foreground patch. # Positions within extended_boxes are crop centers for foreground patches extended_boxes_np = self.generate_fg_center_boxes_np(boxes, image_size) - mask_img = convert_box_to_mask( - extended_boxes_np, np.ones(extended_boxes_np.shape[0]), image_size, bg_label=0, ellipse_mask=False - ) - mask_img = np.amax(mask_img, axis=0, keepdims=True)[0:1, ...] + spatial_dims = len(image_size) + mask_img = np.zeros((1,) + tuple(image_size), dtype=np.int16) + for b in range(extended_boxes_np.shape[0]): + slicing = (0,) + tuple( + slice(extended_boxes_np[b, d], extended_boxes_np[b, d + spatial_dims]) for d in range(spatial_dims) + ) + mask_img[slicing] = 1 fg_indices_, bg_indices_ = map_binary_to_indices(mask_img, thresh_image, self.image_threshold) else: fg_indices_ = fg_indices From 464a142e6aa9a3cefc9cab5e466860b013954d97 Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Mon, 13 Jul 2026 12:40:22 +0100 Subject: [PATCH 2/2] fix: remove stray blank line breaking isort in detection dictionary transforms Signed-off-by: Soumya Snigdha Kundu --- monai/apps/detection/transforms/dictionary.py | 1 - 1 file changed, 1 deletion(-) diff --git a/monai/apps/detection/transforms/dictionary.py b/monai/apps/detection/transforms/dictionary.py index 1c7dcc98458..7284fb64046 100644 --- a/monai/apps/detection/transforms/dictionary.py +++ b/monai/apps/detection/transforms/dictionary.py @@ -37,7 +37,6 @@ StandardizeEmptyBox, ZoomBox, ) - from monai.config import KeysCollection, SequenceStr from monai.config.type_definitions import DtypeLike, NdarrayOrTensor from monai.data.box_utils import COMPUTE_DTYPE, BoxMode, clip_boxes_to_image