Files
2024-05-26 20:35:16 +08:00

3.4 KiB

Documentation

该节点旨在为迭代混合过程生成噪声掩码,提供了一种灵活的机制,用于创建可以提高混合质量和结果的各种类型的掩码。

Input types

Required

  • mask_type
    • 掩码类型参数决定了要生成的噪声掩码的类型,如Perlin或random。它从根本上影响了输出掩码的性质及其在不同混合场景中的适用性。
    • Comfy dtype: COMBO[perlin,random]
    • Python dtype: str
  • seed
    • 种子参数确保了噪声生成过程的可重复性。它对于在不同运行中获得一致的结果至关重要,这对于实验和测试目的尤其重要。
    • Comfy dtype: INT
    • Python dtype: int
  • width
    • 宽度参数定义了噪声掩码的水平维度。它影响了掩码的空间分辨率,从而影响了其在混合输出中捕捉细节的能力。
    • Comfy dtype: INT
    • Python dtype: int
  • height
    • 与宽度参数类似,高度参数定义了噪声掩码的垂直维度,影响其空间分辨率和它能表示的细节水平。
    • Comfy dtype: INT
    • Python dtype: int
  • batch_size
    • 批次大小参数决定了一次操作中生成的噪声掩码的数量。它对处理效率很重要,并可以影响流水线中节点的吞吐量。
    • Comfy dtype: INT
    • Python dtype: int

Optional

  • perlin_scale
    • 在生成Perlin噪声掩码时,此参数调整噪声的规模,这会影响掩码的细节水平和整体外观。它对于调整掩码以适应特定的混合要求至关重要。
    • Comfy dtype: FLOAT
    • Python dtype: float

Output types

  • masks
    • 输出掩码对迭代混合过程至关重要,作为混合和组合不同元素的媒介。它们在决定混合的最终结果中起着关键作用。
    • Comfy dtype: TENSOR
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU

Source code

class MixingMaskGeneratorNode:
    """
    A node that can generate different kinds of noise mask batches for
    iterative mixing purposes.
    """
    MASK_TYPES = ['perlin', 'random']
    MAX_RESOLUTION = 8192

    def __init__(self):
        self.device = comfy.model_management.intermediate_device()

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'mask_type': (s.MASK_TYPES, {'default': 'perlin'}), 'perlin_scale': ('FLOAT', {'default': 10.0, 'min': 0.1, 'max': 400.0, 'step': 0.01}), 'seed': ('INT', {'default': 0, 'min': 0, 'max': 18446744073709551615}), 'width': ('INT', {'default': 512, 'min': 16, 'max': s.MAX_RESOLUTION, 'step': 8}), 'height': ('INT', {'default': 512, 'min': 16, 'max': s.MAX_RESOLUTION, 'step': 8}), 'batch_size': ('INT', {'default': 1, 'min': 1, 'max': 4096})}}
    RETURN_TYPES = ('MASK',)
    CATEGORY = 'mask/generation'
    FUNCTION = 'get_masks'

    def get_masks(self, mask_type, perlin_scale, seed, width, height, batch_size):
        mask_height = height // 8
        mask_width = width // 8
        if mask_type == 'perlin':
            perlin_tensors = perlin_masks(batch_size, mask_width, mask_height, device=self.device, seed=seed, scale=perlin_scale)
            masks = perlin_tensors.view(batch_size, 1, mask_height, mask_width)
        elif mask_type == 'random':
            masks = torch.randn([batch_size, width // 8, height // 8])
        else:
            raise ValueError('invalid mask_type')
        return (masks,)