Пример #1
0
    def __init__(
        self,
        mode=GridSampleMode.BILINEAR.value,
        padding_mode=GridSamplePadMode.BORDER.value,
    ):
        """
        For pytorch native APIs, the possible values are:

            - mode: ``"nearest"``, ``"bilinear"``, ``"bicubic"``.
            - padding_mode: ``"zeros"``, ``"border"``, ``"reflection"``

        See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample

        For MONAI C++/CUDA extensions, the possible values are:

            - mode: ``"nearest"``, ``"bilinear"``, ``"bicubic"``, 0, 1, ...
            - padding_mode: ``"zeros"``, ``"border"``, ``"reflection"``, 0, 1, ...

        See also: :py:class:`monai.networks.layers.grid_pull`
        """
        super(Warp, self).__init__()
        # resolves _interp_mode for different methods

        if USE_COMPILED:
            if mode in (inter.value for inter in GridSampleMode):
                mode = GridSampleMode(mode)
                if mode == GridSampleMode.BILINEAR:
                    mode = 1
                elif mode == GridSampleMode.NEAREST:
                    mode = 0
                elif mode == GridSampleMode.BICUBIC:
                    mode = 3
                else:
                    mode = 1  # default to linear
            self._interp_mode = mode
        else:
            warnings.warn(
                "monai.networks.blocks.Warp: Using PyTorch native grid_sample."
            )
            self._interp_mode = GridSampleMode(mode).value

        # resolves _padding_mode for different methods
        if USE_COMPILED:
            if padding_mode in (pad.value for pad in GridSamplePadMode):
                padding_mode = GridSamplePadMode(padding_mode)
                if padding_mode == GridSamplePadMode.ZEROS:
                    padding_mode = 7
                elif padding_mode == GridSamplePadMode.BORDER:
                    padding_mode = 0
                elif padding_mode == GridSamplePadMode.REFLECTION:
                    padding_mode = 1
                else:
                    padding_mode = 0  # default to nearest
            self._padding_mode = padding_mode
        else:
            self._padding_mode = GridSamplePadMode(padding_mode).value
Пример #2
0
 def __init__(
     self,
     output_dir: str = "./",
     output_postfix: str = "seg",
     output_ext: str = ".nii.gz",
     resample: bool = True,
     mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
     padding_mode: Union[GridSamplePadMode, str] = GridSamplePadMode.BORDER,
     dtype: Optional[np.dtype] = None,
 ) -> None:
     """
     Args:
         output_dir: output image directory.
         output_postfix: a string appended to all output file names.
         output_ext: output file extension name.
         resample: whether to resample before saving the data array.
         mode: {``"bilinear"``, ``"nearest"``}
             This option is used when ``resample = True``.
             Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
             This option is used when ``resample = True``.
             Padding mode for outside grid values. Defaults to ``"border"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         dtype: convert the image data to save to this data type.
             If None, keep the original type of data.
     """
     self.output_dir = output_dir
     self.output_postfix = output_postfix
     self.output_ext = output_ext
     self.resample = resample
     self.mode: GridSampleMode = GridSampleMode(mode)
     self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
     self.dtype = dtype
     self._data_index = 0
Пример #3
0
    def __init__(
        self,
        spatial_dims: int,
        mode: int = 1,
        padding_mode: Optional[Union[GridSamplePadMode, str]] = GridSamplePadMode.ZEROS,
    ):
        """
        Args:
            spatial_dims: {2, 3}. number of spatial dimensions
            mode: interpolation mode to calculate output values, defaults to 1.
                Possible values are::

                    - 0 or 'nearest'    or InterpolationType.nearest
                    - 1 or 'linear'     or InterpolationType.linear
                    - 2 or 'quadratic'  or InterpolationType.quadratic
                    - 3 or 'cubic'      or InterpolationType.cubic
                    - 4 or 'fourth'     or InterpolationType.fourth
                    - etc.
            padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
                Padding mode for outside grid values. Defaults to ``"border"``.
                See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
        """
        super(Warp, self).__init__()
        if spatial_dims not in [2, 3]:
            raise ValueError(f"got unsupported spatial_dims={spatial_dims}, only support 2-d and 3-d input")
        self.spatial_dims = spatial_dims
        if mode < 0:
            raise ValueError(f"do not support negative mode, got mode={mode}")
        self.mode = mode
        self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
Пример #4
0
    def __init__(
        self,
        spacing: Union[Tuple[float, float], float],
        max_tumor_size: float,
        magnitude_range: Tuple[float, float],
        prob: float = 0.1,
        spatial_size: Optional[Union[Sequence[int], int]] = None,
        mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
        padding_mode: Union[GridSamplePadMode,
                            str] = GridSamplePadMode.REFLECTION,
        as_tensor_output: bool = False,
        device: Optional[torch.device] = None,
    ) -> None:
        self.deform_grid = TumorGrowthGrid(
            spacing=spacing,
            max_tumor_size=max_tumor_size,
            magnitude_range=magnitude_range,
            as_tensor_output=True,
            device=device,
        )
        self.resampler = Resample(as_tensor_output=as_tensor_output,
                                  device=device)

        self.spatial_size = spatial_size
        self.mode: GridSampleMode = GridSampleMode(mode)
        self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
        self.prob = prob
        self.do_transform = False
Пример #5
0
    def __init__(
        self,
        spatial_size: Optional[Union[Sequence[int], int]] = None,
        normalized: bool = False,
        mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
        padding_mode: Union[GridSamplePadMode, str] = GridSamplePadMode.ZEROS,
        align_corners: bool = False,
        reverse_indexing: bool = True,
    ) -> None:
        """
        Apply affine transformations with a batch of affine matrices.

        When `normalized=False` and `reverse_indexing=True`,
        it does the commonly used resampling in the 'pull' direction
        following the ``scipy.ndimage.affine_transform`` convention.
        In this case `theta` is equivalent to (ndim+1, ndim+1) input ``matrix`` of ``scipy.ndimage.affine_transform``,
        operates on homogeneous coordinates.
        See also: https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.affine_transform.html

        When `normalized=True` and `reverse_indexing=False`,
        it applies `theta` to the normalized coordinates (coords. in the range of [-1, 1]) directly.
        This is often used with `align_corners=False` to achieve resolution-agnostic resampling,
        thus useful as a part of trainable modules such as the spatial transformer networks.
        See also: https://pytorch.org/tutorials/intermediate/spatial_transformer_tutorial.html

        Args:
            spatial_size: output spatial shape, the full output shape will be
                `[N, C, *spatial_size]` where N and C are inferred from the `src` input of `self.forward`.
            normalized: indicating whether the provided affine matrix `theta` is defined
                for the normalized coordinates. If `normalized=False`, `theta` will be converted
                to operate on normalized coordinates as pytorch affine_grid works with the normalized
                coordinates.
            mode: {``"bilinear"``, ``"nearest"``}
                Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
                See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
            padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
                Padding mode for outside grid values. Defaults to ``"zeros"``.
                See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
            align_corners: see also https://pytorch.org/docs/stable/nn.functional.html#grid-sample.
            reverse_indexing: whether to reverse the spatial indexing of image and coordinates.
                set to `False` if `theta` follows pytorch's default "D, H, W" convention.
                set to `True` if `theta` follows `scipy.ndimage` default "i, j, k" convention.
        """
        super().__init__()
        self.spatial_size = ensure_tuple(
            spatial_size) if spatial_size is not None else None
        self.normalized = normalized
        self.mode: GridSampleMode = GridSampleMode(mode)
        self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
        self.align_corners = align_corners
        self.reverse_indexing = reverse_indexing
Пример #6
0
 def __init__(
     self,
     output_dir: str = "./",
     output_postfix: str = "seg",
     output_ext: str = ".nii.gz",
     resample: bool = True,
     mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
     padding_mode: Union[GridSamplePadMode, str] = GridSamplePadMode.BORDER,
     align_corners: bool = False,
     dtype: DtypeLike = np.float64,
     output_dtype: DtypeLike = np.float32,
     squeeze_end_dims: bool = True,
 ) -> None:
     """
     Args:
         output_dir: output image directory.
         output_postfix: a string appended to all output file names.
         output_ext: output file extension name.
         resample: whether to resample before saving the data array.
         mode: {``"bilinear"``, ``"nearest"``}
             This option is used when ``resample = True``.
             Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
             This option is used when ``resample = True``.
             Padding mode for outside grid values. Defaults to ``"border"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         align_corners: Geometrically, we consider the pixels of the input as squares rather than points.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         dtype: data type for resampling computation. Defaults to ``np.float64`` for best precision.
             If None, use the data type of input data.
         output_dtype: data type for saving data. Defaults to ``np.float32``.
         squeeze_end_dims: if True, any trailing singleton dimensions will be removed (after the channel
             has been moved to the end). So if input is (C,H,W,D), this will be altered to (H,W,D,C), and
             then if C==1, it will be saved as (H,W,D). If D also ==1, it will be saved as (H,W). If false,
             image will always be saved as (H,W,D,C).
     """
     self.output_dir = output_dir
     self.output_postfix = output_postfix
     self.output_ext = output_ext
     self.resample = resample
     self.mode: GridSampleMode = GridSampleMode(mode)
     self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
     self.align_corners = align_corners
     self.dtype = dtype
     self.output_dtype = output_dtype
     self._data_index = 0
     self.squeeze_end_dims = squeeze_end_dims
Пример #7
0
 def __init__(
     self,
     output_dir: str = "./",
     output_postfix: str = "seg",
     output_ext: str = ".nii.gz",
     resample: bool = True,
     mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
     padding_mode: Union[GridSamplePadMode, str] = GridSamplePadMode.BORDER,
     align_corners: bool = False,
     dtype: DtypeLike = np.float64,
     output_dtype: DtypeLike = np.float32,
 ) -> None:
     """
     Args:
         output_dir: output image directory.
         output_postfix: a string appended to all output file names.
         output_ext: output file extension name.
         resample: whether to resample before saving the data array.
         mode: {``"bilinear"``, ``"nearest"``}
             This option is used when ``resample = True``.
             Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
             This option is used when ``resample = True``.
             Padding mode for outside grid values. Defaults to ``"border"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         align_corners: Geometrically, we consider the pixels of the input as squares rather than points.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         dtype: data type for resampling computation. Defaults to ``np.float64`` for best precision.
             If None, use the data type of input data. To be compatible with other modules,
             the output data type is always ``np.float32``.
         output_dtype: data type for saving data. Defaults to ``np.float32``.
     """
     self.output_dir = output_dir
     self.output_postfix = output_postfix
     self.output_ext = output_ext
     self.resample = resample
     self.mode: GridSampleMode = GridSampleMode(mode)
     self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
     self.align_corners = align_corners
     self.dtype = dtype
     self.output_dtype = output_dtype
     self._data_index = 0
Пример #8
0
 def __init__(
     self,
     spatial_dims: int,
     mode: Optional[Union[GridSampleMode, str]] = GridSampleMode.BILINEAR,
     padding_mode: Optional[Union[GridSamplePadMode, str]] = GridSamplePadMode.ZEROS,
 ):
     """
     Args:
         spatial_dims: {2, 3}. number of spatial dimensions
         mode: {``"bilinear"``, ``"nearest"``}
             Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
         padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
             Padding mode for outside grid values. Defaults to ``"border"``.
             See also: https://pytorch.org/docs/stable/nn.functional.html#grid-sample
     """
     super(Warp, self).__init__()
     if spatial_dims not in [2, 3]:
         raise ValueError(f"got unsupported spatial_dims = {spatial_dims}, only support 2-d and 3-d input")
     self.spatial_dims = spatial_dims
     self.mode: GridSampleMode = GridSampleMode(mode)
     self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
Пример #9
0
    def __init__(
        self,
        output_dir: PathLike = "./",
        output_postfix: str = "seg",
        output_ext: str = ".nii.gz",
        resample: bool = True,
        mode: Union[GridSampleMode, str] = GridSampleMode.BILINEAR,
        padding_mode: Union[GridSamplePadMode, str] = GridSamplePadMode.BORDER,
        align_corners: bool = False,
        dtype: DtypeLike = np.float64,
        output_dtype: DtypeLike = np.float32,
        squeeze_end_dims: bool = True,
        data_root_dir: PathLike = "",
        separate_folder: bool = True,
        print_log: bool = True,
    ) -> None:
        """
        Args:
            output_dir: output image directory.
            output_postfix: a string appended to all output file names.
            output_ext: output file extension name.
            resample: whether to convert the data array to it's original coordinate system
                based on `original_affine` in the `meta_data`.
            mode: {``"bilinear"``, ``"nearest"``}
                This option is used when ``resample = True``.
                Interpolation mode to calculate output values. Defaults to ``"bilinear"``.
                See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html
            padding_mode: {``"zeros"``, ``"border"``, ``"reflection"``}
                This option is used when ``resample = True``.
                Padding mode for outside grid values. Defaults to ``"border"``.
                See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html
            align_corners: Geometrically, we consider the pixels of the input as squares rather than points.
                See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html
            dtype: data type for resampling computation. Defaults to ``np.float64`` for best precision.
                If None, use the data type of input data.
            output_dtype: data type for saving data. Defaults to ``np.float32``.
            squeeze_end_dims: if True, any trailing singleton dimensions will be removed (after the channel
                has been moved to the end). So if input is (C,H,W,D), this will be altered to (H,W,D,C), and
                then if C==1, it will be saved as (H,W,D). If D also ==1, it will be saved as (H,W). If false,
                image will always be saved as (H,W,D,C).
            data_root_dir: if not empty, it specifies the beginning parts of the input file's
                absolute path. it's used to compute `input_file_rel_path`, the relative path to the file from
                `data_root_dir` to preserve folder structure when saving in case there are files in different
                folders with the same file names. for example:
                input_file_name: /foo/bar/test1/image.nii,
                postfix: seg
                output_ext: nii.gz
                output_dir: /output,
                data_root_dir: /foo/bar,
                output will be: /output/test1/image/image_seg.nii.gz
            separate_folder: whether to save every file in a separate folder, for example: if input filename is
                `image.nii`, postfix is `seg` and folder_path is `output`, if `True`, save as:
                `output/image/image_seg.nii`, if `False`, save as `output/image_seg.nii`. default to `True`.
            print_log: whether to print log about the saved NIfTI file path, etc. default to `True`.

        """
        self.output_dir = output_dir
        self.output_postfix = output_postfix
        self.output_ext = output_ext
        self.resample = resample
        self.mode: GridSampleMode = GridSampleMode(mode)
        self.padding_mode: GridSamplePadMode = GridSamplePadMode(padding_mode)
        self.align_corners = align_corners
        self.dtype = dtype
        self.output_dtype = output_dtype
        self._data_index = 0
        self.squeeze_end_dims = squeeze_end_dims
        self.data_root_dir = data_root_dir
        self.separate_folder = separate_folder
        self.print_log = print_log