147 lines
9.4 KiB
Markdown
147 lines
9.4 KiB
Markdown
# Documentation
|
|
- Class name: RegionalSamplerAdvanced
|
|
- Category: ImpactPack/Regional
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
|
|
|
|
RegionalSamplerAdvanced 节点旨在对潜在图像的特定区域执行高级采样操作。它允许自定义采样步骤、噪声添加和恢复定义区域内的潜在状态,为局部图像生成的采样过程提供了高度的控制能力。
|
|
|
|
# Input types
|
|
## Required
|
|
- add_noise
|
|
- 'add_noise' 参数决定在采样过程中是否向潜在图像添加噪声。这可以影响生成图像的质量和随机性,是实现所需视觉效果的关键因素。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- noise_seed
|
|
- 'noise_seed' 参数用于初始化添加噪声的随机数生成器,确保采样过程的可重复性。它的值直接影响引入潜在图像中的噪声模式。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- steps
|
|
- 'steps' 参数指定要执行的采样步骤数。它是最终图像细节和分辨率的关键决定因素,更多的步骤通常会导致更精细的结果。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- start_at_step
|
|
- 'start_at_step' 参数定义了采样过程开始的步骤,允许自定义采样时间线,并使用户能够控制图像生成的进展。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- end_at_step
|
|
- 'end_at_step' 参数设置了采样过程结束的步骤。它与 'start_at_step' 配合使用,定义了执行采样的步骤范围,影响采样过程的总持续时间。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- overlap_factor
|
|
- 'overlap_factor' 参数控制采样过程中区域掩模之间的重叠程度。它对于确保采样区域的无缝集成至关重要,在图像的最终构图中扮演着重要角色。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- restore_latent
|
|
- 'restore_latent' 参数指示在每个区域采样后是否应恢复潜在状态。这有助于在多个采样操作重叠的区域中保持图像的完整性。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- return_with_leftover_noise
|
|
- 'return_with_leftover_noise' 参数决定采样过程后最终潜在图像是否保留任何残余噪声。这对于进一步处理或分析噪声特性非常有用。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- latent_image
|
|
- 'latent_image' 参数表示要采样的图像的初始潜在状态。它是采样过程的起点,对生成最终图像至关重要。
|
|
- Comfy dtype: LATENT
|
|
- Python dtype: Dict[str, torch.Tensor]
|
|
- base_sampler
|
|
- 'base_sampler' 参数定义了要用于潜在图像的基本采样方法。它是确定图像生成算法方法的关键组成部分,并影响输出的整体风格和质量。
|
|
- Comfy dtype: KSAMPLER_ADVANCED
|
|
- Python dtype: KSamplerAdvancedWrapper
|
|
- regional_prompts
|
|
- 'regional_prompts' 参数包含定义采样感兴趣区域的提示集合。每个提示都可以影响其指定区域内的采样过程,允许对局部图像特征进行详细控制。
|
|
- Comfy dtype: REGIONAL_PROMPTS
|
|
- Python dtype: List[Any]
|
|
- additional_mode
|
|
- 'additional_mode' 参数指定了采样过程中要应用的恢复模式。它决定了额外采样如何与基本采样集成,影响最终图像的连贯性和细节。
|
|
- Comfy dtype: COMBO['DISABLE', 'ratio additional', 'ratio between']
|
|
- Python dtype: str
|
|
- additional_sampler
|
|
- 'additional_sampler' 参数选择用于额外采样任务的采样器类型。在采样过程中恢复和细化图像细节的重要因素。
|
|
- Comfy dtype: COMBO['AUTO', 'euler', 'heun', 'heunpp2', 'dpm_2', 'dpm_fast', 'dpmpp_2m', 'ddpm']
|
|
- Python dtype: str
|
|
- additional_sigma_ratio
|
|
- 'additional_sigma_ratio' 参数调整用于额外采样的 sigma 比例,允许微调噪声水平及其对图像生成过程的影响。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
## Optional
|
|
- unique_id
|
|
- 'unique_id' 参数在执行过程中用于内部唯一标识节点。它在跟踪和管理节点状态中起着关键作用,确保系统内准确报告和协调。
|
|
- Comfy dtype: UNIQUE_ID
|
|
- Python dtype: str
|
|
|
|
# Output types
|
|
- latent_image
|
|
- 'latent_image' 输出代表应用 RegionalSamplerAdvanced 节点操作后最终采样的潜在图像。它封装了高级采样过程的结果,反映了执行期间进行的定制噪声、步骤和区域调整。
|
|
- Comfy dtype: LATENT
|
|
- Python dtype: Dict[str, torch.Tensor]
|
|
|
|
# Usage tips
|
|
- Infra type: GPU
|
|
|
|
# Source code
|
|
```
|
|
class RegionalSamplerAdvanced:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {'required': {'add_noise': ('BOOLEAN', {'default': True, 'label_on': 'enabled', 'label_off': 'disabled'}), 'noise_seed': ('INT', {'default': 0, 'min': 0, 'max': 18446744073709551615}), 'steps': ('INT', {'default': 20, 'min': 1, 'max': 10000}), 'start_at_step': ('INT', {'default': 0, 'min': 0, 'max': 10000}), 'end_at_step': ('INT', {'default': 10000, 'min': 0, 'max': 10000}), 'overlap_factor': ('INT', {'default': 10, 'min': 0, 'max': 10000}), 'restore_latent': ('BOOLEAN', {'default': True, 'label_on': 'enabled', 'label_off': 'disabled'}), 'return_with_leftover_noise': ('BOOLEAN', {'default': False, 'label_on': 'enabled', 'label_off': 'disabled'}), 'latent_image': ('LATENT',), 'base_sampler': ('KSAMPLER_ADVANCED',), 'regional_prompts': ('REGIONAL_PROMPTS',), 'additional_mode': (['DISABLE', 'ratio additional', 'ratio between'], {'default': 'ratio between'}), 'additional_sampler': (['AUTO', 'euler', 'heun', 'heunpp2', 'dpm_2', 'dpm_fast', 'dpmpp_2m', 'ddpm'],), 'additional_sigma_ratio': ('FLOAT', {'default': 0.3, 'min': 0.0, 'max': 1.0, 'step': 0.01})}, 'hidden': {'unique_id': 'UNIQUE_ID'}}
|
|
RETURN_TYPES = ('LATENT',)
|
|
FUNCTION = 'doit'
|
|
CATEGORY = 'ImpactPack/Regional'
|
|
|
|
def doit(self, add_noise, noise_seed, steps, start_at_step, end_at_step, overlap_factor, restore_latent, return_with_leftover_noise, latent_image, base_sampler, regional_prompts, additional_mode, additional_sampler, additional_sigma_ratio, unique_id):
|
|
if restore_latent:
|
|
latent_compositor = nodes.NODE_CLASS_MAPPINGS['LatentCompositeMasked']()
|
|
else:
|
|
latent_compositor = None
|
|
masks = [regional_prompt.mask.numpy() for regional_prompt in regional_prompts]
|
|
masks = [np.ceil(mask).astype(np.int32) for mask in masks]
|
|
combined_mask = torch.from_numpy(np.bitwise_or.reduce(masks))
|
|
inv_mask = torch.where(combined_mask == 0, torch.tensor(1.0), torch.tensor(0.0))
|
|
region_len = len(regional_prompts)
|
|
end_at_step = min(steps, end_at_step)
|
|
total = (end_at_step - start_at_step) * region_len
|
|
new_latent_image = latent_image.copy()
|
|
base_latent_image = None
|
|
region_masks = {}
|
|
for i in range(start_at_step, end_at_step - 1):
|
|
core.update_node_status(unique_id, f'{start_at_step + i}/{end_at_step} steps | ', (i - start_at_step) * region_len / total)
|
|
cur_add_noise = True if i == start_at_step and add_noise else False
|
|
new_latent_image['noise_mask'] = inv_mask
|
|
new_latent_image = base_sampler.sample_advanced(cur_add_noise, noise_seed, steps, new_latent_image, i, i + 1, True, recovery_mode=additional_mode, recovery_sampler=additional_sampler, recovery_sigma_ratio=additional_sigma_ratio)
|
|
if restore_latent:
|
|
del new_latent_image['noise_mask']
|
|
base_latent_image = new_latent_image.copy()
|
|
j = 1
|
|
for regional_prompt in regional_prompts:
|
|
if restore_latent:
|
|
new_latent_image = base_latent_image.copy()
|
|
core.update_node_status(unique_id, f'{start_at_step + i}/{end_at_step} steps | {j}/{region_len}', ((i - start_at_step) * region_len + j) / total)
|
|
if j not in region_masks:
|
|
region_mask = regional_prompt.get_mask_erosion(overlap_factor).squeeze(0).squeeze(0)
|
|
region_masks[j] = region_mask
|
|
else:
|
|
region_mask = region_masks[j]
|
|
new_latent_image['noise_mask'] = region_mask
|
|
new_latent_image = regional_prompt.sampler.sample_advanced(False, noise_seed, steps, new_latent_image, i, i + 1, True, recovery_mode=additional_mode, recovery_sampler=additional_sampler, recovery_sigma_ratio=additional_sigma_ratio)
|
|
if restore_latent:
|
|
del new_latent_image['noise_mask']
|
|
base_latent_image = latent_compositor.composite(base_latent_image, new_latent_image, 0, 0, False, region_mask)[0]
|
|
new_latent_image = base_latent_image
|
|
j += 1
|
|
core.update_node_status(unique_id, f'finalize')
|
|
if base_latent_image is not None:
|
|
new_latent_image = base_latent_image
|
|
else:
|
|
base_latent_image = new_latent_image
|
|
new_latent_image['noise_mask'] = inv_mask
|
|
new_latent_image = base_sampler.sample_advanced(False, noise_seed, steps, new_latent_image, end_at_step - 1, end_at_step, return_with_leftover_noise, recovery_mode=additional_mode, recovery_sampler=additional_sampler, recovery_sigma_ratio=additional_sigma_ratio)
|
|
core.update_node_status(unique_id, f'{end_at_step}/{end_at_step} steps', total)
|
|
core.update_node_status(unique_id, '', None)
|
|
if restore_latent:
|
|
new_latent_image = base_latent_image
|
|
if 'noise_mask' in new_latent_image:
|
|
del new_latent_image['noise_mask']
|
|
return (new_latent_image,)
|
|
``` |