feat: Detailer for AD - supports noise_mask_feather and DifferentialDiffusion
fix: SEGSPaste - device mismatch error on --gpu-only
This commit is contained in:
@@ -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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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, )
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user