From aa52ade6d8525cadf2195a7505ace73947152527 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 31 Dec 2021 17:43:02 +0800 Subject: [PATCH 1/4] [DLMED] add kwargs Signed-off-by: Nic Ma --- monai/data/image_reader.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 501518dc04..1498eb92ce 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -699,14 +699,19 @@ class WSIReader(ImageReader): without loading the entire image into memory, "TiffFile" backend needs to load the entire image into memory before extracting any patch; thus, memory consideration is needed when using "TiffFile" backend for patch extraction. + kwargs: additional args for backend reading API in `read()`, more details in `cuCIM`, `TiffFile`, `OpenSlide`: + https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. + https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html#skimage.external.tifffile.TiffFile. + https://openslide.org/api/python/#openslide.OpenSlide. """ - def __init__(self, backend: str = "OpenSlide", level: int = 0): + def __init__(self, backend: str = "OpenSlide", level: int = 0, **kwargs): super().__init__() self.backend = backend.lower() func = require_pkg(self.backend)(self._set_reader) self.wsi_reader = func(self.backend) self.level = level + self.kwargs = kwargs @staticmethod def _set_reader(backend: str): @@ -734,6 +739,12 @@ def read(self, data: Union[Sequence[PathLike], PathLike, np.ndarray], **kwargs): Args: data: file name or a list of file names to read. + kwargs: additional args for backend reading API in `read()`, will override `self.kwargs` for existing keys. + more details in `cuCIM`, `TiffFile`, `OpenSlide`: + https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. + https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html + #skimage.external.tifffile.TiffFile. + https://openslide.org/api/python/#openslide.OpenSlide. Returns: image object or list of image objects @@ -742,8 +753,10 @@ def read(self, data: Union[Sequence[PathLike], PathLike, np.ndarray], **kwargs): img_: List = [] filenames: Sequence[PathLike] = ensure_tuple(data) + kwargs_ = self.kwargs.copy() + kwargs_.update(kwargs) for name in filenames: - img = self.wsi_reader(name) + img = self.wsi_reader(name, **kwargs_) if self.backend == "openslide": img.shape = (img.dimensions[1], img.dimensions[0], 3) img_.append(img) From 06c3f3c5b1579ad64ca24086e33509433816f74a Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 31 Dec 2021 17:54:54 +0800 Subject: [PATCH 2/4] [DLMED] add unit test Signed-off-by: Nic Ma --- tests/test_wsireader.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_wsireader.py b/tests/test_wsireader.py index 416a0c11a1..530bfcbbca 100644 --- a/tests/test_wsireader.py +++ b/tests/test_wsireader.py @@ -119,8 +119,9 @@ def test_read_whole_image(self, file_path, level, expected_shape): @parameterized.expand([TEST_CASE_1, TEST_CASE_2, TEST_CASE_5]) def test_read_region(self, file_path, patch_info, expected_img): - reader = WSIReader(self.backend) - with reader.read(file_path) as img_obj: + kwargs = {"name": None, "offset": None} if self.backend == "tifffile" else {} + reader = WSIReader(self.backend, **kwargs) + with reader.read(file_path, **kwargs) as img_obj: if self.backend == "tifffile": with self.assertRaises(ValueError): reader.get_data(img_obj, **patch_info)[0] From 8a6e1ed5c79cc281be5db33d66220b7e8741061d Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 7 Jan 2022 10:29:36 +0800 Subject: [PATCH 3/4] [DLMED] fix doc typo Signed-off-by: Nic Ma --- monai/data/image_reader.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 999e898264..9599b6650e 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -711,16 +711,17 @@ class WSIReader(ImageReader): backend: backend library to load the images, available options: "cuCIM", "OpenSlide" and "TiffFile". level: the whole slide image level at which the image is extracted. (default=0) This is overridden if the level argument is provided in `get_data`. + kwargs: additional args for backend reading API in `read()`, more details in `cuCIM`, `TiffFile`, `OpenSlide`: + https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. + https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html#skimage.external.tifffile.TiffFile. + https://openslide.org/api/python/#openslide.OpenSlide. Note: While "cuCIM" and "OpenSlide" backends both can load patches from large whole slide images without loading the entire image into memory, "TiffFile" backend needs to load the entire image into memory before extracting any patch; thus, memory consideration is needed when using "TiffFile" backend for patch extraction. - kwargs: additional args for backend reading API in `read()`, more details in `cuCIM`, `TiffFile`, `OpenSlide`: - https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. - https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html#skimage.external.tifffile.TiffFile. - https://openslide.org/api/python/#openslide.OpenSlide. + """ def __init__(self, backend: str = "OpenSlide", level: int = 0, **kwargs): From 7730bf4d0b9dadf60f4309f5467ca60a7dab76e8 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 7 Jan 2022 17:25:05 +0800 Subject: [PATCH 4/4] [DLMED] update according to comments Signed-off-by: Nic Ma --- monai/data/image_reader.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 9599b6650e..af88d8df64 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -713,7 +713,7 @@ class WSIReader(ImageReader): This is overridden if the level argument is provided in `get_data`. kwargs: additional args for backend reading API in `read()`, more details in `cuCIM`, `TiffFile`, `OpenSlide`: https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. - https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html#skimage.external.tifffile.TiffFile. + https://github.com/cgohlke/tifffile. https://openslide.org/api/python/#openslide.OpenSlide. Note: @@ -761,8 +761,7 @@ def read(self, data: Union[Sequence[PathLike], PathLike, np.ndarray], **kwargs): kwargs: additional args for backend reading API in `read()`, will override `self.kwargs` for existing keys. more details in `cuCIM`, `TiffFile`, `OpenSlide`: https://github.com/rapidsai/cucim/blob/v21.12.00/cpp/include/cucim/cuimage.h#L100. - https://scikit-image.org/docs/0.14.x/api/skimage.external.tifffile.html - #skimage.external.tifffile.TiffFile. + https://github.com/cgohlke/tifffile. https://openslide.org/api/python/#openslide.OpenSlide. Returns: