diff --git a/monai/auto3dseg/utils.py b/monai/auto3dseg/utils.py index 28509ad0e8..b1becc7677 100644 --- a/monai/auto3dseg/utils.py +++ b/monai/auto3dseg/utils.py @@ -43,7 +43,6 @@ measure_np, has_measure = optional_import("skimage.measure", "0.14.2", min_version) cp, has_cp = optional_import("cupy") -cucim, has_cucim = optional_import("cucim") def get_foreground_image(image: MetaTensor) -> np.ndarray: @@ -93,7 +92,7 @@ def get_label_ccp(mask_index: MetaTensor, use_gpu: bool = True) -> tuple[list[An regardless of this setting. """ - + cucim, has_cucim = optional_import("cucim") shape_list = [] if mask_index.device.type == "cuda" and has_cp and has_cucim and use_gpu: mask_cupy = ToCupy()(mask_index.short()) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 21b7d9df79..03bffbb1e8 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -62,7 +62,6 @@ nrrd, has_nrrd = optional_import("nrrd", allow_namespace_pkg=True) OpenSlide, _ = optional_import("openslide", name="OpenSlide") -CuImage, _ = optional_import("cucim", name="CuImage") TiffFile, _ = optional_import("tifffile", name="TiffFile") __all__ = [ @@ -1274,7 +1273,7 @@ def _set_reader(backend: str): if backend == "openslide": return OpenSlide if backend == "cucim": - return CuImage + return optional_import("cucim", name="CuImage")[0] if backend == "tifffile": return TiffFile raise ValueError("`backend` should be 'cuCIM', 'OpenSlide' or 'TiffFile'.") diff --git a/monai/data/wsi_reader.py b/monai/data/wsi_reader.py index 7eb2b56dc8..4cf7772058 100644 --- a/monai/data/wsi_reader.py +++ b/monai/data/wsi_reader.py @@ -23,7 +23,6 @@ from monai.data.utils import is_supported_format from monai.utils import WSIPatchKeys, ensure_tuple, optional_import, require_pkg -CuImage, _ = optional_import("cucim", name="CuImage") OpenSlide, _ = optional_import("openslide", name="OpenSlide") TiffFile, _ = optional_import("tifffile", name="TiffFile") @@ -491,13 +490,14 @@ def read(self, data: Sequence[PathLike] | PathLike | np.ndarray, **kwargs): whole slide image object or list of such objects """ + cuimage_cls, _ = optional_import("cucim", name="CuImage") wsi_list: list = [] filenames: Sequence[PathLike] = ensure_tuple(data) kwargs_ = self.kwargs.copy() kwargs_.update(kwargs) for filename in filenames: - wsi = CuImage(filename, **kwargs_) + wsi = cuimage_cls(filename, **kwargs_) wsi_list.append(wsi) return wsi_list if len(filenames) > 1 else wsi_list[0] diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index d3c8eb606f..cef7c9b12a 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -67,7 +67,6 @@ ndimage, _ = optional_import("scipy.ndimage") cp, has_cp = optional_import("cupy") cp_ndarray, _ = optional_import("cupy", name="ndarray") -cucim, has_cucim = optional_import("cucim") exposure, has_skimage = optional_import("skimage.exposure") __all__ = [ @@ -974,6 +973,7 @@ def get_largest_connected_component_mask( """ # use skimage/cucim.skimage and np/cp depending on whether packages are # available and input is non-cpu torch.tensor + cucim, has_cucim = optional_import("cucim") use_cp = has_cp and has_cucim and isinstance(img, torch.Tensor) and img.device != torch.device("cpu") if use_cp: img_ = convert_to_cupy(img.short()) # type: ignore diff --git a/monai/utils/module.py b/monai/utils/module.py index 069e476757..b72e3ff139 100644 --- a/monai/utils/module.py +++ b/monai/utils/module.py @@ -477,10 +477,10 @@ def require_pkg( def _decorator(obj): is_func = isinstance(obj, FunctionType) call_obj = obj if is_func else obj.__init__ - _, has = optional_import(module=pkg_name, version=version, version_checker=version_checker) @wraps(call_obj) def _wrapper(*args, **kwargs): + _, has = optional_import(module=pkg_name, version=version, version_checker=version_checker) if not has: err_msg = f"required package `{pkg_name}` is not installed or the version doesn't match requirement." if raise_error: