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

4.8 KiB

Documentation

TwoAdvancedSamplersForMask节点旨在使用两个不同的高级采样器对潜在图像执行高级采样操作。它应用掩膜腐蚀技术来细化掩膜,并使用两个独立的高级采样器处理图像的掩膜和未掩膜区域。该节点旨在通过利用两个采样器的优势来提高生成图像的质量。

Input types

Required

  • seed
    • 种子参数对于随机数生成过程至关重要,确保了采样的可重复性。它影响采样算法的初始状态,从而影响生成的潜在图像。
    • Comfy dtype: INT
    • Python dtype: int
  • steps
    • 步数参数定义了采样过程将经历的迭代次数。它是确定细节水平和最终图像质量的关键因素。
    • Comfy dtype: INT
    • Python dtype: int
  • denoise
    • 去噪参数控制采样过程中应用的噪声减少级别。它在生成图像的清晰度和锐度方面起着重要作用。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • samples
    • 样本参数保存将由采样器处理的初始潜在图像数据。它是输入的重要部分,因为它作为采样操作的起点。
    • Comfy dtype: LATENT
    • Python dtype: torch.Tensor
  • base_sampler
    • 基础采样器参数指定将用于处理图像未掩膜区域的高级采样器。它是实现所需采样结果的关键组件。
    • Comfy dtype: KSAMPLER_ADVANCED
    • Python dtype: KSamplerAdvancedWrapper
  • mask_sampler
    • 掩膜采样器参数标识专用于处理图像掩膜区域的高级采样器。它对于将特定的采样技术应用于掩膜区域至关重要。
    • Comfy dtype: KSAMPLER_ADVANCED
    • Python dtype: KSamplerAdvancedWrapper
  • mask
    • 掩膜参数提供了将应用于潜在图像以区分掩膜和未掩膜区域的掩膜。它对于指导采样过程很重要。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor

Optional

  • overlap_factor
    • 重叠因子参数确定掩膜腐蚀的范围,用于在掩膜和未掩膜区域之间创建缓冲区。它有助于最终图像中过渡的平滑度。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • latent_image
    • 潜在图像输出包含应用高级采样技术后处理的潜在图像。它代表了采样操作的最终结果。
    • Comfy dtype: LATENT
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU

Source code

class TwoAdvancedSamplersForMask:

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'seed': ('INT', {'default': 0, 'min': 0, 'max': 18446744073709551615}), 'steps': ('INT', {'default': 20, 'min': 1, 'max': 10000}), 'denoise': ('FLOAT', {'default': 1.0, 'min': 0.0, 'max': 1.0, 'step': 0.01}), 'samples': ('LATENT',), 'base_sampler': ('KSAMPLER_ADVANCED',), 'mask_sampler': ('KSAMPLER_ADVANCED',), 'mask': ('MASK',), 'overlap_factor': ('INT', {'default': 10, 'min': 0, 'max': 10000})}}
    RETURN_TYPES = ('LATENT',)
    FUNCTION = 'doit'
    CATEGORY = 'ImpactPack/Sampler'

    @staticmethod
    def mask_erosion(samples, mask, grow_mask_by):
        mask = mask.clone()
        w = samples['samples'].shape[3]
        h = samples['samples'].shape[2]
        mask2 = torch.nn.functional.interpolate(mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])), size=(w, h), mode='bilinear')
        if grow_mask_by == 0:
            mask_erosion = mask2
        else:
            kernel_tensor = torch.ones((1, 1, grow_mask_by, grow_mask_by))
            padding = math.ceil((grow_mask_by - 1) / 2)
            mask_erosion = torch.clamp(torch.nn.functional.conv2d(mask2.round(), kernel_tensor, padding=padding), 0, 1)
        return mask_erosion[:, :, :w, :h].round()

    def doit(self, seed, steps, denoise, samples, base_sampler, mask_sampler, mask, overlap_factor):
        inv_mask = torch.where(mask != 1.0, torch.tensor(1.0), torch.tensor(0.0))
        adv_steps = int(steps / denoise)
        start_at_step = adv_steps - steps
        new_latent_image = samples.copy()
        mask_erosion = TwoAdvancedSamplersForMask.mask_erosion(samples, mask, overlap_factor)
        for i in range(start_at_step, adv_steps):
            add_noise = 'enable' if i == start_at_step else 'disable'
            return_with_leftover_noise = 'enable' if i + 1 != adv_steps else 'disable'
            new_latent_image['noise_mask'] = inv_mask
            new_latent_image = base_sampler.sample_advanced(add_noise, seed, adv_steps, new_latent_image, i, i + 1, 'enable', recovery_mode='ratio additional')
            new_latent_image['noise_mask'] = mask_erosion
            new_latent_image = mask_sampler.sample_advanced('disable', seed, adv_steps, new_latent_image, i, i + 1, return_with_leftover_noise, recovery_mode='ratio additional')
        del new_latent_image['noise_mask']
        return (new_latent_image,)