4.8 KiB
4.8 KiB
Documentation
- Class name: TwoAdvancedSamplersForMask
- Category: ImpactPack/Sampler
- Output node: False
- Repo Ref: https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
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,)