From 655424fb65d227f01d054035022c9036e8a642c1 Mon Sep 17 00:00:00 2001 From: sarthakpati Date: Sun, 12 Jun 2022 11:18:05 -0400 Subject: [PATCH 1/4] updated api to use selected level, and using new level information to scale patch size --- opm/utils.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/opm/utils.py b/opm/utils.py index 3a018ac..f1f0eea 100644 --- a/opm/utils.py +++ b/opm/utils.py @@ -248,13 +248,14 @@ def generate_initial_mask(slide_path, scale): return tissue_mask(slide_thumbnail), real_scale -def get_patch_size_in_microns(input_slide_path, patch_size_from_config, verbose=False): +def get_patch_size_in_microns(input_slide_path, patch_size_from_config, selected_level=0, verbose=False): """ This function takes a slide path and a patch size in microns and returns the patch size in pixels. Args: input_slide_path (str): The input WSI path. patch_size_from_config (str): The patch size in microns. + selected_level (int): The level of the WSI to use. verbose (bool): Whether to provide verbose prints. Raises: @@ -290,12 +291,14 @@ def get_patch_size_in_microns(input_slide_path, patch_size_from_config, verbose= raise ValueError("Patch size must be a list or string.") magnification_prev = -1 + patch_size_in_microns = False for i in range(len(patch_size)): magnification = -1 if str(patch_size[i]).isnumeric(): return_patch_size[i] = int(patch_size[i]) elif isinstance(patch_size[i], str): if ("m" in patch_size[i]) or ("mu" in patch_size[i]): + patch_size_in_microns = True if verbose: print( "Using mpp to calculate patch size for dimension {}".format(i) @@ -328,6 +331,12 @@ def get_patch_size_in_microns(input_slide_path, patch_size_from_config, verbose= ) if magnification > 0: return_patch_size[i] = round(size_in_microns / magnification) + # at this point, return_patch_size has been calculated for level=0, and needs to be scaled for other levels + if selected_level > 0: + for _ in range(selected_level): + return_patch_size[i] = round(return_patch_size[i] / 2) + if return_patch_size[i] < 1: + raise ValueError("Patch size is too small for selected level") magnification_prev = magnification else: return_patch_size[i] = float(patch_size[i]) From ad191cb17077d1d26159ddba71b6d2c12373f543 Mon Sep 17 00:00:00 2001 From: sarthakpati Date: Sun, 12 Jun 2022 11:18:17 -0400 Subject: [PATCH 2/4] updated usage --- patch_miner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patch_miner.py b/patch_miner.py index e14a2d5..81b5eda 100644 --- a/patch_miner.py +++ b/patch_miner.py @@ -70,8 +70,8 @@ if args.label_map_path is not None: manager.set_label_map(args.label_map_path) - ## trying to handle mpp - cfg['patch_size'] = get_patch_size_in_microns(slide_path, cfg['patch_size'], True) + ## handle mpp + cfg['patch_size'] = get_patch_size_in_microns(slide_path, cfg['patch_size'], cfg['scale'], True) # Reject patch if any pixels are transparent manager.add_patch_criteria(alpha_channel_check) From e264b5d7e4372bc2bfa28a1d7c32d4168c50cec3 Mon Sep 17 00:00:00 2001 From: sarthakpati Date: Sun, 12 Jun 2022 11:21:14 -0400 Subject: [PATCH 3/4] no need for this variable --- opm/utils.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/opm/utils.py b/opm/utils.py index f1f0eea..b945f0c 100644 --- a/opm/utils.py +++ b/opm/utils.py @@ -291,14 +291,12 @@ def get_patch_size_in_microns(input_slide_path, patch_size_from_config, selected raise ValueError("Patch size must be a list or string.") magnification_prev = -1 - patch_size_in_microns = False for i in range(len(patch_size)): magnification = -1 if str(patch_size[i]).isnumeric(): return_patch_size[i] = int(patch_size[i]) elif isinstance(patch_size[i], str): if ("m" in patch_size[i]) or ("mu" in patch_size[i]): - patch_size_in_microns = True if verbose: print( "Using mpp to calculate patch size for dimension {}".format(i) From 864e23888c878500c0ac36358e4d2bb65863059f Mon Sep 17 00:00:00 2001 From: sarthakpati Date: Sun, 12 Jun 2022 11:31:42 -0400 Subject: [PATCH 4/4] more succint logic --- opm/utils.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/opm/utils.py b/opm/utils.py index b945f0c..caba643 100644 --- a/opm/utils.py +++ b/opm/utils.py @@ -328,13 +328,9 @@ def get_patch_size_in_microns(input_slide_path, patch_size_from_config, selected format(size_in_microns), ) if magnification > 0: - return_patch_size[i] = round(size_in_microns / magnification) - # at this point, return_patch_size has been calculated for level=0, and needs to be scaled for other levels - if selected_level > 0: - for _ in range(selected_level): - return_patch_size[i] = round(return_patch_size[i] / 2) + return_patch_size[i] = round(size_in_microns / (magnification * (2**selected_level))) if return_patch_size[i] < 1: - raise ValueError("Patch size is too small for selected level") + raise ValueError("Patch size in microns is too small for selected level") magnification_prev = magnification else: return_patch_size[i] = float(patch_size[i])