mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-05-28 09:57:24 +08:00
Add SeedVR2 workflow nodes
This commit is contained in:
parent
2ebacd019d
commit
6e5186ddac
1164
comfy_extras/nodes_seedvr.py
Normal file
1164
comfy_extras/nodes_seedvr.py
Normal file
File diff suppressed because it is too large
Load Diff
38
nodes.py
38
nodes.py
@ -47,14 +47,18 @@ import node_helpers
|
|||||||
if args.enable_manager:
|
if args.enable_manager:
|
||||||
import comfyui_manager
|
import comfyui_manager
|
||||||
|
|
||||||
|
|
||||||
def before_node_execution():
|
def before_node_execution():
|
||||||
comfy.model_management.throw_exception_if_processing_interrupted()
|
comfy.model_management.throw_exception_if_processing_interrupted()
|
||||||
|
|
||||||
|
|
||||||
def interrupt_processing(value=True):
|
def interrupt_processing(value=True):
|
||||||
comfy.model_management.interrupt_current_processing(value)
|
comfy.model_management.interrupt_current_processing(value)
|
||||||
|
|
||||||
|
|
||||||
MAX_RESOLUTION=16384
|
MAX_RESOLUTION=16384
|
||||||
|
|
||||||
|
|
||||||
class CLIPTextEncode(ComfyNodeABC):
|
class CLIPTextEncode(ComfyNodeABC):
|
||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(s) -> InputTypeDict:
|
def INPUT_TYPES(s) -> InputTypeDict:
|
||||||
@ -323,8 +327,8 @@ class VAEDecodeTiled:
|
|||||||
return {"required": {"samples": ("LATENT", ), "vae": ("VAE", ),
|
return {"required": {"samples": ("LATENT", ), "vae": ("VAE", ),
|
||||||
"tile_size": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 32, "advanced": True}),
|
"tile_size": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 32, "advanced": True}),
|
||||||
"overlap": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 32, "advanced": True}),
|
"overlap": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 32, "advanced": True}),
|
||||||
"temporal_size": ("INT", {"default": 64, "min": 8, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to decode at a time.", "advanced": True}),
|
"temporal_size": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to decode at a time. SeedVR2 allows 0 to disable temporal slicing.", "advanced": True}),
|
||||||
"temporal_overlap": ("INT", {"default": 8, "min": 4, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to overlap.", "advanced": True}),
|
"temporal_overlap": ("INT", {"default": 8, "min": 0, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to overlap.", "advanced": True}),
|
||||||
}}
|
}}
|
||||||
RETURN_TYPES = ("IMAGE",)
|
RETURN_TYPES = ("IMAGE",)
|
||||||
FUNCTION = "decode"
|
FUNCTION = "decode"
|
||||||
@ -334,18 +338,32 @@ class VAEDecodeTiled:
|
|||||||
def decode(self, vae, samples, tile_size, overlap=64, temporal_size=64, temporal_overlap=8):
|
def decode(self, vae, samples, tile_size, overlap=64, temporal_size=64, temporal_overlap=8):
|
||||||
if tile_size < overlap * 4:
|
if tile_size < overlap * 4:
|
||||||
overlap = tile_size // 4
|
overlap = tile_size // 4
|
||||||
if temporal_size < temporal_overlap * 2:
|
|
||||||
temporal_overlap = temporal_overlap // 2
|
|
||||||
temporal_compression = vae.temporal_compression_decode()
|
temporal_compression = vae.temporal_compression_decode()
|
||||||
if temporal_compression is not None:
|
if temporal_compression is not None:
|
||||||
|
if temporal_size <= 0:
|
||||||
|
temporal_size = 0
|
||||||
|
temporal_overlap = 0
|
||||||
|
else:
|
||||||
|
requested_temporal_overlap = temporal_overlap
|
||||||
|
if temporal_size < temporal_overlap * 2:
|
||||||
|
temporal_overlap = temporal_overlap // 2
|
||||||
temporal_size = max(2, temporal_size // temporal_compression)
|
temporal_size = max(2, temporal_size // temporal_compression)
|
||||||
temporal_overlap = max(1, min(temporal_size // 2, temporal_overlap // temporal_compression))
|
temporal_overlap = min(temporal_size // 2, temporal_overlap // temporal_compression)
|
||||||
|
if requested_temporal_overlap > 0:
|
||||||
|
temporal_overlap = max(1, temporal_overlap)
|
||||||
else:
|
else:
|
||||||
temporal_size = None
|
temporal_size = None
|
||||||
temporal_overlap = None
|
temporal_overlap = None
|
||||||
|
|
||||||
compression = vae.spacial_compression_decode()
|
compression = vae.spacial_compression_decode()
|
||||||
images = vae.decode_tiled(samples["samples"], tile_x=tile_size // compression, tile_y=tile_size // compression, overlap=overlap // compression, tile_t=temporal_size, overlap_t=temporal_overlap)
|
images = vae.decode_tiled(
|
||||||
|
samples["samples"],
|
||||||
|
tile_x=tile_size // compression,
|
||||||
|
tile_y=tile_size // compression,
|
||||||
|
overlap=overlap // compression,
|
||||||
|
tile_t=temporal_size,
|
||||||
|
overlap_t=temporal_overlap,
|
||||||
|
)
|
||||||
if len(images.shape) == 5: #Combine batches
|
if len(images.shape) == 5: #Combine batches
|
||||||
images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1])
|
images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1])
|
||||||
return (images, )
|
return (images, )
|
||||||
@ -370,8 +388,8 @@ class VAEEncodeTiled:
|
|||||||
return {"required": {"pixels": ("IMAGE", ), "vae": ("VAE", ),
|
return {"required": {"pixels": ("IMAGE", ), "vae": ("VAE", ),
|
||||||
"tile_size": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 64, "advanced": True}),
|
"tile_size": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 64, "advanced": True}),
|
||||||
"overlap": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 32, "advanced": True}),
|
"overlap": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 32, "advanced": True}),
|
||||||
"temporal_size": ("INT", {"default": 64, "min": 8, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to encode at a time.", "advanced": True}),
|
"temporal_size": ("INT", {"default": 64, "min": 0, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to encode at a time. SeedVR2 allows 0 to disable temporal slicing.", "advanced": True}),
|
||||||
"temporal_overlap": ("INT", {"default": 8, "min": 4, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to overlap.", "advanced": True}),
|
"temporal_overlap": ("INT", {"default": 8, "min": 0, "max": 4096, "step": 4, "tooltip": "Only used for video VAEs: Amount of frames to overlap.", "advanced": True}),
|
||||||
}}
|
}}
|
||||||
RETURN_TYPES = ("LATENT",)
|
RETURN_TYPES = ("LATENT",)
|
||||||
FUNCTION = "encode"
|
FUNCTION = "encode"
|
||||||
@ -379,6 +397,9 @@ class VAEEncodeTiled:
|
|||||||
CATEGORY = "experimental"
|
CATEGORY = "experimental"
|
||||||
|
|
||||||
def encode(self, vae, pixels, tile_size, overlap, temporal_size=64, temporal_overlap=8):
|
def encode(self, vae, pixels, tile_size, overlap, temporal_size=64, temporal_overlap=8):
|
||||||
|
if temporal_size <= 0:
|
||||||
|
temporal_size = 0
|
||||||
|
temporal_overlap = 0
|
||||||
t = vae.encode_tiled(pixels, tile_x=tile_size, tile_y=tile_size, overlap=overlap, tile_t=temporal_size, overlap_t=temporal_overlap)
|
t = vae.encode_tiled(pixels, tile_x=tile_size, tile_y=tile_size, overlap=overlap, tile_t=temporal_size, overlap_t=temporal_overlap)
|
||||||
return ({"samples": t}, )
|
return ({"samples": t}, )
|
||||||
|
|
||||||
@ -2417,6 +2438,7 @@ async def init_builtin_extra_nodes():
|
|||||||
"nodes_camera_trajectory.py",
|
"nodes_camera_trajectory.py",
|
||||||
"nodes_edit_model.py",
|
"nodes_edit_model.py",
|
||||||
"nodes_tcfg.py",
|
"nodes_tcfg.py",
|
||||||
|
"nodes_seedvr.py",
|
||||||
"nodes_context_windows.py",
|
"nodes_context_windows.py",
|
||||||
"nodes_qwen.py",
|
"nodes_qwen.py",
|
||||||
"nodes_chroma_radiance.py",
|
"nodes_chroma_radiance.py",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user