From d5c5c424b7540874e2802e4140aa50548b83bcea Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+behxyz@users.noreply.github.com> Date: Mon, 15 Mar 2021 22:14:47 -0400 Subject: [PATCH 1/5] Update WSIReader with cuCIM Signed-off-by: Behrooz <3968947+behxyz@users.noreply.github.com> --- monai/data/image_reader.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index ddb2c8c913..2c7061bf01 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -25,7 +25,7 @@ from .utils import is_supported_format if TYPE_CHECKING: - import cuimage + import cucim import itk # type: ignore import nibabel as nib import openslide @@ -33,14 +33,14 @@ from nibabel.nifti1 import Nifti1Image from PIL import Image as PILImage - has_itk = has_nib = has_pil = has_cux = has_osl = True + has_itk = has_nib = has_pil = has_cim = has_osl = True else: itk, has_itk = optional_import("itk", allow_namespace_pkg=True) Image, _ = optional_import("itk", allow_namespace_pkg=True, name="Image") nib, has_nib = optional_import("nibabel") Nifti1Image, _ = optional_import("nibabel.nifti1", name="Nifti1Image") PILImage, has_pil = optional_import("PIL.Image") - cuimage, has_cux = optional_import("cuimage") + cucim, has_cim = optional_import("cucim") openslide, has_osl = optional_import("openslide") __all__ = ["ImageReader", "ITKReader", "NibabelReader", "NumpyReader", "PILReader", "WSIReader"] @@ -638,8 +638,8 @@ class WSIReader(ImageReader): Read whole slide imaging and extract patches. Args: - reader_lib: backend library to load the images, available options: "OpenSlide" or "cuClaraImage". - TODO: `cuClaraImage` package is unavailable so far, will enable the support later. + reader_lib: backend library to load the images, available options: "OpenSlide" or "cuCIM". + TODO: `cuCIM` package is unavailable so far, will enable the support later. """ @@ -649,11 +649,11 @@ def __init__(self, reader_lib: str = "OpenSlide"): if self.reader_lib == "openslide": if has_osl: self.wsi_reader = openslide.OpenSlide - elif self.reader_lib == "cuclaraimage": - if has_cux: - self.wsi_reader = cuimage.CuImage + elif self.reader_lib == "cucim": + if has_cim: + self.wsi_reader = cucim.CuImage else: - raise ValueError('`reader_lib` should be either "cuClaraImage" or "OpenSlide"') + raise ValueError('`reader_lib` should be either "cuCIM" or "OpenSlide"') def verify_suffix(self, filename: Union[Sequence[str], str]) -> bool: """ @@ -676,8 +676,8 @@ def read(self, data: Union[Sequence[str], str, np.ndarray], **kwargs): """ if (self.reader_lib == "openslide") and (not has_osl): raise ImportError("No module named 'openslide'") - elif (self.reader_lib == "cuclaraimage") and (not has_cux): - raise ImportError("No module named 'cuimage'") + elif (self.reader_lib == "cucim") and (not has_cim): + raise ImportError("No module named 'cucim'") img_: List = [] From a7c4f9f66ed8856aa89fd2c3e715d67cb7529214 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+behxyz@users.noreply.github.com> Date: Mon, 15 Mar 2021 22:15:15 -0400 Subject: [PATCH 2/5] Update unittests for cuCIM Signed-off-by: Behrooz <3968947+behxyz@users.noreply.github.com> --- tests/test_cuimage_reader.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_cuimage_reader.py b/tests/test_cuimage_reader.py index 7cdf692a30..221a458ca8 100644 --- a/tests/test_cuimage_reader.py +++ b/tests/test_cuimage_reader.py @@ -10,7 +10,7 @@ from monai.data.image_reader import WSIReader from monai.utils import optional_import -_, has_cui = optional_import("cuimage") +_, has_cim = optional_import("cucim") FILE_URL = "http://openslide.cs.cmu.edu/download/openslide-testdata/Generic-TIFF/CMU-1.tiff" @@ -61,31 +61,31 @@ ] -class TestCuClaraImageReader(unittest.TestCase): +class TestCuCIMReader(unittest.TestCase): @parameterized.expand([TEST_CASE_0]) - @skipUnless(has_cui, "Requires CuClaraImage") + @skipUnless(has_cim, "Requires CuCIM") def test_read_whole_image(self, file_url, expected_shape): filename = self.camelyon_data_download(file_url) - reader = WSIReader("CuClaraImage") + reader = WSIReader("cuCIM") img_obj = reader.read(filename) img = reader.get_data(img_obj)[0] self.assertTupleEqual(img.shape, expected_shape) @parameterized.expand([TEST_CASE_1, TEST_CASE_2]) - @skipUnless(has_cui, "Requires CuClaraImage") + @skipUnless(has_cim, "Requires cuCIM") def test_read_region(self, file_url, patch_info, expected_img): filename = self.camelyon_data_download(file_url) - reader = WSIReader("CuClaraImage") + reader = WSIReader("cuCIM") img_obj = reader.read(filename) img = reader.get_data(img_obj, **patch_info)[0] self.assertTupleEqual(img.shape, expected_img.shape) self.assertIsNone(assert_array_equal(img, expected_img)) @parameterized.expand([TEST_CASE_3, TEST_CASE_4]) - @skipUnless(has_cui, "Requires CuClaraImage") + @skipUnless(has_cim, "Requires cuCIM") def test_read_patches(self, file_url, patch_info, expected_img): filename = self.camelyon_data_download(file_url) - reader = WSIReader("CuClaraImage") + reader = WSIReader("cuCIM") img_obj = reader.read(filename) img = reader.get_data(img_obj, **patch_info)[0] self.assertTupleEqual(img.shape, expected_img.shape) From fe47433004a55fbd0d9fb079d810533d2862b732 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+behxyz@users.noreply.github.com> Date: Tue, 16 Mar 2021 15:08:41 -0400 Subject: [PATCH 3/5] Add cuCIM dependencies Signed-off-by: Behrooz <3968947+behxyz@users.noreply.github.com> --- docs/requirements.txt | 1 + requirements-dev.txt | 1 + setup.cfg | 3 +++ 3 files changed, 5 insertions(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 22fd2589f0..ae3ced2c05 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,6 +4,7 @@ pytorch-ignite==0.4.4 numpy>=1.17 itk>=5.0 nibabel +cucim==0.18.0 openslide-python==1.1.2 parameterized scikit-image>=0.14.2 diff --git a/requirements-dev.txt b/requirements-dev.txt index 1508eae4fe..82dd695d47 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -30,4 +30,5 @@ Sphinx==3.3.0 recommonmark==0.6.0 sphinx-autodoc-typehints==1.11.1 sphinx-rtd-theme==0.5.0 +cucim==0.18.0 openslide-python==1.1.2 diff --git a/setup.cfg b/setup.cfg index 9dd9fa106b..1222761801 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,6 +32,7 @@ all = torchvision itk>=5.0 tqdm>=4.47.0 + cucim==0.18.0 openslide-python==1.1.2 nibabel = nibabel @@ -55,6 +56,8 @@ lmdb = lmdb psutil = psutil +cucim = + cucim==0.18.0 openslide = openslide-python==1.1.2 From f71fab7933f9a7461dcb92f95b9120fb180b09b0 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+behxyz@users.noreply.github.com> Date: Tue, 16 Mar 2021 16:56:13 -0400 Subject: [PATCH 4/5] Remove cuCIM TODO note Signed-off-by: Behrooz <3968947+behxyz@users.noreply.github.com> --- monai/data/image_reader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 2c7061bf01..67425c0f47 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -639,7 +639,6 @@ class WSIReader(ImageReader): Args: reader_lib: backend library to load the images, available options: "OpenSlide" or "cuCIM". - TODO: `cuCIM` package is unavailable so far, will enable the support later. """ From 763be454f81782d47fff204757f384019e65e531 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+behxyz@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:10:16 -0400 Subject: [PATCH 5/5] Exclude cucim from MacOS requirements Signed-off-by: Behrooz <3968947+behxyz@users.noreply.github.com> --- .github/workflows/pythonapp.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 8ed1f6d21e..83d01ff5e0 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -83,6 +83,10 @@ jobs: python -m pip install torch==1.8.0+cpu torchvision==0.9.0+cpu -f https://download.pytorch.org/whl/torch_stable.html # min. requirements for windows instances python -c "f=open('requirements-dev.txt', 'r'); txt=f.readlines(); f.close(); print(txt); f=open('requirements-dev.txt', 'w'); f.writelines(txt[1:12]); f.close()" + - if: runner.os == 'macos' + name: Remove cucim installation (Mac only) + run: | + python -c "f=open('requirements-dev.txt', 'r'); txt=f.readlines(); f.close(); print(txt); f=open('requirements-dev.txt', 'w'); f.writelines([t for t in txt if not t.startswith('cucim')]); f.close()" - name: Install the dependencies run: | python -m pip install torch==1.8.0 torchvision==0.9.0