feat: PreviewDetailerHook

This commit is contained in:
Dr.Lt.Data
2024-02-01 16:54:18 +09:00
parent a823348392
commit 8afba2e654
10 changed files with 113 additions and 35 deletions
+4
View File
@@ -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
+1 -1
View File
@@ -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
+18
View File
@@ -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
View File
@@ -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
+3
View File
@@ -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)