feat: PreviewDetailerHook
This commit is contained in:
@@ -139,6 +139,10 @@ class DetailerForEachPipeForAnimateDiff:
|
||||
denoise, basic_pipe, refiner_ratio, refiner_basic_pipe_opt, inpaint_model, noise_mask_feather)
|
||||
|
||||
image_frames = SEGSPaste.doit(image_frames, enhanced_seg, feather, alpha=255)[0]
|
||||
|
||||
if detailer_hook is not None:
|
||||
detailer_hook.post_paste(image_frames)
|
||||
|
||||
enhanced_segs += enhanced_seg[1]
|
||||
|
||||
new_segs = segs[0], enhanced_segs
|
||||
|
||||
@@ -2,7 +2,7 @@ import configparser
|
||||
import os
|
||||
|
||||
|
||||
version_code = [4, 71]
|
||||
version_code = [4, 72]
|
||||
version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||
|
||||
dependency_version = 20
|
||||
|
||||
@@ -63,3 +63,21 @@ class SEGSLabelFilterDetailerHookProvider:
|
||||
def doit(self, preset, labels):
|
||||
hook = hooks.SEGSLabelFilterDetailerHook(labels)
|
||||
return (hook, )
|
||||
|
||||
|
||||
class PreviewDetailerHookProvider:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {"quality": ("INT", {"default": 95, "min": 20, "max": 100})},
|
||||
"hidden": {"unique_id": "UNIQUE_ID"},
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("DETAILER_HOOK", )
|
||||
FUNCTION = "doit"
|
||||
|
||||
CATEGORY = "ImpactPack/Util"
|
||||
|
||||
def doit(self, quality, unique_id):
|
||||
hook = hooks.PreviewDetailerHook(unique_id, quality)
|
||||
return (hook, )
|
||||
|
||||
+39
-1
@@ -4,7 +4,10 @@ import nodes
|
||||
from impact import utils
|
||||
from . import segs_nodes
|
||||
from thirdparty import noise_nodes
|
||||
|
||||
from server import PromptServer
|
||||
import asyncio
|
||||
import folder_paths
|
||||
import os
|
||||
|
||||
class PixelKSampleHook:
|
||||
cur_step = 0
|
||||
@@ -129,6 +132,9 @@ class DetailerHook(PixelKSampleHook):
|
||||
def post_detection(self, segs):
|
||||
return segs
|
||||
|
||||
def post_paste(self, image):
|
||||
return image
|
||||
|
||||
|
||||
class SimpleDetailerDenoiseSchedulerHook(DetailerHook):
|
||||
def __init__(self, target_denoise):
|
||||
@@ -405,3 +411,35 @@ class SEGSLabelFilterDetailerHook(DetailerHook):
|
||||
|
||||
def post_detection(self, segs):
|
||||
return segs_nodes.SEGSLabelFilter().doit(segs, "", self.labels)[0]
|
||||
|
||||
|
||||
class PreviewDetailerHook(DetailerHook):
|
||||
def __init__(self, node_id, quality):
|
||||
super().__init__()
|
||||
self.node_id = node_id
|
||||
self.quality = quality
|
||||
|
||||
async def send(self, image):
|
||||
if len(image) > 0:
|
||||
image = image[0].unsqueeze(0)
|
||||
img = utils.tensor2pil(image)
|
||||
|
||||
temp_path = os.path.join(folder_paths.get_temp_directory(), 'pvhook')
|
||||
|
||||
if not os.path.exists(temp_path):
|
||||
os.makedirs(temp_path)
|
||||
|
||||
fullpath = os.path.join(temp_path, f"{self.node_id}.webp")
|
||||
img.save(fullpath, quality=self.quality)
|
||||
|
||||
item = {
|
||||
"filename": f"{self.node_id}.webp",
|
||||
"subfolder": 'pvhook',
|
||||
"type": 'temp'
|
||||
}
|
||||
|
||||
PromptServer.instance.send_sync("impact-preview", {'node_id': self.node_id, 'item': item})
|
||||
|
||||
def post_paste(self, image):
|
||||
asyncio.run(self.send(image))
|
||||
return image
|
||||
|
||||
@@ -265,6 +265,9 @@ class DetailerForEach:
|
||||
tensor_paste(image, enhanced_image, (seg.crop_region[0], seg.crop_region[1]), mask)
|
||||
enhanced_list.append(enhanced_image)
|
||||
|
||||
if detailer_hook is not None:
|
||||
detailer_hook.post_paste(image)
|
||||
|
||||
if not (enhanced_image is None):
|
||||
# Convert enhanced_pil_alpha to RGBA mode
|
||||
enhanced_image_alpha = tensor_convert_rgba(enhanced_image)
|
||||
|
||||
Reference in New Issue
Block a user