Files
CavinHuang-comfyui-nodes-docs/docs/LayeredDiffusionDecodeSplit.md
2024-05-26 20:35:16 +08:00

3.4 KiB

Documentation

LayeredDiffusionDecodeSplit 类旨在以子批次的方式高效解码 RGBA 图像,提高处理吞吐量和内存管理。它通过解码较小的图像组来处理大型图像数据集,从而优化计算资源并为各种应用简化解码过程。

Input types

Required

  • samples
    • “samples”参数是必需的,因为它包含了解码过程所需的潜在表示。它直接影响解码图像的质量和准确性,是整个操作的基础。
    • Comfy dtype: LATENT
    • Python dtype: Dict[str, torch.Tensor]
  • images
    • “images”参数对于解码过程至关重要,它提供了需要处理的输入图像。它是节点执行的核心,并影响最终输出,决定了解码图像的视觉方面。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • frames
    • “frames”参数决定了图像解码的频率,有效地控制子批次的大小。它在平衡计算效率和内存使用方面发挥着关键作用,确保处理过程顺畅且优化。
    • Comfy dtype: INT
    • Python dtype: int
  • sd_version
    • “sd_version”参数指定要使用的稳定扩散模型的版本,这对于确定解码算法及其与输入数据的兼容性至关重要。它影响整体性能和生成图像的质量。
    • Comfy dtype: ENUM
    • Python dtype: StableDiffusionVersion
  • sub_batch_size
    • “sub_batch_size”参数对于管理计算负载至关重要,因为它定义了每个子批次处理的图像数量。它在优化解码过程的速度和资源分配方面起着重要作用。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • image
    • “image”输出代表解码后的 RGBA 图像,是节点操作的主要结果。它封装了从输入数据处理得到的视觉信息,展示了节点将潜在表示转换为可感知视觉内容的能力。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • alpha
    • “alpha”输出包含解码图像的 alpha 通道信息,对于需要透明度的应用来说非常重要。它突出了节点处理复杂图像属性的能力,并为最终视觉输出的丰富性做出了贡献。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU

Source code

class LayeredDiffusionDecodeSplit(LayeredDiffusionDecodeRGBA):
    """Decode RGBA every N images."""

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'samples': ('LATENT',), 'images': ('IMAGE',), 'frames': ('INT', {'default': 2, 'min': 2, 'max': s.MAX_FRAMES, 'step': 1}), 'sd_version': ([StableDiffusionVersion.SD1x.value, StableDiffusionVersion.SDXL.value], {'default': StableDiffusionVersion.SDXL.value}), 'sub_batch_size': ('INT', {'default': 16, 'min': 1, 'max': 4096, 'step': 1})}}
    MAX_FRAMES = 3
    RETURN_TYPES = ('IMAGE',) * MAX_FRAMES

    def decode(self, samples, images: torch.Tensor, frames: int, sd_version: str, sub_batch_size: int):
        sliced_samples = copy.copy(samples)
        sliced_samples['samples'] = sliced_samples['samples'][::frames]
        return tuple((super(LayeredDiffusionDecodeSplit, self).decode(sliced_samples, imgs, sd_version, sub_batch_size)[0] if i == 0 else imgs for i in range(frames) for imgs in (images[i::frames],))) + (None,) * (self.MAX_FRAMES - frames)