diff --git a/modules/impact/animatediff_nodes.py b/modules/impact/animatediff_nodes.py index f6708c0..3e7d68d 100644 --- a/modules/impact/animatediff_nodes.py +++ b/modules/impact/animatediff_nodes.py @@ -21,12 +21,11 @@ class SEGSDetailerForAnimateDiff: "scheduler": (core.SCHEDULERS,), "denoise": ("FLOAT", {"default": 0.5, "min": 0.0001, "max": 1.0, "step": 0.01}), "basic_pipe": ("BASIC_PIPE",), - "refiner_ratio": ("FLOAT", {"default": 0.2, "min": 0.0, "max": 1.0}) + "refiner_ratio": ("FLOAT", {"default": 0.2, "min": 0.0, "max": 1.0}), }, "optional": { "refiner_basic_pipe_opt": ("BASIC_PIPE",), - # TODO: "inpaint_model": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), - # TODO: "noise_mask_feather": ("INT", {"default": 20, "min": 0, "max": 100, "step": 1}), + "noise_mask_feather": ("INT", {"default": 20, "min": 0, "max": 100, "step": 1}), } } @@ -40,7 +39,7 @@ class SEGSDetailerForAnimateDiff: @staticmethod def do_detail(image_frames, segs, guide_size, guide_size_for, max_size, seed, steps, cfg, sampler_name, scheduler, - denoise, basic_pipe, refiner_ratio=None, refiner_basic_pipe_opt=None, inpaint_model=False, noise_mask_feather=0): + denoise, basic_pipe, refiner_ratio=None, refiner_basic_pipe_opt=None, noise_mask_feather=0): model, clip, vae, positive, negative = basic_pipe if refiner_basic_pipe_opt is None: @@ -90,7 +89,7 @@ class SEGSDetailerForAnimateDiff: refiner_ratio=refiner_ratio, refiner_model=refiner_model, refiner_clip=refiner_clip, refiner_positive=refiner_positive, refiner_negative=refiner_negative, control_net_wrapper=seg.control_net_wrapper, - inpaint_model=inpaint_model, noise_mask_feather=noise_mask_feather) + noise_mask_feather=noise_mask_feather) if cnet_images is not None: cnet_image_list.extend(cnet_images) @@ -109,7 +108,7 @@ class SEGSDetailerForAnimateDiff: segs, cnet_images = SEGSDetailerForAnimateDiff.do_detail(image_frames, segs, guide_size, guide_size_for, max_size, seed, steps, cfg, sampler_name, scheduler, denoise, basic_pipe, refiner_ratio, refiner_basic_pipe_opt, - inpaint_model=inpaint_model, noise_mask_feather=noise_mask_feather) + noise_mask_feather=noise_mask_feather) if len(cnet_images) == 0: cnet_images = [empty_pil_tensor()] @@ -135,13 +134,12 @@ class DetailerForEachPipeForAnimateDiff: "feather": ("INT", {"default": 5, "min": 0, "max": 100, "step": 1}), "basic_pipe": ("BASIC_PIPE", ), "refiner_ratio": ("FLOAT", {"default": 0.2, "min": 0.0, "max": 1.0}), - }, + }, "optional": { - "detailer_hook": ("DETAILER_HOOK",), - "refiner_basic_pipe_opt": ("BASIC_PIPE",), - # "inpaint_model": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), - # "noise_mask_feather": ("INT", {"default": 20, "min": 0, "max": 100, "step": 1}), - } + "detailer_hook": ("DETAILER_HOOK",), + "refiner_basic_pipe_opt": ("BASIC_PIPE",), + "noise_mask_feather": ("INT", {"default": 20, "min": 0, "max": 100, "step": 1}), + } } RETURN_TYPES = ("IMAGE", "SEGS", "BASIC_PIPE", "IMAGE") @@ -154,7 +152,7 @@ class DetailerForEachPipeForAnimateDiff: @staticmethod def doit(image_frames, segs, guide_size, guide_size_for, max_size, seed, steps, cfg, sampler_name, scheduler, denoise, feather, basic_pipe, refiner_ratio=None, detailer_hook=None, refiner_basic_pipe_opt=None, - inpaint_model=False, noise_mask_feather=0): + noise_mask_feather=0): enhanced_segs = [] cnet_image_list = [] @@ -162,7 +160,7 @@ class DetailerForEachPipeForAnimateDiff: for sub_seg in segs[1]: single_seg = segs[0], [sub_seg] enhanced_seg, cnet_images = SEGSDetailerForAnimateDiff().do_detail(image_frames, single_seg, guide_size, guide_size_for, max_size, seed, steps, cfg, sampler_name, scheduler, - denoise, basic_pipe, refiner_ratio, refiner_basic_pipe_opt, inpaint_model, noise_mask_feather) + denoise, basic_pipe, refiner_ratio, refiner_basic_pipe_opt, noise_mask_feather) image_frames = SEGSPaste.doit(image_frames, enhanced_seg, feather, alpha=255)[0] diff --git a/modules/impact/config.py b/modules/impact/config.py index f29ac9c..da5a426 100644 --- a/modules/impact/config.py +++ b/modules/impact/config.py @@ -2,7 +2,7 @@ import configparser import os -version_code = [5, 8, 1] +version_code = [5, 9] version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') dependency_version = 20 diff --git a/modules/impact/core.py b/modules/impact/core.py index 008ba4d..9264e8b 100644 --- a/modules/impact/core.py +++ b/modules/impact/core.py @@ -305,11 +305,14 @@ def enhance_detail_for_animatediff(image_frames, model, clip, vae, guide_size, g wildcard_opt=None, wildcard_opt_concat_mode=None, detailer_hook=None, refiner_ratio=None, refiner_model=None, refiner_clip=None, refiner_positive=None, - refiner_negative=None, control_net_wrapper=None, inpaint_model=False, noise_mask_feather=0): + refiner_negative=None, control_net_wrapper=None, noise_mask_feather=0): if noise_mask is not None: noise_mask = utils.tensor_gaussian_blur_mask(noise_mask, noise_mask_feather) noise_mask = noise_mask.squeeze(3) + if noise_mask_feather > 0: + model = nodes_differential_diffusion.DifferentialDiffusion().apply(model)[0] + if wildcard_opt is not None and wildcard_opt != "": model, _, wildcard_positive = wildcards.process_with_loras(wildcard_opt, model, clip) diff --git a/modules/impact/segs_nodes.py b/modules/impact/segs_nodes.py index b378991..eaff817 100644 --- a/modules/impact/segs_nodes.py +++ b/modules/impact/segs_nodes.py @@ -10,6 +10,7 @@ from .core import SEG import impact.utils as utils from . import defs from . import segs_upscaler +from comfy.cli_args import args import math @@ -196,9 +197,8 @@ class SEGSPaste: x, y, *_ = seg.crop_region # ensure same device - mask.cpu() - image_i.cpu() - ref_image.cpu() + mask = mask.to(image_i.device) + ref_image = ref_image.to(image_i.device) tensor_paste(image_i, ref_image, (x, y), mask) @@ -207,6 +207,9 @@ class SEGSPaste: else: result = torch.concat((result, image_i), dim=0) + if not args.highvram and not args.gpu_only: + result = result.cpu() + return (result, ) diff --git a/modules/impact/segs_upscaler.py b/modules/impact/segs_upscaler.py index 98ce1cf..ba09d2c 100644 --- a/modules/impact/segs_upscaler.py +++ b/modules/impact/segs_upscaler.py @@ -1,6 +1,7 @@ from impact.utils import * from impact import impact_sampling from comfy import model_management +from comfy.cli_args import args import nodes try: @@ -17,7 +18,7 @@ except Exception: def upscale_with_model(upscale_model, image): device = model_management.get_torch_device() upscale_model.to(device) - in_img = image.movedim(-1,-3).to(device) + in_img = image.movedim(-1, -3).to(device) free_memory = model_management.get_free_memory(device) tile = 512 @@ -35,7 +36,6 @@ def upscale_with_model(upscale_model, image): if tile < 128: raise e - upscale_model.cpu() s = torch.clamp(s.movedim(-3, -1), min=0, max=1.0) return s diff --git a/pyproject.toml b/pyproject.toml index 2f77a46..d55a17b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-impact-pack" description = "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler." -version = "5.8.1" +version = "5.9" license = "LICENSE" dependencies = ["segment-anything", "scikit-image", "piexif", "transformers", "opencv-python-headless", "GitPython", "scipy>=1.11.4"]