推理方法#

推理器 (Inferers)#

class monai.inferers.Inferer[source]#

模型推理的基类。继承此类以支持推理过程中的操作,例如滑动窗口方法。

示例代码

device = torch.device("cuda:0")
transform = Compose([ToTensor(), LoadImage(image_only=True)])
data = transform(img_path).to(device)
model = UNet(...).to(device)
inferer = SlidingWindowInferer(...)

model.eval()
with torch.no_grad():
    pred = inferer(inputs=data, network=model)
...
abstract __call__(inputs, network, *args, **kwargs)[source]#

使用 network 模型对 inputs 运行推理。

参数:
  • inputs (Tensor) – 模型推理的输入。

  • network (Callable) – 用于推理的模型。

  • args (Any) – 可选参数,将传递给 network

  • kwargs (Any) – 可选关键字参数,将传递给 network

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

Any

PatchInferer#

class monai.inferers.PatchInferer(splitter=None, merger_cls=<class 'monai.inferers.merger.AvgMerger'>, batch_size=1, preprocessing=None, postprocessing=None, output_keys=None, match_spatial_shape=True, buffer_size=0, **merger_kwargs)[source]#

基于 Splitter 和 Merger 对图像块而不是整个图像进行推理。这会将输入图像分割成图像块,然后合并结果图像块。

参数:
  • splitter – 用于将输入分割成图像块的 Splitter 对象。默认为 None。如果未提供或为 None,则认为输入已经被分割成图像块。在这种情况下,无法推断输出 merged_shape 和可选的 cropped_shape,应明确提供。

  • merger_cls – 一个 Merger 子类,可实例化用于合并图像块输出。它也可以是一个与继承自 Merger 类的类名匹配的字符串。默认为 AvgMerger

  • batch_size – 图像块的批次大小。如果输入张量已经分批 [BxCxWxH],这会为图像块上的推理添加额外的批处理 [(Bp*B)xCxWpxHp]。默认为 1。

  • preprocessing – 一个可调用对象,用于在将图像块馈送到网络之前处理它们。默认为 None。

  • postprocessing – 一个可调用对象,用于处理网络的输出。默认为 None。

  • output_keys – 如果网络输出是一个字典,这定义了用于合并的输出字典的键。默认为 None,此时使用所有键。

  • match_spatial_shape – 是否裁剪输出以匹配输入形状。默认为 True。

  • buffer_size – 在单独线程中用于批次采样而在缓冲区中保存的图像块数量。默认为 0。

  • merger_kwargs – 传递给 merger_cls 用于实例化的参数。merged_shape 会根据输入形状和输出图像块形状自动计算,除非在此处传递。

__call__(inputs, network, *args, **kwargs)[source]#
参数:
  • inputs – 用于推理的输入数据,一个 torch.Tensor,代表一个图像或一批图像。然而,如果数据已经被分割,可以通过提供元组列表 (patch, location) 或具有 PatchKeys.LOCATION 元数据的 MetaTensor 来馈送。在这两种情况下,不应提供 splitter。

  • network – 执行推理的目标模型。支持可调用对象,例如 lambda x: my_torch_model(x, additional_config)

  • args – 可选参数,将传递给 network

  • kwargs – 可选关键字参数,将传递给 network

SimpleInferer#

class monai.inferers.SimpleInferer[source]#

SimpleInferer 是直接运行模型 forward() 的普通推理方法。使用示例可在 monai.inferers.Inferer 基类中找到。

__call__(inputs, network, *args, **kwargs)[source]#

Inferers 的统一可调用函数 API。

参数:
  • inputs (Tensor) – 用于推理的模型输入数据。

  • network (Callable[…, Tensor]) – 执行推理的目标模型。支持可调用对象,例如 lambda x: my_torch_model(x, additional_config)

  • args (Any) – 可选参数,将传递给 network

  • kwargs (Any) – 可选关键字参数,将传递给 network

返回类型:

Tensor

SlidingWindowInferer#

class monai.inferers.SlidingWindowInferer(roi_size, sw_batch_size=1, overlap=0.25, mode=constant, sigma_scale=0.125, padding_mode=constant, cval=0.0, sw_device=None, device=None, progress=False, cache_roi_weight_map=False, cpu_thresh=None, buffer_steps=None, buffer_dim=-1, with_coord=False)[source]#

模型推理的滑动窗口方法,每次 model.forward() 包含 sw_batch_size 个窗口。使用示例可在 monai.inferers.Inferer 基类中找到。

参数:
  • roi_size – 执行 SlidingWindow 评估的窗口大小。如果包含非正数分量,将使用相应的 inputs 大小。如果 roi_size 的分量是非正数,则转换将使用 img 大小的相应分量。例如,如果 img 的第二个空间维度大小为 64roi_size=(32, -1) 将适应为 (32, 64)

  • sw_batch_size – 运行窗口切片的批次大小。

  • overlap – 每个空间维度上的扫描之间的重叠量,默认为 0.25

  • mode

    {"constant", "gaussian"} 如何混合重叠窗口的输出。默认为 "constant"

    • "constant”:对所有预测给予相同的权重。

    • "gaussian”:对窗口边缘的预测给予较小的权重。

  • sigma_scale – 当 mode"gaussian" 时,高斯窗口的标准差系数。默认值:0.125。实际窗口 sigma 为 sigma_scale * dim_size。当 sigma_scale 是浮点数序列时,这些值表示相应空间维度上的 sigma_scale。

  • padding_mode – {"constant", "reflect", "replicate", "circular"} 当 roi_size 大于 inputs 时的填充模式。默认为 "constant"。另请参见:https://pytorch.ac.cn/docs/stable/generated/torch.nn.functional.pad.html

  • cval – ‘constant’ 填充模式的填充值。默认值:0

  • sw_device – 窗口数据所在的设备。默认情况下,使用 inputs 的设备(以及相应的内存)。通常 sw_device 应与定义 predictor 的设备保持一致。

  • device – 拼接输出预测的设备。默认情况下,使用 inputs 的设备(以及相应的内存)。例如,如果设置为 device=torch.device(‘cpu’),GPU 内存消耗会减少,并且与 inputsroi_size 无关。输出位于 device 上。

  • progress – 是否打印 tqdm 进度条。

  • cache_roi_weight_map – 是否预先计算 ROI 权重图。

  • cpu_thresh – 提供时,当输入图像体积大于此阈值(以像素/体素为单位)时,动态切换到在 CPU 上拼接(以节省 GPU 内存)。否则使用 "device"。因此,输出可能最终位于 CPU 或 GPU 上。

  • buffer_steps – 沿着 buffer_dim 的滑动窗口迭代次数,这些迭代结果会在 sw_device 上缓冲,然后写入 device。(通常,sw_devicecudadevicecpu。)默认值为 None,不进行缓冲。对于 buffer dim,当空间大小可被 buffer_steps*roi_size 整除时(即缓冲区之间没有重叠),为了提高效率,可能会自动启用 non_blocking copy。

  • buffer_dim – 创建缓冲区的空间维度。0 表示第一个空间维度。默认为 -1,最后一个空间维度。

  • with_coord – 是否将窗口坐标传递给 network。默认为 False。如果为 True,network 的第二个输入参数应接受窗口坐标。

注意

sw_batch_size 表示每次网络推理迭代的最大窗口数,而不是输入的批次大小。

__call__(inputs, network, *args, **kwargs)[source]#
参数:
  • inputs – 用于推理的模型输入数据。

  • network – 执行推理的目标模型。支持可调用对象,例如 lambda x: my_torch_model(x, additional_config)

  • args – 可选参数,将传递给 network

  • kwargs – 可选关键字参数,将传递给 network

SlidingWindowInfererAdapt#

class monai.inferers.SlidingWindowInfererAdapt(roi_size, sw_batch_size=1, overlap=0.25, mode=constant, sigma_scale=0.125, padding_mode=constant, cval=0.0, sw_device=None, device=None, progress=False, cache_roi_weight_map=False, cpu_thresh=None, buffer_steps=None, buffer_dim=-1, with_coord=False)[source]#

SlidingWindowInfererAdapt 扩展了 SlidingWindowInferer,以便在 GPU 上发生 OOM 时自动切换到缓冲,然后切换到 CPU 拼接。它还会记录此类大图像的大小,以便在遇到类似大小的下一个大图像时自动尝试 CPU 拼接。如果提供了拼接 ‘device’ 输入参数,将不尝试自动适配,请保持默认选项 device = None 以实现自适应行为。注意:如果 GPU 内存不足,输出可能位于 CPU 上(即使输入位于 GPU 上)。

__call__(inputs, network, *args, **kwargs)[source]#
参数:
  • inputs – 用于推理的模型输入数据。

  • network – 执行推理的目标模型。支持可调用对象,例如 lambda x: my_torch_model(x, additional_config)

  • args – 可选参数,将传递给 network

  • kwargs – 可选关键字参数,将传递给 network

SaliencyInferer#

class monai.inferers.SaliencyInferer(cam_name, target_layers, class_idx=None, *args, **kwargs)[source]#

SaliencyInferer 是使用激活图进行的推理。

参数:
  • cam_name – 预期的 CAM 方法名称,应为:“CAM”、“GradCAM” 或 “GradCAMpp”。

  • target_layers – 用于生成特征图的模型层名称。

  • class_idx – 要可视化的类别索引。如果为 None,则默认为 argmax(logits)。

  • args – 传递给 cam 的 __init__ 的其他可选参数。

  • kwargs – 传递给 cam 的 __init__ 的其他可选关键字参数。

__call__(inputs, network, *args, **kwargs)[source]#

Inferers 的统一可调用函数 API。

参数:
  • inputs (Tensor) – 用于推理的模型输入数据。

  • network (Module) – 执行推理的目标模型。支持可调用对象,例如 lambda x: my_torch_model(x, additional_config)

  • args (Any) – 传递给 cam 的 __call__ 的其他可选参数。

  • kwargs (Any) – 传递给 cam 的 __call__ 的其他可选关键字参数。

SliceInferer#

class monai.inferers.SliceInferer(spatial_dim=0, *args, **kwargs)[source]#

SliceInferer 扩展了 SlidingWindowInferer,以便在提供 3D 体积时提供逐切片(2D)推理。典型的用例可以是 2D 模型(如 2D 分割 UNet)对来自 3D 体积的切片进行操作,并且输出是聚合了 2D 切片的 3D 体积。示例

# sliding over the `spatial_dim`
inferer = SliceInferer(roi_size=(64, 256), sw_batch_size=1, spatial_dim=1)
output = inferer(input_volume, net)
参数:
  • spatial_dim (int) – 在 3D 体积上运行逐切片推理的空间维度。例如,0 可以沿着轴向切片滑动,1 沿着冠状切片滑动,2 沿着矢状切片滑动。

  • args (Any) – 传递给基类 SlidingWindowInferer 的 __init__ 的其他可选参数。

  • kwargs (Any) – 传递给基类 SlidingWindowInferer 的 __init__ 的其他可选关键字参数。

注意

在 SliceInferer 中,当提供 3D 体积时,roi_size 预期是一个 2D 元组。这允许使用选定的 spatial_dim 沿着 3D 体积的切片进行滑动。

__call__(inputs, network, *args, **kwargs)[source]#
参数:
  • inputs – 用于推理的 3D 输入

  • network – 对 3D 输入中的切片执行推理的 2D 模型

  • args – 可选参数,将传递给 network

  • kwargs – 可选关键字参数,将传递给 network

network_wrapper(network, x, *args, **kwargs)[source]#

包装器,用于处理 2D 模型对 3D 体积输入的推理。

DiffusionInferer#

class monai.inferers.DiffusionInferer(scheduler)[source]#

DiffusionInferer 接受一个训练好的扩散模型和一个调度器,可用于执行训练迭代的信号前向传递,并从模型中采样。

参数:

scheduler (Scheduler) – 扩散调度器。

__call__(inputs, diffusion_model, noise, timesteps, condition=None, mode='crossattn', seg=None)[source]#

实现监督训练迭代的前向传递。

参数:
  • inputs – 添加噪声的输入图像。

  • diffusion_model – 扩散模型。

  • noise – 随机噪声,与输入形状相同。

  • timesteps – 随机时间步。

  • condition – 网络输入的条件。

  • mode – 网络的条件模式。

  • seg – 如果模型是 SPADEDiffusionModelUnet 的实例,则必须提供分割。

  • forward ()

get_likelihood(inputs, diffusion_model, scheduler=None, save_intermediates=False, conditioning=None, mode='crossattn', original_input_range=(0, 255), scaled_input_range=(0, 1), verbose=True, seg=None)#

计算输入的对数似然。

参数:
  • inputs – 输入图像,NxCxHxW[xD]

  • diffusion_model – 计算似然的模型

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 保存中间空间 KL 图

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • original_input_range – 在应用任何缩放之前输入数据的 [min,max] 强度范围。

  • scaled_input_range – 缩放后输入数据的 [min,max] 强度范围。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

sample(input_noise, diffusion_model, scheduler=None, save_intermediates=False, intermediate_steps=100, conditioning=None, mode='crossattn', verbose=True, seg=None)#
参数:
  • input_noise – 随机噪声,与所需采样形状相同。

  • diffusion_model – 用于采样的模型。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 是否返回采样链中的中间结果。

  • intermediate_steps – 如果 save_intermediates 为 True,则每 n 步保存一次。

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

LatentDiffusionInferer#

class monai.inferers.LatentDiffusionInferer(scheduler, scale_factor=1.0, ldm_latent_shape=None, autoencoder_latent_shape=None)[source]#

LatentDiffusionInferer 接受一个阶段 1 模型 (VQVAE 或 AutoencoderKL)、一个扩散模型和一个调度器,可用于执行训练迭代的信号前向传递,并从模型中采样。

参数:
  • scheduler – 与 unet 结合使用的调度器,用于对编码后的图像潜空间表示去噪。

  • scale_factor – 在由第二阶段处理之前,用于乘以潜空间表示值的大小因子。

  • ldm_latent_shape – 期望的空间潜空间形状。如果在自编码器模型的潜空间形状上存在差异,则使用此参数。

  • autoencoder_latent_shape – autoencoder_latent_shape:自编码器空间潜空间形状。如果在自编码器的潜空间形状和 DM 形状之间存在差异,则使用此参数。

__call__(inputs, autoencoder_model, diffusion_model, noise, timesteps, condition=None, mode='crossattn', seg=None)[source]#

实现监督训练迭代的前向传递。

参数:
  • inputs – 输入图像,将从中提取潜空间表示并添加噪声。

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 扩散模型。

  • noise – 随机噪声,形状与潜空间表示相同。

  • timesteps – 随机时间步。

  • condition – 网络输入的条件。

  • mode – 网络的条件模式。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

get_likelihood(inputs, autoencoder_model, diffusion_model, scheduler=None, save_intermediates=False, conditioning=None, mode='crossattn', original_input_range=(0, 255), scaled_input_range=(0, 1), verbose=True, resample_latent_likelihoods=False, resample_interpolation_mode='nearest', seg=None)#

计算输入潜空间表示的对数似然。

参数:
  • inputs – 输入图像,NxCxHxW[xD]

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 计算似然的模型

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 保存中间空间 KL 图

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • original_input_range – 在应用任何缩放之前输入数据的 [min,max] 强度范围。

  • scaled_input_range – 缩放后输入数据的 [min,max] 强度范围。

  • verbose – 如果为 True,打印采样过程的进度条。

  • resample_latent_likelihoods – 如果为 True,则将中间似然图重采样到与输入图像相同的空间维度。

  • resample_interpolation_mode – 如果使用 resample_latent_likelihoods,选择插值模式 'nearest'、'bilinear' 或 'trilinear'。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,或 autoencoder_model 是 SPADEAutoencoderKL 的实例,则必须提供分割。

sample(input_noise, autoencoder_model, diffusion_model, scheduler=None, save_intermediates=False, intermediate_steps=100, conditioning=None, mode='crossattn', verbose=True, seg=None)#
参数:
  • input_noise – 随机噪声,与所需潜空间表示形状相同。

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 用于采样的模型。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 是否返回采样链中的中间结果。

  • intermediate_steps – 如果 save_intermediates 为 True,则每 n 步保存一次。

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,或 autoencoder_model 是 SPADEAutoencoderKL 的实例,则必须提供分割。

ControlNetDiffusionInferer#

class monai.inferers.ControlNetDiffusionInferer(scheduler)[source]#

ControlNetDiffusionInferer 接受一个训练好的扩散模型和一个调度器,可用于执行训练迭代的信号前向传递,并从模型中采样,支持基于 ControlNet 的条件控制。

参数:

scheduler (Scheduler) – 扩散调度器。

__call__(inputs, diffusion_model, controlnet, noise, timesteps, cn_cond, condition=None, mode='crossattn', seg=None)[source]#

实现监督训练迭代的前向传递。

参数:
  • inputs – 添加噪声的输入图像。

  • diffusion_model – 扩散模型。

  • controlnet – ControlNet 子网络。

  • noise – 随机噪声,与输入形状相同。

  • timesteps – 随机时间步。

  • cn_cond – ControlNet 的条件图像。

  • condition – 网络输入的条件。

  • mode – 网络的条件模式。

  • seg – 如果模型是 SPADEDiffusionModelUnet 的实例,则必须提供分割。

  • forward ()

get_likelihood(inputs, diffusion_model, controlnet, cn_cond, scheduler=None, save_intermediates=False, conditioning=None, mode='crossattn', original_input_range=(0, 255), scaled_input_range=(0, 1), verbose=True, seg=None)#

计算输入的对数似然。

参数:
  • inputs – 输入图像,NxCxHxW[xD]

  • diffusion_model – 计算似然的模型

  • controlnet – ControlNet 子网络。

  • cn_cond – ControlNet 的条件图像。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 保存中间空间 KL 图

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • original_input_range – 在应用任何缩放之前输入数据的 [min,max] 强度范围。

  • scaled_input_range – 缩放后输入数据的 [min,max] 强度范围。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

sample(input_noise, diffusion_model, controlnet, cn_cond, scheduler=None, save_intermediates=False, intermediate_steps=100, conditioning=None, mode='crossattn', verbose=True, seg=None)#
参数:
  • input_noise – 随机噪声,与所需采样形状相同。

  • diffusion_model – 用于采样的模型。

  • controlnet – ControlNet 子网络。

  • cn_cond – ControlNet 的条件图像。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 是否返回采样链中的中间结果。

  • intermediate_steps – 如果 save_intermediates 为 True,则每 n 步保存一次。

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

ControlNetLatentDiffusionInferer#

class monai.inferers.ControlNetLatentDiffusionInferer(scheduler, scale_factor=1.0, ldm_latent_shape=None, autoencoder_latent_shape=None)[source]#

ControlNetLatentDiffusionInferer 接受一个阶段 1 模型 (VQVAE 或 AutoencoderKL)、一个扩散模型、一个 ControlNet 和一个调度器,可用于执行训练迭代的信号前向传递,并从模型中采样。

参数:
  • scheduler – 与 unet 结合使用的调度器,用于对编码后的图像潜空间表示去噪。

  • scale_factor – 在由第二阶段处理之前,用于乘以潜空间表示值的大小因子。

  • ldm_latent_shape – 期望的空间潜空间形状。如果在自编码器模型的潜空间形状上存在差异,则使用此参数。

  • autoencoder_latent_shape – autoencoder_latent_shape:自编码器空间潜空间形状。如果在自编码器的潜空间形状和 DM 形状之间存在差异,则使用此参数。

__call__(inputs, autoencoder_model, diffusion_model, controlnet, noise, timesteps, cn_cond, condition=None, mode='crossattn', seg=None)[source]#

实现监督训练迭代的前向传递。

参数:
  • inputs – 输入图像,将从中提取潜空间表示并添加噪声。

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 扩散模型。

  • controlnet – ControlNet 模型实例。

  • noise – 随机噪声,形状与潜空间表示相同。

  • timesteps – 随机时间步。

  • cn_cond – ControlNet 网络的条件张量。

  • condition – 网络输入的条件。

  • mode – 网络的条件模式。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,则必须提供分割。

get_likelihood(inputs, autoencoder_model, diffusion_model, controlnet, cn_cond, scheduler=None, save_intermediates=False, conditioning=None, mode='crossattn', original_input_range=(0, 255), scaled_input_range=(0, 1), verbose=True, resample_latent_likelihoods=False, resample_interpolation_mode='nearest', seg=None)#

计算输入潜空间表示的对数似然。

参数:
  • inputs – 输入图像,NxCxHxW[xD]

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 计算似然的模型

  • controlnet – ControlNet 模型实例。

  • cn_cond – ControlNet 网络的条件张量。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 保存中间空间 KL 图

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • original_input_range – 在应用任何缩放之前输入数据的 [min,max] 强度范围。

  • scaled_input_range – 缩放后输入数据的 [min,max] 强度范围。

  • verbose – 如果为 True,打印采样过程的进度条。

  • resample_latent_likelihoods – 如果为 True,则将中间似然图重采样到与输入图像相同的空间维度。

  • resample_interpolation_mode – 如果使用 resample_latent_likelihoods,选择插值模式 'nearest'、'bilinear' 或 'trilinear'。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,或 autoencoder_model 是 SPADEAutoencoderKL 的实例,则必须提供分割。

sample(input_noise, autoencoder_model, diffusion_model, controlnet, cn_cond, scheduler=None, save_intermediates=False, intermediate_steps=100, conditioning=None, mode='crossattn', verbose=True, seg=None)#
参数:
  • input_noise – 随机噪声,与所需潜空间表示形状相同。

  • autoencoder_model – 第一阶段模型。

  • diffusion_model – 用于采样的模型。

  • controlnet – ControlNet 模型实例。

  • cn_cond – ControlNet 网络的条件张量。

  • scheduler – 扩散调度器。如果未提供,将使用类属性调度器。

  • save_intermediates – 是否返回采样链中的中间结果。

  • intermediate_steps – 如果 save_intermediates 为 True,则每 n 步保存一次。

  • conditioning – 网络输入的条件。

  • mode – 网络的条件模式。

  • verbose – 如果为 True,打印采样过程的进度条。

  • seg – 如果扩散模型是 SPADEDiffusionModel 的实例,或 autoencoder_model 是 SPADEAutoencoderKL 的实例,则必须提供分割。

切分器 (Splitters)#

class monai.inferers.Splitter(patch_size, device=None)[source]#

用于将输入分割成可迭代的图像块和位置元组的基类。继承此类以支持 PatchInference 的操作,例如 SlidingPatchSplitter。

参数:
  • patch_size – 要生成的图像块的大小。

  • device – 生成图像块的设备。

abstract __call__(inputs)[source]#

将输入图像(或一批图像)分割成图像块,并返回 (patch, location) 对。其中 location 是图像块左上角 [前] 角的坐标。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

Iterable[tuple[Tensor, Sequence[int]]]

abstract get_input_shape(inputs)[source]#

返回输入的空间形状。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

tuple

abstract get_padded_shape(inputs)[source]#

返回输出分割图像块所覆盖的实际空间形状。例如,如果输入图像被填充,则实际空间形状将扩大,与输入空间形状不同。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

tuple

SlidingWindowSplitter#

class monai.inferers.SlidingWindowSplitter(patch_size, overlap=0.0, offset=0, filter_fn=None, pad_mode='constant', pad_value=0, device=None)[source]#

使用滑动窗口策略和可能的重叠将输入分割成图像块。它还允许偏移起始位置和过滤图像块。

参数:
  • patch_size – 要生成的图像块的大小。

  • offset – 相对于原始输入图像块的偏移量。默认为 0。

  • overlap – 每个维度上图像块之间的重叠量。它可以是范围 [0.0, 1.0) 内的浮点数,表示相对于图像块大小的重叠,或者它可以是非负整数,表示重叠的像素数。默认为 0.0。

  • filter_fn – 用于过滤图像块的可调用对象。它应恰好接受两个参数(patch, location),并为保留的图像块返回 True。默认为不进行过滤。

  • pad_mode – 定义 torch.nn.functional.pad 模式的字符串。可接受的值为 “constant”“reflect”“replicate”“circular”None。默认为 “constant”。如果为 None,将不应用填充,因此会丢弃超出图像边界的图像块(当偏移量为负或图像不可被 patch_size 整除时)。

  • pad_value – 用于 “constant” 填充的值。默认为 0。

  • device – 生成图像块的设备。默认为输入的设备。

注意

当为 patch_sizeoffsetoverlap 提供标量值时,

它会被广播到所有空间维度。

__call__(inputs)[source]#

将输入张量分割成图像块,并返回图像块和位置。

参数:

inputs (Any) – 具有 BCHW[D] 维度的 torch.Tensor,表示一个图像或一批图像

生成:

tuple[torch.Tensor, Sequence[int]] – 生成图像块和位置的元组

返回类型:

Iterable[tuple[Tensor, Sequence[int]]]

get_input_shape(inputs)[source]#

返回输入的空间形状。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

返回类型:

tuple

返回:

spatial_shape

get_padded_shape(inputs)[source]#

返回输出分割图像块所覆盖的实际空间形状。例如,如果输入图像被填充,则实际空间形状将扩大,与输入空间形状不同。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

返回类型:

tuple

返回:

padded_spatial_shape

WSISlidingWindowSplitter#

class monai.inferers.WSISlidingWindowSplitter(patch_size, overlap=0.0, offset=0, filter_fn=None, pad_mode='constant', device=None, reader='OpenSlide', **reader_kwargs)[source]#

使用滑动窗口策略和可能的重叠将整个玻片图像输入分割成块。这从文件中提取块,而无需将整个玻片加载到内存中。它还允许偏移起始位置和过滤块。

参数:
  • patch_size – 要生成的图像块的大小。

  • offset – 相对于原始输入图像块的偏移量。默认为 0。

  • overlap – 每个维度上图像块之间的重叠量。它可以是范围 [0.0, 1.0) 内的浮点数,表示相对于图像块大小的重叠,或者它可以是非负整数,表示重叠的像素数。默认为 0.0。

  • filter_fn – 用于过滤图像块的可调用对象。它应恰好接受两个参数(patch, location),并为保留的图像块返回 True。默认为不进行过滤。

  • pad_mode – 定义填充模式。可以是“constant”或 None。默认为“constant”。填充仅支持“OpenSlide”或“cuCIM”后端,填充值为 256。

  • device – 生成图像块的设备。默认为输入的设备。

  • reader

    用于加载整个玻片成像的模块。如果 reader

    • 字符串,它定义了 monai.data.WSIReader 的后端。默认为“OpenSlide”。

    • 类(继承自 BaseWSIReader),它被初始化并设置为 wsi_reader。

    • 继承自 BaseWSIReader 的类的实例,它被设置为 wsi_reader。

    为了获得最佳性能,请使用“cuCIM”或“OpenSlide”后端。

  • reader_kwargs – 传递给 WSIReader 或提供的整个玻片读取器类的参数。例如,level=2, dtype=torch.float32 等。请注意,如果未提供 level,则假定 level=0

注意

当为 patch_sizeoffsetoverlap 提供标量值时,它将被广播到所有空间维度。

__call__(inputs)[source]#

将输入张量分割成图像块,并返回图像块和位置。

参数:

inputs – 整个玻片图像的文件路径。

生成:

tuple[torch.Tensor, Sequence[int]] – 生成图像块和位置的元组

get_input_shape(inputs)[source]#

返回输入的空间形状。

参数:

inputs (Any) – 具有 BCHW[D] 形状的张量,代表一批图像;或者文件名(字符串)或图像文件名的列表。

返回类型:

tuple

返回:

spatial_shape

合并器#

class monai.inferers.Merger(merged_shape, cropped_shape=None, device=None)[source]#

一个用于合并块的基础类。扩展此类以支持 PatchInference 的操作。具体类中必须实现两个方法

  • aggregate:在相应位置聚合值

  • finalize:执行任何最终处理并返回合并后的输出

参数:
  • merged_shape – 合并块所需的张量形状。

  • cropped_shape – 最终合并输出张量的形状。如果未提供,将与 merged_shape 相同。

  • device – Merger 张量应驻留的设备。

abstract aggregate(values, location)[source]#

聚合值进行合并。此方法在循环中调用,应将值添加到合并输出结果中的相应位置。

参数:
  • values (Tensor) – BCHW[D] 形状的张量,表示推理输出的值。

  • location (Sequence[int]) – 提供块在输出中的左上角位置的元组/列表。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

None

abstract finalize()[source]#

执行合并块的最终操作并返回最终合并输出。

返回类型:

Any

返回:

合并块的结果,通常是表示合并结果的 torch.Tensor,或

表示磁盘上合并结果文件路径的字符串。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

AvgMerger#

class monai.inferers.AvgMerger(merged_shape, cropped_shape=None, value_dtype=torch.float32, count_dtype=torch.uint8, device='cpu')[source]#

通过对重叠区域取平均值来合并块

参数:
  • merged_shape – 合并块所需的张量形状。

  • cropped_shape – 最终合并输出张量的形状。如果未提供,将与 merged_shape 相同。

  • device – 用于聚合器张量和最终结果的设备。

  • value_dtype – 值聚合张量和最终结果的数据类型。

  • count_dtype – 样本计数张量的数据类型。

aggregate(values, location)[source]#

聚合值进行合并。

参数:
  • values (Tensor) – BCHW[D] 形状的张量,表示推理输出的值。

  • location (Sequence[int]) – 提供块在原始图像中左上角位置的元组/列表。

抛出:

NotImplementedError – 当子类未覆盖此方法时。

返回类型:

None

finalize()[source]#

通过将值除以计数来完成合并,并返回合并后的张量。

注意事项

为避免为最终结果创建新的张量(以节省内存空间),在此方法调用后,get_values() 方法将返回“最终”平均值,而不是累积值。此外,多次调用 finalize() 没有任何效果。

返回:

合并块的张量

返回类型:

torch.tensor

get_counts()[source]#

获取样本数量的聚合器张量。

返回:

每个位置累积的样本数量。

返回类型:

torch.Tensor

get_output()[source]#

获取最终合并输出。

返回:

合并输出。

返回类型:

torch.Tensor

get_values()[source]#

获取聚合期间的累积值或最终确定后的最终平均值。

返回:

聚合值。

返回类型:

torch.tensor

注意事项

  • 如果在调用 finalize() 之前调用,此方法返回累积值。

  • 如果在调用 finalize() 之后调用,此方法返回最终合并[并平均]的值。

ZarrAvgMerger#

class monai.inferers.ZarrAvgMerger(merged_shape, cropped_shape=None, dtype='float32', value_dtype='float32', count_dtype='uint8', store='merged.zarr', value_store=None, count_store=None, compressor='default', value_compressor=None, count_compressor=None, chunks=True, thread_locking=True)[source]#

通过对重叠区域取平均值来合并块,并将结果存储在 zarr 数组中。

Zarr 是一种用于存储分块、压缩的 N 维数组的格式。Zarr 数据可以存储在任何可以表示为键值存储的存储系统中,如 POSIX 文件系统、云对象存储、zip 文件以及关系型和文档数据库。更多详情请参见 https://zarr.readthedocs.io/en/stable/。它对于存储过大而无法完全放入内存的 N 维数组特别有用。此类的一个特定用例是合并从整个玻片图像(WSI)中提取的块,其中合并结果不适合内存,需要存储在文件系统上。

参数:
  • merged_shape – 合并块所需的张量形状。

  • cropped_shape – 最终合并输出张量的形状。如果未提供,将与 merged_shape 相同。

  • dtype – 最终合并结果的数据类型。默认为 float32

  • value_dtype – 值聚合张量和最终结果的数据类型。默认为 float32

  • count_dtype – 样本计数张量的数据类型。默认为 uint8

  • store – 用于保存最终结果的 zarr 存储。默认为“merged.zarr”。

  • value_store – 用于保存值聚合张量的 zarr 存储。默认为临时存储。

  • count_store – 用于保存样本计数张量的 zarr 存储。默认为临时存储。

  • compressor – 最终合并 zarr 数组的压缩器。默认为“default”。

  • value_compressor – 值聚合 zarr 数组的压缩器。默认为 None。

  • count_compressor – 样本计数 zarr 数组的压缩器。默认为 None。

  • chunks – 定义块形状的整数或整数元组,或布尔值。默认为 True。如果为 True,块形状将根据 shapedtype 推断。如果为 False,它将被设置为 shape,即整个数组的单个块。如果为整数,每个维度的块大小将由 chunks 的值确定。

aggregate(values, location)[source]#

聚合值进行合并。

参数:
  • values (Tensor) – BCHW[D] 形状的张量,表示推理输出的值。

  • location (Sequence[int]) – 提供块在原始图像中左上角位置的元组/列表。

返回类型:

None

finalize()[source]#

通过将值除以计数来完成合并,并返回合并后的张量。

注意事项

为避免为最终结果创建新的张量(以节省内存空间),在此方法调用后,get_values() 方法将返回“最终”平均值,而不是累积值。此外,多次调用 finalize() 没有任何效果。

返回:

合并块的 zarr 数组

返回类型:

zarr.Array

get_counts()[source]#

获取样本数量的聚合器张量。

返回:

每个位置累积的样本数量。

返回类型:

zarr.Array

get_output()[source]#

获取最终合并输出。

返回:

合并(平均)输出张量。

返回类型:

zarr.Array

get_values()[source]#

获取聚合期间的累积值

返回:

聚合值。

返回类型:

zarr.Array

滑动窗口推理函数#

monai.inferers.sliding_window_inference(inputs, roi_size, sw_batch_size, predictor, overlap=0.25, mode=constant, sigma_scale=0.125, padding_mode=constant, cval=0.0, sw_device=None, device=None, progress=False, roi_weight_map=None, process_fn=None, buffer_steps=None, buffer_dim=-1, with_coord=False, *args, **kwargs)[source]#

使用 predictorinputs 进行滑动窗口推理。

predictor 的输出可以是张量、元组或张量字典。元组或字典值中的每个输出相对于输入可以具有不同的分辨率。例如,输入块空间大小为 [128,128,128],输出(由两个块组成的元组)块大小可以是 ([128,64,256], [64,32,128])。在这种情况下,需要仔细选择参数 overlaproi_size,以确保输出 ROI 仍为整数。如果预测器的输入和输出空间大小不相等,我们建议选择参数,使得对于每个空间维度,overlap*roi_size*output_size/input_size 为整数。

当 roi_size 大于输入的空间大小时,输入图像在推理过程中会被填充。为了保持相同的空间大小,输出图像将被裁剪到原始输入大小。

参数:
  • inputs – 要处理的输入图像(假定为 NCHW[D] 格式)

  • roi_size – 推理的空间窗口大小。当其分量为 None 或非正值时,将使用相应的输入维度。如果 roi_size 的分量为非正值,转换将使用 img 大小的相应分量。例如,如果 img 的第二个空间维度大小为 64,则 roi_size=(32, -1) 将被调整为 (32, 64)

  • sw_batch_size – 运行窗口切片的批次大小。

  • predictor – 给定形状为 NCHW[D] 的输入张量 patch_data,函数调用 predictor(patch_data) 的输出应为张量、元组或带有张量值的字典。元组或字典值中的每个输出应具有相同的批大小,即 NM’H’W’[D’];其中 H’W’[D’] 表示输出块的空间大小,M 是输出通道数,N 是 sw_batch_size,例如,输入形状为 (7, 1, 128,128,128),输出可以是包含两个张量的元组,形状为:((7, 5, 128, 64, 256), (7, 4, 64, 32, 128))。在这种情况下,需要仔细选择参数 overlaproi_size,以确保缩放后的输出 ROI 大小仍为整数。如果 predictor 的输入和输出空间大小不同,我们建议选择参数,使得对于每个维度,overlap*roi_size*zoom_scale 为整数。

  • overlap – 每个空间维度上的扫描之间的重叠量,默认为 0.25

  • mode

    {"constant", "gaussian"} 如何混合重叠窗口的输出。默认为 "constant"

    • "constant”:对所有预测给予相同的权重。

    • "gaussian”:对窗口边缘的预测给予较小的权重。

  • sigma_scale – 当 mode"gaussian" 时,高斯窗口的标准差系数。默认值:0.125。实际窗口 sigma 为 sigma_scale * dim_size。当 sigma_scale 是浮点数序列时,这些值表示相应空间维度上的 sigma_scale。

  • padding_mode – {"constant", "reflect", "replicate", "circular"} 当 roi_size 大于输入时,inputs 的填充模式。默认为 "constant" 另请参阅:https://pytorch.ac.cn/docs/stable/generated/torch.nn.functional.pad.html

  • cval – ‘constant’ 填充模式的填充值。默认值:0

  • sw_device – 窗口数据所在的设备。默认情况下,使用 inputs 的设备(以及相应的内存)。通常 sw_device 应与定义 predictor 的设备保持一致。

  • device – 拼接输出预测的设备。默认情况下,使用 inputs 的设备(以及相应的内存)。例如,如果设置为 device=torch.device(‘cpu’),GPU 内存消耗会减少,并且与 inputsroi_size 无关。输出位于 device 上。

  • progress – 是否打印 tqdm 进度条。

  • roi_weight_map – 每个 ROI 的预计算(非负)权重图。如果未给定,并且 mode 不是 constant,则此图将在运行时计算。

  • process_fn – 处理推理输出并调整每个窗口的重要性图

  • buffer_steps – 沿着 buffer_dim 的滑动窗口迭代次数,这些迭代结果会在 sw_device 上缓冲,然后写入 device。(通常,sw_devicecudadevicecpu。)默认值为 None,不进行缓冲。对于 buffer dim,当空间大小可被 buffer_steps*roi_size 整除时(即缓冲区之间没有重叠),为了提高效率,可能会自动启用 non_blocking copy。

  • buffer_dim – 创建缓冲区的空间维度。0 表示第一个空间维度。默认为 -1,最后一个空间维度。

  • with_coord – 是否将窗口坐标传递给 predictor。默认为 False。如果为 True,predictor 的签名应为 predictor(patch_data, patch_coord, ...)

  • args – 传递给 predictor 的可选参数。

  • kwargs – 传递给 predictor 的可选关键字参数。

注意

  • 输入必须是通道在前且有批处理维度,支持 N 维滑动窗口。