127 lines
6.3 KiB
Markdown
127 lines
6.3 KiB
Markdown
# Documentation
|
|
- Class name: SeargeControlnetAdapterV2
|
|
- Category: UI_PROMPTING
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/jobunk/SeargeSDXL.git
|
|
|
|
该节点促进控制网络机制的适配,以增强图像处理任务。它根据输入参数动态选择和应用各种边缘检测和图像增强算法,旨在根据特定要求改善视觉输出。
|
|
|
|
# Input types
|
|
## Required
|
|
- controlnet_mode
|
|
- 确定要使用的控制网络类型,这显著影响处理方法和最终图像质量。
|
|
- Comfy dtype: COMBO[str]
|
|
- Python dtype: str
|
|
- controlnet_preprocessor
|
|
- 启用或禁用控制网图像的预处理,可以优化后续的图像处理步骤。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- strength
|
|
- 调整控制网络对图像的影响强度,直接影响最终的视觉结果。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- low_threshold
|
|
- 设置边缘检测灵敏度的下限,影响图像中检测到的边缘的粒度。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- high_threshold
|
|
- 定义边缘检测灵敏度的上限,影响最终图像中边缘的显著性。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- start_percent
|
|
- 指定图像处理范围的起始百分比,确定受影响的图像初始段。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- end_percent
|
|
- 指示图像处理范围的结束百分比,建立受影响的图像最终段。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- noise_augmentation
|
|
- 控制应用于图像的噪声增强水平,这可以增强控制网络的鲁棒性。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- revision_enhancer
|
|
- 激活或停用修订增强器,它精炼控制网络的输出以提高准确性。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
## Optional
|
|
- source_image
|
|
- 提供控制网络处理的基础图像,作为所有后续图像操作的基本输入。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: PIL.Image
|
|
- data
|
|
- 提供控制网络用于更复杂处理的附加数据流信息。
|
|
- Comfy dtype: SRG_DATA_STREAM
|
|
- Python dtype: List[Dict[str, Any]]
|
|
|
|
# Output types
|
|
- data
|
|
- 包含控制网络处理后更新的数据流信息,可以进一步被下游利用。
|
|
- Comfy dtype: SRG_DATA_STREAM
|
|
- Python dtype: Dict[str, Any]
|
|
- preview
|
|
- 展示处理后图像的视觉预览,演示控制网络调整的效果。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: PIL.Image
|
|
|
|
# Usage tips
|
|
- Infra type: CPU
|
|
|
|
# Source code
|
|
```
|
|
class SeargeControlnetAdapterV2:
|
|
|
|
def __init__(self):
|
|
self.expected_size = None
|
|
self.hed_annotator = 'ControlNetHED.pth'
|
|
self.leres_annotator = 'res101.pth'
|
|
self.hed_annotator_full_path = get_full_path('annotators', self.hed_annotator)
|
|
self.leres_annotator_full_path = get_full_path('annotators', self.leres_annotator)
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {'required': {'controlnet_mode': (UI.CONTROLNET_MODES, {'default': UI.NONE}), 'controlnet_preprocessor': ('BOOLEAN', {'default': False}), 'strength': ('FLOAT', {'default': 0.5, 'min': 0.0, 'max': 10.0, 'step': 0.05}), 'low_threshold': ('FLOAT', {'default': 0.25, 'min': 0.0, 'max': 1.0, 'step': 0.05}), 'high_threshold': ('FLOAT', {'default': 0.5, 'min': 0.0, 'max': 1.0, 'step': 0.05}), 'start_percent': ('FLOAT', {'default': 0.0, 'min': 0.0, 'max': 1.0, 'step': 0.05}), 'end_percent': ('FLOAT', {'default': 1.0, 'min': 0.0, 'max': 1.0, 'step': 0.05}), 'noise_augmentation': ('FLOAT', {'default': 0.0, 'min': 0.0, 'max': 1.0, 'step': 0.05}), 'revision_enhancer': ('BOOLEAN', {'default': False})}, 'optional': {'data': ('SRG_DATA_STREAM',), 'source_image': ('IMAGE',)}}
|
|
RETURN_TYPES = ('SRG_DATA_STREAM', 'IMAGE')
|
|
RETURN_NAMES = ('data', 'preview')
|
|
FUNCTION = 'get_value'
|
|
CATEGORY = UI.CATEGORY_UI_PROMPTING
|
|
|
|
def process_image(self, image, mode, low_threshold, high_threshold):
|
|
if mode == UI.CN_MODE_CANNY:
|
|
image = canny(image, low_threshold, high_threshold)
|
|
elif mode == UI.CN_MODE_DEPTH:
|
|
image = leres(image, low_threshold, high_threshold, self.leres_annotator_full_path)
|
|
elif mode == UI.CN_MODE_SKETCH:
|
|
image = hed(image, self.hed_annotator_full_path)
|
|
else:
|
|
pass
|
|
return image
|
|
|
|
def create_dict(self, stack, source_image, controlnet_mode, controlnet_preprocessor, strength, low_threshold, high_threshold, start, end, noise_augmentation, revision_enhancer):
|
|
if controlnet_mode is None or controlnet_mode == UI.NONE:
|
|
cn_image = None
|
|
else:
|
|
cn_image = source_image
|
|
low_threshold = round(low_threshold, 3)
|
|
high_threshold = round(high_threshold, 3)
|
|
if controlnet_mode == UI.CN_MODE_REVISION or controlnet_mode == UI.CUSTOM:
|
|
controlnet_preprocessor = False
|
|
if controlnet_preprocessor and cn_image is not None:
|
|
cn_image = self.process_image(cn_image, controlnet_mode, low_threshold, high_threshold)
|
|
stack += [{UI.F_REV_CN_IMAGE: cn_image, UI.F_REV_CN_IMAGE_CHANGED: True, UI.F_REV_CN_MODE: controlnet_mode, UI.F_CN_PRE_PROCESSOR: controlnet_preprocessor, UI.F_REV_CN_STRENGTH: round(strength, 3), UI.F_CN_LOW_THRESHOLD: low_threshold, UI.F_CN_HIGH_THRESHOLD: high_threshold, UI.F_CN_START: round(start, 3), UI.F_CN_END: round(end, 3), UI.F_REV_NOISE_AUGMENTATION: round(noise_augmentation, 3), UI.F_REV_ENHANCER: revision_enhancer}]
|
|
return ({UI.F_CN_STACK: stack}, cn_image)
|
|
|
|
def get_value(self, controlnet_mode, controlnet_preprocessor, strength, low_threshold, high_threshold, start_percent, end_percent, noise_augmentation, revision_enhancer, source_image=None, data=None):
|
|
if data is None:
|
|
data = {}
|
|
stack = retrieve_parameter(UI.F_CN_STACK, retrieve_parameter(UI.S_CONTROLNET_INPUTS, data), [])
|
|
if self.expected_size is None:
|
|
self.expected_size = len(stack)
|
|
elif self.expected_size == 0:
|
|
stack = []
|
|
elif len(stack) > self.expected_size:
|
|
stack = stack[:self.expected_size]
|
|
(stack_entry, image) = self.create_dict(stack, source_image, controlnet_mode, controlnet_preprocessor, strength, low_threshold, high_threshold, start_percent, end_percent, noise_augmentation, revision_enhancer)
|
|
data[UI.S_CONTROLNET_INPUTS] = stack_entry
|
|
return (data, image)
|
|
``` |