Files
CavinHuang-comfyui-nodes-docs/docs/AV_ControlNetEfficientStacker.md
2024-07-04 11:34:32 +08:00

5.2 KiB

Documentation

AV_ControlNetEfficientStacker节点旨在简化图像处理流程中控制网络的整合和管理。它通过允许基于预定义标准进行动态选择、应用预处理步骤以及调整控制网络强度和分辨率,实现了控制网络的高效堆叠,从而增强了图像处理任务的灵活性和有效性。

Input types

Required

  • control_net_name
    • 指定要使用的控制网络名称,包括基于模型版本自动选择的选项。该参数对于确定适当的控制网络和图像预处理要求至关重要。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • image
    • 待处理的输入图像。此参数至关重要,因为它作为应用控制网络转换的基础。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • strength
    • 定义控制网络对图像影响的强度,允许对图像属性进行精细调整。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • start_percent
    • 指定控制网络效果的起始百分比,允许逐步应用于图像。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • end_percent
    • 指定控制网络效果的结束百分比,实现对网络影响衰减的精确控制。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • preprocessor
    • 指定在应用控制网络之前对图像进行预处理的方法,确保图像处于最佳格式以便进行操作。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str

Optional

  • cnet_stack
    • 可选的控制网络堆栈。这允许叠加多个控制网络以实现复杂的图像转换。
    • Comfy dtype: CONTROL_NET_STACK
    • Python dtype: Optional[List[Tuple[Any]]]
  • control_net_override
    • 允许手动覆盖选定的控制网络,提供控制网络选择的灵活性。
    • Comfy dtype: STRING
    • Python dtype: str
  • timestep_keyframe
    • 可选地指定控制网络的关键帧,实现对图像处理过程的时间控制。
    • Comfy dtype: TIMESTEP_KEYFRAME
    • Python dtype: Optional[str]
  • resolution
    • 设置图像处理的分辨率,允许控制输出图像的细节级别。
    • Comfy dtype: INT
    • Python dtype: int
  • enabled
    • 用于启用或禁用控制网络处理的标志,提供了一种简单的方法来绕过控制网络应用。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool

Output types

  • CNET_STACK
    • Comfy dtype: CONTROL_NET_STACK
    • 该输出代表处理后的控制网络堆栈,可用于后续的图像处理步骤。
    • Python dtype: unknown

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class AVControlNetEfficientStacker:
    controlnets = folder_paths.get_filename_list("controlnet")
    preprocessors = list(control_net_preprocessors.keys())

    @classmethod
    def INPUT_TYPES(s):
        return {
            "required": {
                "control_net_name": (["None", "Auto: sd15", "Auto: sdxl", "Auto: sdxl_t2i"] + s.controlnets,),
                "image": ("IMAGE",),
                "strength": (
                    "FLOAT",
                    {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
                ),
                "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
                "end_percent": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}),
                "preprocessor": (["None"] + s.preprocessors,),
            },
            "optional": {
                "cnet_stack": ("CONTROL_NET_STACK",),
                "control_net_override": ("STRING", {"default": "None"}),
                "timestep_keyframe": ("TIMESTEP_KEYFRAME",),
                "resolution": ("INT", {"default": 512, "min": 64, "max": 2048, "step": 64}),
                "enabled": ("BOOLEAN", {"default": True}),
            },
        }

    RETURN_TYPES = ("CONTROL_NET_STACK",)
    RETURN_NAMES = ("CNET_STACK",)
    FUNCTION = "control_net_stacker"
    CATEGORY = "Art Venture/Loaders"

    def control_net_stacker(
        self,
        control_net_name: str,
        image,
        strength,
        start_percent,
        end_percent,
        preprocessor,
        cnet_stack=None,
        control_net_override="None",
        timestep_keyframe=None,
        resolution=512,
        enabled=True,
    ):
        if not enabled:
            return (cnet_stack,)

        # If control_net_stack is None, initialize as an empty list
        if cnet_stack is None:
            cnet_stack = []

        if control_net_name.startswith("Auto: "):
            assert preprocessor != "None", "preprocessor must be set when using Auto mode"

            sd_version = control_net_name[len("Auto: ") :]
            control_net_name = detect_controlnet(preprocessor, sd_version)

        control_net = load_controlnet(control_net_name, control_net_override, timestep_keyframe=timestep_keyframe)

        # Extend the control_net_stack with the new tuple
        if control_net is not None:
            image = apply_preprocessor(image, preprocessor, resolution=resolution)
            cnet_stack.extend([(control_net, image, strength, start_percent, end_percent)])

        return (cnet_stack,)