94 lines
4.8 KiB
Markdown
94 lines
4.8 KiB
Markdown
# 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,)
|
|
``` |