mirror of
https://github.com/storytold/storyteller-ml.git
synced 2026-10-09 00:09:55 +00:00
more extensions
This commit is contained in:
@@ -1,5 +1,18 @@
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
/output/
|
||||
/input/
|
||||
!/input/example.png
|
||||
/models/
|
||||
/temp/
|
||||
/custom_nodes/
|
||||
!custom_nodes/example_node.py.example
|
||||
extra_model_paths.yaml
|
||||
/.vs
|
||||
.idea/
|
||||
venv/
|
||||
venv/
|
||||
/web/extensions/*
|
||||
!/web/extensions/logging.js.example
|
||||
!/web/extensions/core/
|
||||
/tests-ui/data/object_info.json
|
||||
/user/
|
||||
@@ -11,7 +11,7 @@ This ui will let you design and execute advanced stable diffusion pipelines usin
|
||||
|
||||
## Features
|
||||
- Nodes/graph/flowchart interface to experiment and create complex Stable Diffusion workflows without needing to code anything.
|
||||
- Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/) and [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/)
|
||||
- Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/), [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/) and [Stable Cascade](https://comfyanonymous.github.io/ComfyUI_examples/stable_cascade/)
|
||||
- Asynchronous Queue system
|
||||
- Many optimizations: Only re-executes the parts of the workflow that changes between executions.
|
||||
- Command line option: ```--lowvram``` to make it work on GPUs with less than 3GB vram (enabled automatically on GPUs with low vram)
|
||||
|
||||
@@ -97,7 +97,7 @@ class CLIPTextModel_(torch.nn.Module):
|
||||
x = self.embeddings(input_tokens)
|
||||
mask = None
|
||||
if attention_mask is not None:
|
||||
mask = 1.0 - attention_mask.to(x.dtype).unsqueeze(1).unsqueeze(1).expand(attention_mask.shape[0], 1, attention_mask.shape[-1], attention_mask.shape[-1])
|
||||
mask = 1.0 - attention_mask.to(x.dtype).reshape((attention_mask.shape[0], 1, -1, attention_mask.shape[-1])).expand(attention_mask.shape[0], 1, attention_mask.shape[-1], attention_mask.shape[-1])
|
||||
mask = mask.masked_fill(mask.to(torch.bool), float("-inf"))
|
||||
|
||||
causal_mask = torch.empty(x.shape[1], x.shape[1], dtype=x.dtype, device=x.device).fill_(float("-inf")).triu_(1)
|
||||
|
||||
@@ -166,7 +166,7 @@ class ControlNet(ControlBase):
|
||||
if x_noisy.shape[0] != self.cond_hint.shape[0]:
|
||||
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
|
||||
|
||||
context = cond['c_crossattn']
|
||||
context = cond.get('crossattn_controlnet', cond['c_crossattn'])
|
||||
y = cond.get('y', None)
|
||||
if y is not None:
|
||||
y = y.to(dtype)
|
||||
@@ -318,9 +318,10 @@ def load_controlnet(ckpt_path, model=None):
|
||||
return ControlLora(controlnet_data)
|
||||
|
||||
controlnet_config = None
|
||||
supported_inference_dtypes = None
|
||||
|
||||
if "controlnet_cond_embedding.conv_in.weight" in controlnet_data: #diffusers format
|
||||
unet_dtype = comfy.model_management.unet_dtype()
|
||||
controlnet_config = comfy.model_detection.unet_config_from_diffusers_unet(controlnet_data, unet_dtype)
|
||||
controlnet_config = comfy.model_detection.unet_config_from_diffusers_unet(controlnet_data)
|
||||
diffusers_keys = comfy.utils.unet_to_diffusers(controlnet_config)
|
||||
diffusers_keys["controlnet_mid_block.weight"] = "middle_block_out.0.weight"
|
||||
diffusers_keys["controlnet_mid_block.bias"] = "middle_block_out.0.bias"
|
||||
@@ -380,12 +381,20 @@ def load_controlnet(ckpt_path, model=None):
|
||||
return net
|
||||
|
||||
if controlnet_config is None:
|
||||
unet_dtype = comfy.model_management.unet_dtype()
|
||||
controlnet_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, unet_dtype, True).unet_config
|
||||
model_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, True)
|
||||
supported_inference_dtypes = model_config.supported_inference_dtypes
|
||||
controlnet_config = model_config.unet_config
|
||||
|
||||
load_device = comfy.model_management.get_torch_device()
|
||||
if supported_inference_dtypes is None:
|
||||
unet_dtype = comfy.model_management.unet_dtype()
|
||||
else:
|
||||
unet_dtype = comfy.model_management.unet_dtype(supported_dtypes=supported_inference_dtypes)
|
||||
|
||||
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
|
||||
if manual_cast_dtype is not None:
|
||||
controlnet_config["operations"] = comfy.ops.manual_cast
|
||||
controlnet_config["dtype"] = unet_dtype
|
||||
controlnet_config.pop("out_channels")
|
||||
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
|
||||
control_model = comfy.cldm.cldm.ControlNet(**controlnet_config)
|
||||
|
||||
@@ -2,7 +2,8 @@ import torch
|
||||
from torch import nn
|
||||
from .ldm.modules.attention import CrossAttention
|
||||
from inspect import isfunction
|
||||
|
||||
import comfy.ops
|
||||
ops = comfy.ops.manual_cast
|
||||
|
||||
def exists(val):
|
||||
return val is not None
|
||||
@@ -22,7 +23,7 @@ def default(val, d):
|
||||
class GEGLU(nn.Module):
|
||||
def __init__(self, dim_in, dim_out):
|
||||
super().__init__()
|
||||
self.proj = nn.Linear(dim_in, dim_out * 2)
|
||||
self.proj = ops.Linear(dim_in, dim_out * 2)
|
||||
|
||||
def forward(self, x):
|
||||
x, gate = self.proj(x).chunk(2, dim=-1)
|
||||
@@ -35,14 +36,14 @@ class FeedForward(nn.Module):
|
||||
inner_dim = int(dim * mult)
|
||||
dim_out = default(dim_out, dim)
|
||||
project_in = nn.Sequential(
|
||||
nn.Linear(dim, inner_dim),
|
||||
ops.Linear(dim, inner_dim),
|
||||
nn.GELU()
|
||||
) if not glu else GEGLU(dim, inner_dim)
|
||||
|
||||
self.net = nn.Sequential(
|
||||
project_in,
|
||||
nn.Dropout(dropout),
|
||||
nn.Linear(inner_dim, dim_out)
|
||||
ops.Linear(inner_dim, dim_out)
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
@@ -57,11 +58,12 @@ class GatedCrossAttentionDense(nn.Module):
|
||||
query_dim=query_dim,
|
||||
context_dim=context_dim,
|
||||
heads=n_heads,
|
||||
dim_head=d_head)
|
||||
dim_head=d_head,
|
||||
operations=ops)
|
||||
self.ff = FeedForward(query_dim, glu=True)
|
||||
|
||||
self.norm1 = nn.LayerNorm(query_dim)
|
||||
self.norm2 = nn.LayerNorm(query_dim)
|
||||
self.norm1 = ops.LayerNorm(query_dim)
|
||||
self.norm2 = ops.LayerNorm(query_dim)
|
||||
|
||||
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
|
||||
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
|
||||
@@ -87,17 +89,18 @@ class GatedSelfAttentionDense(nn.Module):
|
||||
|
||||
# we need a linear projection since we need cat visual feature and obj
|
||||
# feature
|
||||
self.linear = nn.Linear(context_dim, query_dim)
|
||||
self.linear = ops.Linear(context_dim, query_dim)
|
||||
|
||||
self.attn = CrossAttention(
|
||||
query_dim=query_dim,
|
||||
context_dim=query_dim,
|
||||
heads=n_heads,
|
||||
dim_head=d_head)
|
||||
dim_head=d_head,
|
||||
operations=ops)
|
||||
self.ff = FeedForward(query_dim, glu=True)
|
||||
|
||||
self.norm1 = nn.LayerNorm(query_dim)
|
||||
self.norm2 = nn.LayerNorm(query_dim)
|
||||
self.norm1 = ops.LayerNorm(query_dim)
|
||||
self.norm2 = ops.LayerNorm(query_dim)
|
||||
|
||||
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
|
||||
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
|
||||
@@ -126,14 +129,14 @@ class GatedSelfAttentionDense2(nn.Module):
|
||||
|
||||
# we need a linear projection since we need cat visual feature and obj
|
||||
# feature
|
||||
self.linear = nn.Linear(context_dim, query_dim)
|
||||
self.linear = ops.Linear(context_dim, query_dim)
|
||||
|
||||
self.attn = CrossAttention(
|
||||
query_dim=query_dim, context_dim=query_dim, dim_head=d_head)
|
||||
query_dim=query_dim, context_dim=query_dim, dim_head=d_head, operations=ops)
|
||||
self.ff = FeedForward(query_dim, glu=True)
|
||||
|
||||
self.norm1 = nn.LayerNorm(query_dim)
|
||||
self.norm2 = nn.LayerNorm(query_dim)
|
||||
self.norm1 = ops.LayerNorm(query_dim)
|
||||
self.norm2 = ops.LayerNorm(query_dim)
|
||||
|
||||
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
|
||||
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
|
||||
@@ -201,11 +204,11 @@ class PositionNet(nn.Module):
|
||||
self.position_dim = fourier_freqs * 2 * 4 # 2 is sin&cos, 4 is xyxy
|
||||
|
||||
self.linears = nn.Sequential(
|
||||
nn.Linear(self.in_dim + self.position_dim, 512),
|
||||
ops.Linear(self.in_dim + self.position_dim, 512),
|
||||
nn.SiLU(),
|
||||
nn.Linear(512, 512),
|
||||
ops.Linear(512, 512),
|
||||
nn.SiLU(),
|
||||
nn.Linear(512, out_dim),
|
||||
ops.Linear(512, out_dim),
|
||||
)
|
||||
|
||||
self.null_positive_feature = torch.nn.Parameter(
|
||||
@@ -215,16 +218,15 @@ class PositionNet(nn.Module):
|
||||
|
||||
def forward(self, boxes, masks, positive_embeddings):
|
||||
B, N, _ = boxes.shape
|
||||
dtype = self.linears[0].weight.dtype
|
||||
masks = masks.unsqueeze(-1).to(dtype)
|
||||
positive_embeddings = positive_embeddings.to(dtype)
|
||||
masks = masks.unsqueeze(-1)
|
||||
positive_embeddings = positive_embeddings
|
||||
|
||||
# embedding position (it may includes padding as placeholder)
|
||||
xyxy_embedding = self.fourier_embedder(boxes.to(dtype)) # B*N*4 --> B*N*C
|
||||
xyxy_embedding = self.fourier_embedder(boxes) # B*N*4 --> B*N*C
|
||||
|
||||
# learnable null embedding
|
||||
positive_null = self.null_positive_feature.view(1, 1, -1)
|
||||
xyxy_null = self.null_position_feature.view(1, 1, -1)
|
||||
positive_null = self.null_positive_feature.to(device=boxes.device, dtype=boxes.dtype).view(1, 1, -1)
|
||||
xyxy_null = self.null_position_feature.to(device=boxes.device, dtype=boxes.dtype).view(1, 1, -1)
|
||||
|
||||
# replace padding with learnable null embedding
|
||||
positive_embeddings = positive_embeddings * \
|
||||
@@ -251,7 +253,7 @@ class Gligen(nn.Module):
|
||||
def func(x, extra_options):
|
||||
key = extra_options["transformer_index"]
|
||||
module = self.module_list[key]
|
||||
return module(x, objs)
|
||||
return module(x, objs.to(device=x.device, dtype=x.dtype))
|
||||
return func
|
||||
|
||||
def set_position(self, latent_image_shape, position_params, device):
|
||||
|
||||
@@ -37,3 +37,11 @@ class SDXL(LatentFormat):
|
||||
class SD_X4(LatentFormat):
|
||||
def __init__(self):
|
||||
self.scale_factor = 0.08333
|
||||
|
||||
class SC_Prior(LatentFormat):
|
||||
def __init__(self):
|
||||
self.scale_factor = 1.0
|
||||
|
||||
class SC_B(LatentFormat):
|
||||
def __init__(self):
|
||||
self.scale_factor = 1.0
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
from comfy.ldm.modules.attention import optimized_attention
|
||||
|
||||
class Linear(torch.nn.Linear):
|
||||
def reset_parameters(self):
|
||||
return None
|
||||
|
||||
class Conv2d(torch.nn.Conv2d):
|
||||
def reset_parameters(self):
|
||||
return None
|
||||
|
||||
class OptimizedAttention(nn.Module):
|
||||
def __init__(self, c, nhead, dropout=0.0, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.heads = nhead
|
||||
|
||||
self.to_q = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
|
||||
self.to_k = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
|
||||
self.to_v = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
|
||||
|
||||
self.out_proj = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
|
||||
|
||||
def forward(self, q, k, v):
|
||||
q = self.to_q(q)
|
||||
k = self.to_k(k)
|
||||
v = self.to_v(v)
|
||||
|
||||
out = optimized_attention(q, k, v, self.heads)
|
||||
|
||||
return self.out_proj(out)
|
||||
|
||||
class Attention2D(nn.Module):
|
||||
def __init__(self, c, nhead, dropout=0.0, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.attn = OptimizedAttention(c, nhead, dtype=dtype, device=device, operations=operations)
|
||||
# self.attn = nn.MultiheadAttention(c, nhead, dropout=dropout, bias=True, batch_first=True, dtype=dtype, device=device)
|
||||
|
||||
def forward(self, x, kv, self_attn=False):
|
||||
orig_shape = x.shape
|
||||
x = x.view(x.size(0), x.size(1), -1).permute(0, 2, 1) # Bx4xHxW -> Bx(HxW)x4
|
||||
if self_attn:
|
||||
kv = torch.cat([x, kv], dim=1)
|
||||
# x = self.attn(x, kv, kv, need_weights=False)[0]
|
||||
x = self.attn(x, kv, kv)
|
||||
x = x.permute(0, 2, 1).view(*orig_shape)
|
||||
return x
|
||||
|
||||
|
||||
def LayerNorm2d_op(operations):
|
||||
class LayerNorm2d(operations.LayerNorm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def forward(self, x):
|
||||
return super().forward(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
|
||||
return LayerNorm2d
|
||||
|
||||
class GlobalResponseNorm(nn.Module):
|
||||
"from https://github.com/facebookresearch/ConvNeXt-V2/blob/3608f67cc1dae164790c5d0aead7bf2d73d9719b/models/utils.py#L105"
|
||||
def __init__(self, dim, dtype=None, device=None):
|
||||
super().__init__()
|
||||
self.gamma = nn.Parameter(torch.zeros(1, 1, 1, dim, dtype=dtype, device=device))
|
||||
self.beta = nn.Parameter(torch.zeros(1, 1, 1, dim, dtype=dtype, device=device))
|
||||
|
||||
def forward(self, x):
|
||||
Gx = torch.norm(x, p=2, dim=(1, 2), keepdim=True)
|
||||
Nx = Gx / (Gx.mean(dim=-1, keepdim=True) + 1e-6)
|
||||
return self.gamma.to(device=x.device, dtype=x.dtype) * (x * Nx) + self.beta.to(device=x.device, dtype=x.dtype) + x
|
||||
|
||||
|
||||
class ResBlock(nn.Module):
|
||||
def __init__(self, c, c_skip=0, kernel_size=3, dropout=0.0, dtype=None, device=None, operations=None): # , num_heads=4, expansion=2):
|
||||
super().__init__()
|
||||
self.depthwise = operations.Conv2d(c, c, kernel_size=kernel_size, padding=kernel_size // 2, groups=c, dtype=dtype, device=device)
|
||||
# self.depthwise = SAMBlock(c, num_heads, expansion)
|
||||
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
self.channelwise = nn.Sequential(
|
||||
operations.Linear(c + c_skip, c * 4, dtype=dtype, device=device),
|
||||
nn.GELU(),
|
||||
GlobalResponseNorm(c * 4, dtype=dtype, device=device),
|
||||
nn.Dropout(dropout),
|
||||
operations.Linear(c * 4, c, dtype=dtype, device=device)
|
||||
)
|
||||
|
||||
def forward(self, x, x_skip=None):
|
||||
x_res = x
|
||||
x = self.norm(self.depthwise(x))
|
||||
if x_skip is not None:
|
||||
x = torch.cat([x, x_skip], dim=1)
|
||||
x = self.channelwise(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
|
||||
return x + x_res
|
||||
|
||||
|
||||
class AttnBlock(nn.Module):
|
||||
def __init__(self, c, c_cond, nhead, self_attn=True, dropout=0.0, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.self_attn = self_attn
|
||||
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
self.attention = Attention2D(c, nhead, dropout, dtype=dtype, device=device, operations=operations)
|
||||
self.kv_mapper = nn.Sequential(
|
||||
nn.SiLU(),
|
||||
operations.Linear(c_cond, c, dtype=dtype, device=device)
|
||||
)
|
||||
|
||||
def forward(self, x, kv):
|
||||
kv = self.kv_mapper(kv)
|
||||
x = x + self.attention(self.norm(x), kv, self_attn=self.self_attn)
|
||||
return x
|
||||
|
||||
|
||||
class FeedForwardBlock(nn.Module):
|
||||
def __init__(self, c, dropout=0.0, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
self.channelwise = nn.Sequential(
|
||||
operations.Linear(c, c * 4, dtype=dtype, device=device),
|
||||
nn.GELU(),
|
||||
GlobalResponseNorm(c * 4, dtype=dtype, device=device),
|
||||
nn.Dropout(dropout),
|
||||
operations.Linear(c * 4, c, dtype=dtype, device=device)
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
x = x + self.channelwise(self.norm(x).permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
|
||||
return x
|
||||
|
||||
|
||||
class TimestepBlock(nn.Module):
|
||||
def __init__(self, c, c_timestep, conds=['sca'], dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.mapper = operations.Linear(c_timestep, c * 2, dtype=dtype, device=device)
|
||||
self.conds = conds
|
||||
for cname in conds:
|
||||
setattr(self, f"mapper_{cname}", operations.Linear(c_timestep, c * 2, dtype=dtype, device=device))
|
||||
|
||||
def forward(self, x, t):
|
||||
t = t.chunk(len(self.conds) + 1, dim=1)
|
||||
a, b = self.mapper(t[0])[:, :, None, None].chunk(2, dim=1)
|
||||
for i, c in enumerate(self.conds):
|
||||
ac, bc = getattr(self, f"mapper_{c}")(t[i + 1])[:, :, None, None].chunk(2, dim=1)
|
||||
a, b = a + ac, b + bc
|
||||
return x * (1 + a) + b
|
||||
@@ -0,0 +1,258 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import torch
|
||||
from torch import nn
|
||||
from torch.autograd import Function
|
||||
|
||||
class vector_quantize(Function):
|
||||
@staticmethod
|
||||
def forward(ctx, x, codebook):
|
||||
with torch.no_grad():
|
||||
codebook_sqr = torch.sum(codebook ** 2, dim=1)
|
||||
x_sqr = torch.sum(x ** 2, dim=1, keepdim=True)
|
||||
|
||||
dist = torch.addmm(codebook_sqr + x_sqr, x, codebook.t(), alpha=-2.0, beta=1.0)
|
||||
_, indices = dist.min(dim=1)
|
||||
|
||||
ctx.save_for_backward(indices, codebook)
|
||||
ctx.mark_non_differentiable(indices)
|
||||
|
||||
nn = torch.index_select(codebook, 0, indices)
|
||||
return nn, indices
|
||||
|
||||
@staticmethod
|
||||
def backward(ctx, grad_output, grad_indices):
|
||||
grad_inputs, grad_codebook = None, None
|
||||
|
||||
if ctx.needs_input_grad[0]:
|
||||
grad_inputs = grad_output.clone()
|
||||
if ctx.needs_input_grad[1]:
|
||||
# Gradient wrt. the codebook
|
||||
indices, codebook = ctx.saved_tensors
|
||||
|
||||
grad_codebook = torch.zeros_like(codebook)
|
||||
grad_codebook.index_add_(0, indices, grad_output)
|
||||
|
||||
return (grad_inputs, grad_codebook)
|
||||
|
||||
|
||||
class VectorQuantize(nn.Module):
|
||||
def __init__(self, embedding_size, k, ema_decay=0.99, ema_loss=False):
|
||||
"""
|
||||
Takes an input of variable size (as long as the last dimension matches the embedding size).
|
||||
Returns one tensor containing the nearest neigbour embeddings to each of the inputs,
|
||||
with the same size as the input, vq and commitment components for the loss as a touple
|
||||
in the second output and the indices of the quantized vectors in the third:
|
||||
quantized, (vq_loss, commit_loss), indices
|
||||
"""
|
||||
super(VectorQuantize, self).__init__()
|
||||
|
||||
self.codebook = nn.Embedding(k, embedding_size)
|
||||
self.codebook.weight.data.uniform_(-1./k, 1./k)
|
||||
self.vq = vector_quantize.apply
|
||||
|
||||
self.ema_decay = ema_decay
|
||||
self.ema_loss = ema_loss
|
||||
if ema_loss:
|
||||
self.register_buffer('ema_element_count', torch.ones(k))
|
||||
self.register_buffer('ema_weight_sum', torch.zeros_like(self.codebook.weight))
|
||||
|
||||
def _laplace_smoothing(self, x, epsilon):
|
||||
n = torch.sum(x)
|
||||
return ((x + epsilon) / (n + x.size(0) * epsilon) * n)
|
||||
|
||||
def _updateEMA(self, z_e_x, indices):
|
||||
mask = nn.functional.one_hot(indices, self.ema_element_count.size(0)).float()
|
||||
elem_count = mask.sum(dim=0)
|
||||
weight_sum = torch.mm(mask.t(), z_e_x)
|
||||
|
||||
self.ema_element_count = (self.ema_decay * self.ema_element_count) + ((1-self.ema_decay) * elem_count)
|
||||
self.ema_element_count = self._laplace_smoothing(self.ema_element_count, 1e-5)
|
||||
self.ema_weight_sum = (self.ema_decay * self.ema_weight_sum) + ((1-self.ema_decay) * weight_sum)
|
||||
|
||||
self.codebook.weight.data = self.ema_weight_sum / self.ema_element_count.unsqueeze(-1)
|
||||
|
||||
def idx2vq(self, idx, dim=-1):
|
||||
q_idx = self.codebook(idx)
|
||||
if dim != -1:
|
||||
q_idx = q_idx.movedim(-1, dim)
|
||||
return q_idx
|
||||
|
||||
def forward(self, x, get_losses=True, dim=-1):
|
||||
if dim != -1:
|
||||
x = x.movedim(dim, -1)
|
||||
z_e_x = x.contiguous().view(-1, x.size(-1)) if len(x.shape) > 2 else x
|
||||
z_q_x, indices = self.vq(z_e_x, self.codebook.weight.detach())
|
||||
vq_loss, commit_loss = None, None
|
||||
if self.ema_loss and self.training:
|
||||
self._updateEMA(z_e_x.detach(), indices.detach())
|
||||
# pick the graded embeddings after updating the codebook in order to have a more accurate commitment loss
|
||||
z_q_x_grd = torch.index_select(self.codebook.weight, dim=0, index=indices)
|
||||
if get_losses:
|
||||
vq_loss = (z_q_x_grd - z_e_x.detach()).pow(2).mean()
|
||||
commit_loss = (z_e_x - z_q_x_grd.detach()).pow(2).mean()
|
||||
|
||||
z_q_x = z_q_x.view(x.shape)
|
||||
if dim != -1:
|
||||
z_q_x = z_q_x.movedim(-1, dim)
|
||||
return z_q_x, (vq_loss, commit_loss), indices.view(x.shape[:-1])
|
||||
|
||||
|
||||
class ResBlock(nn.Module):
|
||||
def __init__(self, c, c_hidden):
|
||||
super().__init__()
|
||||
# depthwise/attention
|
||||
self.norm1 = nn.LayerNorm(c, elementwise_affine=False, eps=1e-6)
|
||||
self.depthwise = nn.Sequential(
|
||||
nn.ReplicationPad2d(1),
|
||||
nn.Conv2d(c, c, kernel_size=3, groups=c)
|
||||
)
|
||||
|
||||
# channelwise
|
||||
self.norm2 = nn.LayerNorm(c, elementwise_affine=False, eps=1e-6)
|
||||
self.channelwise = nn.Sequential(
|
||||
nn.Linear(c, c_hidden),
|
||||
nn.GELU(),
|
||||
nn.Linear(c_hidden, c),
|
||||
)
|
||||
|
||||
self.gammas = nn.Parameter(torch.zeros(6), requires_grad=True)
|
||||
|
||||
# Init weights
|
||||
def _basic_init(module):
|
||||
if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d):
|
||||
torch.nn.init.xavier_uniform_(module.weight)
|
||||
if module.bias is not None:
|
||||
nn.init.constant_(module.bias, 0)
|
||||
|
||||
self.apply(_basic_init)
|
||||
|
||||
def _norm(self, x, norm):
|
||||
return norm(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
|
||||
|
||||
def forward(self, x):
|
||||
mods = self.gammas
|
||||
|
||||
x_temp = self._norm(x, self.norm1) * (1 + mods[0]) + mods[1]
|
||||
try:
|
||||
x = x + self.depthwise(x_temp) * mods[2]
|
||||
except: #operation not implemented for bf16
|
||||
x_temp = self.depthwise[0](x_temp.float()).to(x.dtype)
|
||||
x = x + self.depthwise[1](x_temp) * mods[2]
|
||||
|
||||
x_temp = self._norm(x, self.norm2) * (1 + mods[3]) + mods[4]
|
||||
x = x + self.channelwise(x_temp.permute(0, 2, 3, 1)).permute(0, 3, 1, 2) * mods[5]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class StageA(nn.Module):
|
||||
def __init__(self, levels=2, bottleneck_blocks=12, c_hidden=384, c_latent=4, codebook_size=8192,
|
||||
scale_factor=0.43): # 0.3764
|
||||
super().__init__()
|
||||
self.c_latent = c_latent
|
||||
self.scale_factor = scale_factor
|
||||
c_levels = [c_hidden // (2 ** i) for i in reversed(range(levels))]
|
||||
|
||||
# Encoder blocks
|
||||
self.in_block = nn.Sequential(
|
||||
nn.PixelUnshuffle(2),
|
||||
nn.Conv2d(3 * 4, c_levels[0], kernel_size=1)
|
||||
)
|
||||
down_blocks = []
|
||||
for i in range(levels):
|
||||
if i > 0:
|
||||
down_blocks.append(nn.Conv2d(c_levels[i - 1], c_levels[i], kernel_size=4, stride=2, padding=1))
|
||||
block = ResBlock(c_levels[i], c_levels[i] * 4)
|
||||
down_blocks.append(block)
|
||||
down_blocks.append(nn.Sequential(
|
||||
nn.Conv2d(c_levels[-1], c_latent, kernel_size=1, bias=False),
|
||||
nn.BatchNorm2d(c_latent), # then normalize them to have mean 0 and std 1
|
||||
))
|
||||
self.down_blocks = nn.Sequential(*down_blocks)
|
||||
self.down_blocks[0]
|
||||
|
||||
self.codebook_size = codebook_size
|
||||
self.vquantizer = VectorQuantize(c_latent, k=codebook_size)
|
||||
|
||||
# Decoder blocks
|
||||
up_blocks = [nn.Sequential(
|
||||
nn.Conv2d(c_latent, c_levels[-1], kernel_size=1)
|
||||
)]
|
||||
for i in range(levels):
|
||||
for j in range(bottleneck_blocks if i == 0 else 1):
|
||||
block = ResBlock(c_levels[levels - 1 - i], c_levels[levels - 1 - i] * 4)
|
||||
up_blocks.append(block)
|
||||
if i < levels - 1:
|
||||
up_blocks.append(
|
||||
nn.ConvTranspose2d(c_levels[levels - 1 - i], c_levels[levels - 2 - i], kernel_size=4, stride=2,
|
||||
padding=1))
|
||||
self.up_blocks = nn.Sequential(*up_blocks)
|
||||
self.out_block = nn.Sequential(
|
||||
nn.Conv2d(c_levels[0], 3 * 4, kernel_size=1),
|
||||
nn.PixelShuffle(2),
|
||||
)
|
||||
|
||||
def encode(self, x, quantize=False):
|
||||
x = self.in_block(x)
|
||||
x = self.down_blocks(x)
|
||||
if quantize:
|
||||
qe, (vq_loss, commit_loss), indices = self.vquantizer.forward(x, dim=1)
|
||||
return qe / self.scale_factor, x / self.scale_factor, indices, vq_loss + commit_loss * 0.25
|
||||
else:
|
||||
return x / self.scale_factor
|
||||
|
||||
def decode(self, x):
|
||||
x = x * self.scale_factor
|
||||
x = self.up_blocks(x)
|
||||
x = self.out_block(x)
|
||||
return x
|
||||
|
||||
def forward(self, x, quantize=False):
|
||||
qe, x, _, vq_loss = self.encode(x, quantize)
|
||||
x = self.decode(qe)
|
||||
return x, vq_loss
|
||||
|
||||
|
||||
class Discriminator(nn.Module):
|
||||
def __init__(self, c_in=3, c_cond=0, c_hidden=512, depth=6):
|
||||
super().__init__()
|
||||
d = max(depth - 3, 3)
|
||||
layers = [
|
||||
nn.utils.spectral_norm(nn.Conv2d(c_in, c_hidden // (2 ** d), kernel_size=3, stride=2, padding=1)),
|
||||
nn.LeakyReLU(0.2),
|
||||
]
|
||||
for i in range(depth - 1):
|
||||
c_in = c_hidden // (2 ** max((d - i), 0))
|
||||
c_out = c_hidden // (2 ** max((d - 1 - i), 0))
|
||||
layers.append(nn.utils.spectral_norm(nn.Conv2d(c_in, c_out, kernel_size=3, stride=2, padding=1)))
|
||||
layers.append(nn.InstanceNorm2d(c_out))
|
||||
layers.append(nn.LeakyReLU(0.2))
|
||||
self.encoder = nn.Sequential(*layers)
|
||||
self.shuffle = nn.Conv2d((c_hidden + c_cond) if c_cond > 0 else c_hidden, 1, kernel_size=1)
|
||||
self.logits = nn.Sigmoid()
|
||||
|
||||
def forward(self, x, cond=None):
|
||||
x = self.encoder(x)
|
||||
if cond is not None:
|
||||
cond = cond.view(cond.size(0), cond.size(1), 1, 1, ).expand(-1, -1, x.size(-2), x.size(-1))
|
||||
x = torch.cat([x, cond], dim=1)
|
||||
x = self.shuffle(x)
|
||||
x = self.logits(x)
|
||||
return x
|
||||
@@ -0,0 +1,257 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import math
|
||||
import numpy as np
|
||||
import torch
|
||||
from torch import nn
|
||||
from .common import AttnBlock, LayerNorm2d_op, ResBlock, FeedForwardBlock, TimestepBlock
|
||||
|
||||
class StageB(nn.Module):
|
||||
def __init__(self, c_in=4, c_out=4, c_r=64, patch_size=2, c_cond=1280, c_hidden=[320, 640, 1280, 1280],
|
||||
nhead=[-1, -1, 20, 20], blocks=[[2, 6, 28, 6], [6, 28, 6, 2]],
|
||||
block_repeat=[[1, 1, 1, 1], [3, 3, 2, 2]], level_config=['CT', 'CT', 'CTA', 'CTA'], c_clip=1280,
|
||||
c_clip_seq=4, c_effnet=16, c_pixels=3, kernel_size=3, dropout=[0, 0, 0.0, 0.0], self_attn=True,
|
||||
t_conds=['sca'], stable_cascade_stage=None, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.dtype = dtype
|
||||
self.c_r = c_r
|
||||
self.t_conds = t_conds
|
||||
self.c_clip_seq = c_clip_seq
|
||||
if not isinstance(dropout, list):
|
||||
dropout = [dropout] * len(c_hidden)
|
||||
if not isinstance(self_attn, list):
|
||||
self_attn = [self_attn] * len(c_hidden)
|
||||
|
||||
# CONDITIONING
|
||||
self.effnet_mapper = nn.Sequential(
|
||||
operations.Conv2d(c_effnet, c_hidden[0] * 4, kernel_size=1, dtype=dtype, device=device),
|
||||
nn.GELU(),
|
||||
operations.Conv2d(c_hidden[0] * 4, c_hidden[0], kernel_size=1, dtype=dtype, device=device),
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
)
|
||||
self.pixels_mapper = nn.Sequential(
|
||||
operations.Conv2d(c_pixels, c_hidden[0] * 4, kernel_size=1, dtype=dtype, device=device),
|
||||
nn.GELU(),
|
||||
operations.Conv2d(c_hidden[0] * 4, c_hidden[0], kernel_size=1, dtype=dtype, device=device),
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
)
|
||||
self.clip_mapper = operations.Linear(c_clip, c_cond * c_clip_seq, dtype=dtype, device=device)
|
||||
self.clip_norm = operations.LayerNorm(c_cond, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
|
||||
self.embedding = nn.Sequential(
|
||||
nn.PixelUnshuffle(patch_size),
|
||||
operations.Conv2d(c_in * (patch_size ** 2), c_hidden[0], kernel_size=1, dtype=dtype, device=device),
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
)
|
||||
|
||||
def get_block(block_type, c_hidden, nhead, c_skip=0, dropout=0, self_attn=True):
|
||||
if block_type == 'C':
|
||||
return ResBlock(c_hidden, c_skip, kernel_size=kernel_size, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'A':
|
||||
return AttnBlock(c_hidden, c_cond, nhead, self_attn=self_attn, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'F':
|
||||
return FeedForwardBlock(c_hidden, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'T':
|
||||
return TimestepBlock(c_hidden, c_r, conds=t_conds, dtype=dtype, device=device, operations=operations)
|
||||
else:
|
||||
raise Exception(f'Block type {block_type} not supported')
|
||||
|
||||
# BLOCKS
|
||||
# -- down blocks
|
||||
self.down_blocks = nn.ModuleList()
|
||||
self.down_downscalers = nn.ModuleList()
|
||||
self.down_repeat_mappers = nn.ModuleList()
|
||||
for i in range(len(c_hidden)):
|
||||
if i > 0:
|
||||
self.down_downscalers.append(nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[i - 1], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
|
||||
operations.Conv2d(c_hidden[i - 1], c_hidden[i], kernel_size=2, stride=2, dtype=dtype, device=device),
|
||||
))
|
||||
else:
|
||||
self.down_downscalers.append(nn.Identity())
|
||||
down_block = nn.ModuleList()
|
||||
for _ in range(blocks[0][i]):
|
||||
for block_type in level_config[i]:
|
||||
block = get_block(block_type, c_hidden[i], nhead[i], dropout=dropout[i], self_attn=self_attn[i])
|
||||
down_block.append(block)
|
||||
self.down_blocks.append(down_block)
|
||||
if block_repeat is not None:
|
||||
block_repeat_mappers = nn.ModuleList()
|
||||
for _ in range(block_repeat[0][i] - 1):
|
||||
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
|
||||
self.down_repeat_mappers.append(block_repeat_mappers)
|
||||
|
||||
# -- up blocks
|
||||
self.up_blocks = nn.ModuleList()
|
||||
self.up_upscalers = nn.ModuleList()
|
||||
self.up_repeat_mappers = nn.ModuleList()
|
||||
for i in reversed(range(len(c_hidden))):
|
||||
if i > 0:
|
||||
self.up_upscalers.append(nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[i], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
|
||||
operations.ConvTranspose2d(c_hidden[i], c_hidden[i - 1], kernel_size=2, stride=2, dtype=dtype, device=device),
|
||||
))
|
||||
else:
|
||||
self.up_upscalers.append(nn.Identity())
|
||||
up_block = nn.ModuleList()
|
||||
for j in range(blocks[1][::-1][i]):
|
||||
for k, block_type in enumerate(level_config[i]):
|
||||
c_skip = c_hidden[i] if i < len(c_hidden) - 1 and j == k == 0 else 0
|
||||
block = get_block(block_type, c_hidden[i], nhead[i], c_skip=c_skip, dropout=dropout[i],
|
||||
self_attn=self_attn[i])
|
||||
up_block.append(block)
|
||||
self.up_blocks.append(up_block)
|
||||
if block_repeat is not None:
|
||||
block_repeat_mappers = nn.ModuleList()
|
||||
for _ in range(block_repeat[1][::-1][i] - 1):
|
||||
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
|
||||
self.up_repeat_mappers.append(block_repeat_mappers)
|
||||
|
||||
# OUTPUT
|
||||
self.clf = nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
|
||||
operations.Conv2d(c_hidden[0], c_out * (patch_size ** 2), kernel_size=1, dtype=dtype, device=device),
|
||||
nn.PixelShuffle(patch_size),
|
||||
)
|
||||
|
||||
# --- WEIGHT INIT ---
|
||||
# self.apply(self._init_weights) # General init
|
||||
# nn.init.normal_(self.clip_mapper.weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.effnet_mapper[0].weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.effnet_mapper[2].weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.pixels_mapper[0].weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.pixels_mapper[2].weight, std=0.02) # conditionings
|
||||
# torch.nn.init.xavier_uniform_(self.embedding[1].weight, 0.02) # inputs
|
||||
# nn.init.constant_(self.clf[1].weight, 0) # outputs
|
||||
#
|
||||
# # blocks
|
||||
# for level_block in self.down_blocks + self.up_blocks:
|
||||
# for block in level_block:
|
||||
# if isinstance(block, ResBlock) or isinstance(block, FeedForwardBlock):
|
||||
# block.channelwise[-1].weight.data *= np.sqrt(1 / sum(blocks[0]))
|
||||
# elif isinstance(block, TimestepBlock):
|
||||
# for layer in block.modules():
|
||||
# if isinstance(layer, nn.Linear):
|
||||
# nn.init.constant_(layer.weight, 0)
|
||||
#
|
||||
# def _init_weights(self, m):
|
||||
# if isinstance(m, (nn.Conv2d, nn.Linear)):
|
||||
# torch.nn.init.xavier_uniform_(m.weight)
|
||||
# if m.bias is not None:
|
||||
# nn.init.constant_(m.bias, 0)
|
||||
|
||||
def gen_r_embedding(self, r, max_positions=10000):
|
||||
r = r * max_positions
|
||||
half_dim = self.c_r // 2
|
||||
emb = math.log(max_positions) / (half_dim - 1)
|
||||
emb = torch.arange(half_dim, device=r.device).float().mul(-emb).exp()
|
||||
emb = r[:, None] * emb[None, :]
|
||||
emb = torch.cat([emb.sin(), emb.cos()], dim=1)
|
||||
if self.c_r % 2 == 1: # zero pad
|
||||
emb = nn.functional.pad(emb, (0, 1), mode='constant')
|
||||
return emb
|
||||
|
||||
def gen_c_embeddings(self, clip):
|
||||
if len(clip.shape) == 2:
|
||||
clip = clip.unsqueeze(1)
|
||||
clip = self.clip_mapper(clip).view(clip.size(0), clip.size(1) * self.c_clip_seq, -1)
|
||||
clip = self.clip_norm(clip)
|
||||
return clip
|
||||
|
||||
def _down_encode(self, x, r_embed, clip):
|
||||
level_outputs = []
|
||||
block_group = zip(self.down_blocks, self.down_downscalers, self.down_repeat_mappers)
|
||||
for down_block, downscaler, repmap in block_group:
|
||||
x = downscaler(x)
|
||||
for i in range(len(repmap) + 1):
|
||||
for block in down_block:
|
||||
if isinstance(block, ResBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
ResBlock)):
|
||||
x = block(x)
|
||||
elif isinstance(block, AttnBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
AttnBlock)):
|
||||
x = block(x, clip)
|
||||
elif isinstance(block, TimestepBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
TimestepBlock)):
|
||||
x = block(x, r_embed)
|
||||
else:
|
||||
x = block(x)
|
||||
if i < len(repmap):
|
||||
x = repmap[i](x)
|
||||
level_outputs.insert(0, x)
|
||||
return level_outputs
|
||||
|
||||
def _up_decode(self, level_outputs, r_embed, clip):
|
||||
x = level_outputs[0]
|
||||
block_group = zip(self.up_blocks, self.up_upscalers, self.up_repeat_mappers)
|
||||
for i, (up_block, upscaler, repmap) in enumerate(block_group):
|
||||
for j in range(len(repmap) + 1):
|
||||
for k, block in enumerate(up_block):
|
||||
if isinstance(block, ResBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
ResBlock)):
|
||||
skip = level_outputs[i] if k == 0 and i > 0 else None
|
||||
if skip is not None and (x.size(-1) != skip.size(-1) or x.size(-2) != skip.size(-2)):
|
||||
x = torch.nn.functional.interpolate(x, skip.shape[-2:], mode='bilinear',
|
||||
align_corners=True)
|
||||
x = block(x, skip)
|
||||
elif isinstance(block, AttnBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
AttnBlock)):
|
||||
x = block(x, clip)
|
||||
elif isinstance(block, TimestepBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
TimestepBlock)):
|
||||
x = block(x, r_embed)
|
||||
else:
|
||||
x = block(x)
|
||||
if j < len(repmap):
|
||||
x = repmap[j](x)
|
||||
x = upscaler(x)
|
||||
return x
|
||||
|
||||
def forward(self, x, r, effnet, clip, pixels=None, **kwargs):
|
||||
if pixels is None:
|
||||
pixels = x.new_zeros(x.size(0), 3, 8, 8)
|
||||
|
||||
# Process the conditioning embeddings
|
||||
r_embed = self.gen_r_embedding(r).to(dtype=x.dtype)
|
||||
for c in self.t_conds:
|
||||
t_cond = kwargs.get(c, torch.zeros_like(r))
|
||||
r_embed = torch.cat([r_embed, self.gen_r_embedding(t_cond).to(dtype=x.dtype)], dim=1)
|
||||
clip = self.gen_c_embeddings(clip)
|
||||
|
||||
# Model Blocks
|
||||
x = self.embedding(x)
|
||||
x = x + self.effnet_mapper(
|
||||
nn.functional.interpolate(effnet, size=x.shape[-2:], mode='bilinear', align_corners=True))
|
||||
x = x + nn.functional.interpolate(self.pixels_mapper(pixels), size=x.shape[-2:], mode='bilinear',
|
||||
align_corners=True)
|
||||
level_outputs = self._down_encode(x, r_embed, clip)
|
||||
x = self._up_decode(level_outputs, r_embed, clip)
|
||||
return self.clf(x)
|
||||
|
||||
def update_weights_ema(self, src_model, beta=0.999):
|
||||
for self_params, src_params in zip(self.parameters(), src_model.parameters()):
|
||||
self_params.data = self_params.data * beta + src_params.data.clone().to(self_params.device) * (1 - beta)
|
||||
for self_buffers, src_buffers in zip(self.buffers(), src_model.buffers()):
|
||||
self_buffers.data = self_buffers.data * beta + src_buffers.data.clone().to(self_buffers.device) * (1 - beta)
|
||||
@@ -0,0 +1,271 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import torch
|
||||
from torch import nn
|
||||
import numpy as np
|
||||
import math
|
||||
from .common import AttnBlock, LayerNorm2d_op, ResBlock, FeedForwardBlock, TimestepBlock
|
||||
# from .controlnet import ControlNetDeliverer
|
||||
|
||||
class UpDownBlock2d(nn.Module):
|
||||
def __init__(self, c_in, c_out, mode, enabled=True, dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
assert mode in ['up', 'down']
|
||||
interpolation = nn.Upsample(scale_factor=2 if mode == 'up' else 0.5, mode='bilinear',
|
||||
align_corners=True) if enabled else nn.Identity()
|
||||
mapping = operations.Conv2d(c_in, c_out, kernel_size=1, dtype=dtype, device=device)
|
||||
self.blocks = nn.ModuleList([interpolation, mapping] if mode == 'up' else [mapping, interpolation])
|
||||
|
||||
def forward(self, x):
|
||||
for block in self.blocks:
|
||||
x = block(x)
|
||||
return x
|
||||
|
||||
|
||||
class StageC(nn.Module):
|
||||
def __init__(self, c_in=16, c_out=16, c_r=64, patch_size=1, c_cond=2048, c_hidden=[2048, 2048], nhead=[32, 32],
|
||||
blocks=[[8, 24], [24, 8]], block_repeat=[[1, 1], [1, 1]], level_config=['CTA', 'CTA'],
|
||||
c_clip_text=1280, c_clip_text_pooled=1280, c_clip_img=768, c_clip_seq=4, kernel_size=3,
|
||||
dropout=[0.0, 0.0], self_attn=True, t_conds=['sca', 'crp'], switch_level=[False], stable_cascade_stage=None,
|
||||
dtype=None, device=None, operations=None):
|
||||
super().__init__()
|
||||
self.dtype = dtype
|
||||
self.c_r = c_r
|
||||
self.t_conds = t_conds
|
||||
self.c_clip_seq = c_clip_seq
|
||||
if not isinstance(dropout, list):
|
||||
dropout = [dropout] * len(c_hidden)
|
||||
if not isinstance(self_attn, list):
|
||||
self_attn = [self_attn] * len(c_hidden)
|
||||
|
||||
# CONDITIONING
|
||||
self.clip_txt_mapper = operations.Linear(c_clip_text, c_cond, dtype=dtype, device=device)
|
||||
self.clip_txt_pooled_mapper = operations.Linear(c_clip_text_pooled, c_cond * c_clip_seq, dtype=dtype, device=device)
|
||||
self.clip_img_mapper = operations.Linear(c_clip_img, c_cond * c_clip_seq, dtype=dtype, device=device)
|
||||
self.clip_norm = operations.LayerNorm(c_cond, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
|
||||
|
||||
self.embedding = nn.Sequential(
|
||||
nn.PixelUnshuffle(patch_size),
|
||||
operations.Conv2d(c_in * (patch_size ** 2), c_hidden[0], kernel_size=1, dtype=dtype, device=device),
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6)
|
||||
)
|
||||
|
||||
def get_block(block_type, c_hidden, nhead, c_skip=0, dropout=0, self_attn=True):
|
||||
if block_type == 'C':
|
||||
return ResBlock(c_hidden, c_skip, kernel_size=kernel_size, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'A':
|
||||
return AttnBlock(c_hidden, c_cond, nhead, self_attn=self_attn, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'F':
|
||||
return FeedForwardBlock(c_hidden, dropout=dropout, dtype=dtype, device=device, operations=operations)
|
||||
elif block_type == 'T':
|
||||
return TimestepBlock(c_hidden, c_r, conds=t_conds, dtype=dtype, device=device, operations=operations)
|
||||
else:
|
||||
raise Exception(f'Block type {block_type} not supported')
|
||||
|
||||
# BLOCKS
|
||||
# -- down blocks
|
||||
self.down_blocks = nn.ModuleList()
|
||||
self.down_downscalers = nn.ModuleList()
|
||||
self.down_repeat_mappers = nn.ModuleList()
|
||||
for i in range(len(c_hidden)):
|
||||
if i > 0:
|
||||
self.down_downscalers.append(nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[i - 1], elementwise_affine=False, eps=1e-6),
|
||||
UpDownBlock2d(c_hidden[i - 1], c_hidden[i], mode='down', enabled=switch_level[i - 1], dtype=dtype, device=device, operations=operations)
|
||||
))
|
||||
else:
|
||||
self.down_downscalers.append(nn.Identity())
|
||||
down_block = nn.ModuleList()
|
||||
for _ in range(blocks[0][i]):
|
||||
for block_type in level_config[i]:
|
||||
block = get_block(block_type, c_hidden[i], nhead[i], dropout=dropout[i], self_attn=self_attn[i])
|
||||
down_block.append(block)
|
||||
self.down_blocks.append(down_block)
|
||||
if block_repeat is not None:
|
||||
block_repeat_mappers = nn.ModuleList()
|
||||
for _ in range(block_repeat[0][i] - 1):
|
||||
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
|
||||
self.down_repeat_mappers.append(block_repeat_mappers)
|
||||
|
||||
# -- up blocks
|
||||
self.up_blocks = nn.ModuleList()
|
||||
self.up_upscalers = nn.ModuleList()
|
||||
self.up_repeat_mappers = nn.ModuleList()
|
||||
for i in reversed(range(len(c_hidden))):
|
||||
if i > 0:
|
||||
self.up_upscalers.append(nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[i], elementwise_affine=False, eps=1e-6),
|
||||
UpDownBlock2d(c_hidden[i], c_hidden[i - 1], mode='up', enabled=switch_level[i - 1], dtype=dtype, device=device, operations=operations)
|
||||
))
|
||||
else:
|
||||
self.up_upscalers.append(nn.Identity())
|
||||
up_block = nn.ModuleList()
|
||||
for j in range(blocks[1][::-1][i]):
|
||||
for k, block_type in enumerate(level_config[i]):
|
||||
c_skip = c_hidden[i] if i < len(c_hidden) - 1 and j == k == 0 else 0
|
||||
block = get_block(block_type, c_hidden[i], nhead[i], c_skip=c_skip, dropout=dropout[i],
|
||||
self_attn=self_attn[i])
|
||||
up_block.append(block)
|
||||
self.up_blocks.append(up_block)
|
||||
if block_repeat is not None:
|
||||
block_repeat_mappers = nn.ModuleList()
|
||||
for _ in range(block_repeat[1][::-1][i] - 1):
|
||||
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
|
||||
self.up_repeat_mappers.append(block_repeat_mappers)
|
||||
|
||||
# OUTPUT
|
||||
self.clf = nn.Sequential(
|
||||
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
|
||||
operations.Conv2d(c_hidden[0], c_out * (patch_size ** 2), kernel_size=1, dtype=dtype, device=device),
|
||||
nn.PixelShuffle(patch_size),
|
||||
)
|
||||
|
||||
# --- WEIGHT INIT ---
|
||||
# self.apply(self._init_weights) # General init
|
||||
# nn.init.normal_(self.clip_txt_mapper.weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.clip_txt_pooled_mapper.weight, std=0.02) # conditionings
|
||||
# nn.init.normal_(self.clip_img_mapper.weight, std=0.02) # conditionings
|
||||
# torch.nn.init.xavier_uniform_(self.embedding[1].weight, 0.02) # inputs
|
||||
# nn.init.constant_(self.clf[1].weight, 0) # outputs
|
||||
#
|
||||
# # blocks
|
||||
# for level_block in self.down_blocks + self.up_blocks:
|
||||
# for block in level_block:
|
||||
# if isinstance(block, ResBlock) or isinstance(block, FeedForwardBlock):
|
||||
# block.channelwise[-1].weight.data *= np.sqrt(1 / sum(blocks[0]))
|
||||
# elif isinstance(block, TimestepBlock):
|
||||
# for layer in block.modules():
|
||||
# if isinstance(layer, nn.Linear):
|
||||
# nn.init.constant_(layer.weight, 0)
|
||||
#
|
||||
# def _init_weights(self, m):
|
||||
# if isinstance(m, (nn.Conv2d, nn.Linear)):
|
||||
# torch.nn.init.xavier_uniform_(m.weight)
|
||||
# if m.bias is not None:
|
||||
# nn.init.constant_(m.bias, 0)
|
||||
|
||||
def gen_r_embedding(self, r, max_positions=10000):
|
||||
r = r * max_positions
|
||||
half_dim = self.c_r // 2
|
||||
emb = math.log(max_positions) / (half_dim - 1)
|
||||
emb = torch.arange(half_dim, device=r.device).float().mul(-emb).exp()
|
||||
emb = r[:, None] * emb[None, :]
|
||||
emb = torch.cat([emb.sin(), emb.cos()], dim=1)
|
||||
if self.c_r % 2 == 1: # zero pad
|
||||
emb = nn.functional.pad(emb, (0, 1), mode='constant')
|
||||
return emb
|
||||
|
||||
def gen_c_embeddings(self, clip_txt, clip_txt_pooled, clip_img):
|
||||
clip_txt = self.clip_txt_mapper(clip_txt)
|
||||
if len(clip_txt_pooled.shape) == 2:
|
||||
clip_txt_pooled = clip_txt_pooled.unsqueeze(1)
|
||||
if len(clip_img.shape) == 2:
|
||||
clip_img = clip_img.unsqueeze(1)
|
||||
clip_txt_pool = self.clip_txt_pooled_mapper(clip_txt_pooled).view(clip_txt_pooled.size(0), clip_txt_pooled.size(1) * self.c_clip_seq, -1)
|
||||
clip_img = self.clip_img_mapper(clip_img).view(clip_img.size(0), clip_img.size(1) * self.c_clip_seq, -1)
|
||||
clip = torch.cat([clip_txt, clip_txt_pool, clip_img], dim=1)
|
||||
clip = self.clip_norm(clip)
|
||||
return clip
|
||||
|
||||
def _down_encode(self, x, r_embed, clip, cnet=None):
|
||||
level_outputs = []
|
||||
block_group = zip(self.down_blocks, self.down_downscalers, self.down_repeat_mappers)
|
||||
for down_block, downscaler, repmap in block_group:
|
||||
x = downscaler(x)
|
||||
for i in range(len(repmap) + 1):
|
||||
for block in down_block:
|
||||
if isinstance(block, ResBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
ResBlock)):
|
||||
if cnet is not None:
|
||||
next_cnet = cnet()
|
||||
if next_cnet is not None:
|
||||
x = x + nn.functional.interpolate(next_cnet, size=x.shape[-2:], mode='bilinear',
|
||||
align_corners=True)
|
||||
x = block(x)
|
||||
elif isinstance(block, AttnBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
AttnBlock)):
|
||||
x = block(x, clip)
|
||||
elif isinstance(block, TimestepBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
TimestepBlock)):
|
||||
x = block(x, r_embed)
|
||||
else:
|
||||
x = block(x)
|
||||
if i < len(repmap):
|
||||
x = repmap[i](x)
|
||||
level_outputs.insert(0, x)
|
||||
return level_outputs
|
||||
|
||||
def _up_decode(self, level_outputs, r_embed, clip, cnet=None):
|
||||
x = level_outputs[0]
|
||||
block_group = zip(self.up_blocks, self.up_upscalers, self.up_repeat_mappers)
|
||||
for i, (up_block, upscaler, repmap) in enumerate(block_group):
|
||||
for j in range(len(repmap) + 1):
|
||||
for k, block in enumerate(up_block):
|
||||
if isinstance(block, ResBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
ResBlock)):
|
||||
skip = level_outputs[i] if k == 0 and i > 0 else None
|
||||
if skip is not None and (x.size(-1) != skip.size(-1) or x.size(-2) != skip.size(-2)):
|
||||
x = torch.nn.functional.interpolate(x, skip.shape[-2:], mode='bilinear',
|
||||
align_corners=True)
|
||||
if cnet is not None:
|
||||
next_cnet = cnet()
|
||||
if next_cnet is not None:
|
||||
x = x + nn.functional.interpolate(next_cnet, size=x.shape[-2:], mode='bilinear',
|
||||
align_corners=True)
|
||||
x = block(x, skip)
|
||||
elif isinstance(block, AttnBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
AttnBlock)):
|
||||
x = block(x, clip)
|
||||
elif isinstance(block, TimestepBlock) or (
|
||||
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
|
||||
TimestepBlock)):
|
||||
x = block(x, r_embed)
|
||||
else:
|
||||
x = block(x)
|
||||
if j < len(repmap):
|
||||
x = repmap[j](x)
|
||||
x = upscaler(x)
|
||||
return x
|
||||
|
||||
def forward(self, x, r, clip_text, clip_text_pooled, clip_img, cnet=None, **kwargs):
|
||||
# Process the conditioning embeddings
|
||||
r_embed = self.gen_r_embedding(r).to(dtype=x.dtype)
|
||||
for c in self.t_conds:
|
||||
t_cond = kwargs.get(c, torch.zeros_like(r))
|
||||
r_embed = torch.cat([r_embed, self.gen_r_embedding(t_cond).to(dtype=x.dtype)], dim=1)
|
||||
clip = self.gen_c_embeddings(clip_text, clip_text_pooled, clip_img)
|
||||
|
||||
# Model Blocks
|
||||
x = self.embedding(x)
|
||||
if cnet is not None:
|
||||
cnet = ControlNetDeliverer(cnet)
|
||||
level_outputs = self._down_encode(x, r_embed, clip, cnet)
|
||||
x = self._up_decode(level_outputs, r_embed, clip, cnet)
|
||||
return self.clf(x)
|
||||
|
||||
def update_weights_ema(self, src_model, beta=0.999):
|
||||
for self_params, src_params in zip(self.parameters(), src_model.parameters()):
|
||||
self_params.data = self_params.data * beta + src_params.data.clone().to(self_params.device) * (1 - beta)
|
||||
for self_buffers, src_buffers in zip(self.buffers(), src_model.buffers()):
|
||||
self_buffers.data = self_buffers.data * beta + src_buffers.data.clone().to(self_buffers.device) * (1 - beta)
|
||||
@@ -0,0 +1,95 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
import torch
|
||||
import torchvision
|
||||
from torch import nn
|
||||
|
||||
|
||||
# EfficientNet
|
||||
class EfficientNetEncoder(nn.Module):
|
||||
def __init__(self, c_latent=16):
|
||||
super().__init__()
|
||||
self.backbone = torchvision.models.efficientnet_v2_s().features.eval()
|
||||
self.mapper = nn.Sequential(
|
||||
nn.Conv2d(1280, c_latent, kernel_size=1, bias=False),
|
||||
nn.BatchNorm2d(c_latent, affine=False), # then normalize them to have mean 0 and std 1
|
||||
)
|
||||
self.mean = nn.Parameter(torch.tensor([0.485, 0.456, 0.406]))
|
||||
self.std = nn.Parameter(torch.tensor([0.229, 0.224, 0.225]))
|
||||
|
||||
def forward(self, x):
|
||||
x = x * 0.5 + 0.5
|
||||
x = (x - self.mean.view([3,1,1])) / self.std.view([3,1,1])
|
||||
o = self.mapper(self.backbone(x))
|
||||
return o
|
||||
|
||||
|
||||
# Fast Decoder for Stage C latents. E.g. 16 x 24 x 24 -> 3 x 192 x 192
|
||||
class Previewer(nn.Module):
|
||||
def __init__(self, c_in=16, c_hidden=512, c_out=3):
|
||||
super().__init__()
|
||||
self.blocks = nn.Sequential(
|
||||
nn.Conv2d(c_in, c_hidden, kernel_size=1), # 16 channels to 512 channels
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden),
|
||||
|
||||
nn.Conv2d(c_hidden, c_hidden, kernel_size=3, padding=1),
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden),
|
||||
|
||||
nn.ConvTranspose2d(c_hidden, c_hidden // 2, kernel_size=2, stride=2), # 16 -> 32
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 2),
|
||||
|
||||
nn.Conv2d(c_hidden // 2, c_hidden // 2, kernel_size=3, padding=1),
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 2),
|
||||
|
||||
nn.ConvTranspose2d(c_hidden // 2, c_hidden // 4, kernel_size=2, stride=2), # 32 -> 64
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 4),
|
||||
|
||||
nn.Conv2d(c_hidden // 4, c_hidden // 4, kernel_size=3, padding=1),
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 4),
|
||||
|
||||
nn.ConvTranspose2d(c_hidden // 4, c_hidden // 4, kernel_size=2, stride=2), # 64 -> 128
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 4),
|
||||
|
||||
nn.Conv2d(c_hidden // 4, c_hidden // 4, kernel_size=3, padding=1),
|
||||
nn.GELU(),
|
||||
nn.BatchNorm2d(c_hidden // 4),
|
||||
|
||||
nn.Conv2d(c_hidden // 4, c_out, kernel_size=1),
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
return (self.blocks(x) - 0.5) * 2.0
|
||||
|
||||
class StageC_coder(nn.Module):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.previewer = Previewer()
|
||||
self.encoder = EfficientNetEncoder()
|
||||
|
||||
def encode(self, x):
|
||||
return self.encoder(x)
|
||||
|
||||
def decode(self, x):
|
||||
return self.previewer(x)
|
||||
@@ -114,7 +114,12 @@ def attention_basic(q, k, v, heads, mask=None):
|
||||
mask = repeat(mask, 'b j -> (b h) () j', h=h)
|
||||
sim.masked_fill_(~mask, max_neg_value)
|
||||
else:
|
||||
sim += mask
|
||||
if len(mask.shape) == 2:
|
||||
bs = 1
|
||||
else:
|
||||
bs = mask.shape[0]
|
||||
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
|
||||
sim.add_(mask)
|
||||
|
||||
# attention, what we cannot get enough of
|
||||
sim = sim.softmax(dim=-1)
|
||||
@@ -165,6 +170,13 @@ def attention_sub_quad(query, key, value, heads, mask=None):
|
||||
if query_chunk_size is None:
|
||||
query_chunk_size = 512
|
||||
|
||||
if mask is not None:
|
||||
if len(mask.shape) == 2:
|
||||
bs = 1
|
||||
else:
|
||||
bs = mask.shape[0]
|
||||
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
|
||||
|
||||
hidden_states = efficient_dot_product_attention(
|
||||
query,
|
||||
key,
|
||||
@@ -223,6 +235,13 @@ def attention_split(q, k, v, heads, mask=None):
|
||||
raise RuntimeError(f'Not enough memory, use lower resolution (max approx. {max_res}x{max_res}). '
|
||||
f'Need: {mem_required/64/gb:0.1f}GB free, Have:{mem_free_total/gb:0.1f}GB free')
|
||||
|
||||
if mask is not None:
|
||||
if len(mask.shape) == 2:
|
||||
bs = 1
|
||||
else:
|
||||
bs = mask.shape[0]
|
||||
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
|
||||
|
||||
# print("steps", steps, mem_required, mem_free_total, modifier, q.element_size(), tensor_size)
|
||||
first_op_done = False
|
||||
cleared_cache = False
|
||||
|
||||
@@ -98,7 +98,7 @@ def make_beta_schedule(schedule, n_timestep, linear_start=1e-4, linear_end=2e-2,
|
||||
alphas = torch.cos(alphas).pow(2)
|
||||
alphas = alphas / alphas[0]
|
||||
betas = 1 - alphas[1:] / alphas[:-1]
|
||||
betas = np.clip(betas, a_min=0, a_max=0.999)
|
||||
betas = torch.clamp(betas, min=0, max=0.999)
|
||||
|
||||
elif schedule == "squaredcos_cap_v2": # used for karlo prior
|
||||
# return early
|
||||
@@ -113,7 +113,7 @@ def make_beta_schedule(schedule, n_timestep, linear_start=1e-4, linear_end=2e-2,
|
||||
betas = torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64) ** 0.5
|
||||
else:
|
||||
raise ValueError(f"schedule '{schedule}' unknown.")
|
||||
return betas.numpy()
|
||||
return betas
|
||||
|
||||
|
||||
def make_ddim_timesteps(ddim_discr_method, num_ddim_timesteps, num_ddpm_timesteps, verbose=True):
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import torch
|
||||
from comfy.ldm.modules.diffusionmodules.openaimodel import UNetModel, Timestep
|
||||
from comfy.ldm.cascade.stage_c import StageC
|
||||
from comfy.ldm.cascade.stage_b import StageB
|
||||
from comfy.ldm.modules.encoders.noise_aug_modules import CLIPEmbeddingNoiseAugmentation
|
||||
from comfy.ldm.modules.diffusionmodules.upscaling import ImageConcatWithNoiseAugmentation
|
||||
import comfy.model_management
|
||||
@@ -12,9 +14,10 @@ class ModelType(Enum):
|
||||
EPS = 1
|
||||
V_PREDICTION = 2
|
||||
V_PREDICTION_EDM = 3
|
||||
STABLE_CASCADE = 4
|
||||
|
||||
|
||||
from comfy.model_sampling import EPS, V_PREDICTION, ModelSamplingDiscrete, ModelSamplingContinuousEDM
|
||||
from comfy.model_sampling import EPS, V_PREDICTION, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling
|
||||
|
||||
|
||||
def model_sampling(model_config, model_type):
|
||||
@@ -27,6 +30,9 @@ def model_sampling(model_config, model_type):
|
||||
elif model_type == ModelType.V_PREDICTION_EDM:
|
||||
c = V_PREDICTION
|
||||
s = ModelSamplingContinuousEDM
|
||||
elif model_type == ModelType.STABLE_CASCADE:
|
||||
c = EPS
|
||||
s = StableCascadeSampling
|
||||
|
||||
class ModelSampling(s, c):
|
||||
pass
|
||||
@@ -35,7 +41,7 @@ def model_sampling(model_config, model_type):
|
||||
|
||||
|
||||
class BaseModel(torch.nn.Module):
|
||||
def __init__(self, model_config, model_type=ModelType.EPS, device=None):
|
||||
def __init__(self, model_config, model_type=ModelType.EPS, device=None, unet_model=UNetModel):
|
||||
super().__init__()
|
||||
|
||||
unet_config = model_config.unet_config
|
||||
@@ -48,7 +54,7 @@ class BaseModel(torch.nn.Module):
|
||||
operations = comfy.ops.manual_cast
|
||||
else:
|
||||
operations = comfy.ops.disable_weight_init
|
||||
self.diffusion_model = UNetModel(**unet_config, device=device, operations=operations)
|
||||
self.diffusion_model = unet_model(**unet_config, device=device, operations=operations)
|
||||
self.model_type = model_type
|
||||
self.model_sampling = model_sampling(model_config, model_type)
|
||||
|
||||
@@ -153,6 +159,10 @@ class BaseModel(torch.nn.Module):
|
||||
if cross_attn is not None:
|
||||
out['c_crossattn'] = comfy.conds.CONDCrossAttn(cross_attn)
|
||||
|
||||
cross_attn_cnet = kwargs.get("cross_attn_controlnet", None)
|
||||
if cross_attn_cnet is not None:
|
||||
out['crossattn_controlnet'] = comfy.conds.CONDCrossAttn(cross_attn_cnet)
|
||||
|
||||
return out
|
||||
|
||||
def load_model_weights(self, sd, unet_prefix=""):
|
||||
@@ -423,3 +433,52 @@ class SD_X4Upscaler(BaseModel):
|
||||
out['c_concat'] = comfy.conds.CONDNoiseShape(image)
|
||||
out['y'] = comfy.conds.CONDRegular(noise_level)
|
||||
return out
|
||||
|
||||
class StableCascade_C(BaseModel):
|
||||
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
|
||||
super().__init__(model_config, model_type, device=device, unet_model=StageC)
|
||||
self.diffusion_model.eval().requires_grad_(False)
|
||||
|
||||
def extra_conds(self, **kwargs):
|
||||
out = {}
|
||||
clip_text_pooled = kwargs["pooled_output"]
|
||||
if clip_text_pooled is not None:
|
||||
out['clip_text_pooled'] = comfy.conds.CONDRegular(clip_text_pooled)
|
||||
|
||||
if "unclip_conditioning" in kwargs:
|
||||
embeds = []
|
||||
for unclip_cond in kwargs["unclip_conditioning"]:
|
||||
weight = unclip_cond["strength"]
|
||||
embeds.append(unclip_cond["clip_vision_output"].image_embeds.unsqueeze(0) * weight)
|
||||
clip_img = torch.cat(embeds, dim=1)
|
||||
else:
|
||||
clip_img = torch.zeros((1, 1, 768))
|
||||
out["clip_img"] = comfy.conds.CONDRegular(clip_img)
|
||||
out["sca"] = comfy.conds.CONDRegular(torch.zeros((1,)))
|
||||
out["crp"] = comfy.conds.CONDRegular(torch.zeros((1,)))
|
||||
|
||||
cross_attn = kwargs.get("cross_attn", None)
|
||||
if cross_attn is not None:
|
||||
out['clip_text'] = comfy.conds.CONDCrossAttn(cross_attn)
|
||||
return out
|
||||
|
||||
|
||||
class StableCascade_B(BaseModel):
|
||||
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
|
||||
super().__init__(model_config, model_type, device=device, unet_model=StageB)
|
||||
self.diffusion_model.eval().requires_grad_(False)
|
||||
|
||||
def extra_conds(self, **kwargs):
|
||||
out = {}
|
||||
noise = kwargs.get("noise", None)
|
||||
|
||||
clip_text_pooled = kwargs["pooled_output"]
|
||||
if clip_text_pooled is not None:
|
||||
out['clip'] = comfy.conds.CONDRegular(clip_text_pooled)
|
||||
|
||||
#size of prior doesn't really matter if zeros because it gets resized but I still want it to get batched
|
||||
prior = kwargs.get("stable_cascade_prior", torch.zeros((1, 16, (noise.shape[2] * 4) // 42, (noise.shape[3] * 4) // 42), dtype=noise.dtype, layout=noise.layout, device=noise.device))
|
||||
|
||||
out["effnet"] = comfy.conds.CONDRegular(prior)
|
||||
out["sca"] = comfy.conds.CONDRegular(torch.zeros((1,)))
|
||||
return out
|
||||
|
||||
@@ -28,9 +28,38 @@ def calculate_transformer_depth(prefix, state_dict_keys, state_dict):
|
||||
return last_transformer_depth, context_dim, use_linear_in_transformer, time_stack
|
||||
return None
|
||||
|
||||
def detect_unet_config(state_dict, key_prefix, dtype):
|
||||
def detect_unet_config(state_dict, key_prefix):
|
||||
state_dict_keys = list(state_dict.keys())
|
||||
|
||||
if '{}clf.1.weight'.format(key_prefix) in state_dict_keys: #stable cascade
|
||||
unet_config = {}
|
||||
text_mapper_name = '{}clip_txt_mapper.weight'.format(key_prefix)
|
||||
if text_mapper_name in state_dict_keys:
|
||||
unet_config['stable_cascade_stage'] = 'c'
|
||||
w = state_dict[text_mapper_name]
|
||||
if w.shape[0] == 1536: #stage c lite
|
||||
unet_config['c_cond'] = 1536
|
||||
unet_config['c_hidden'] = [1536, 1536]
|
||||
unet_config['nhead'] = [24, 24]
|
||||
unet_config['blocks'] = [[4, 12], [12, 4]]
|
||||
elif w.shape[0] == 2048: #stage c full
|
||||
unet_config['c_cond'] = 2048
|
||||
elif '{}clip_mapper.weight'.format(key_prefix) in state_dict_keys:
|
||||
unet_config['stable_cascade_stage'] = 'b'
|
||||
w = state_dict['{}down_blocks.1.0.channelwise.0.weight'.format(key_prefix)]
|
||||
if w.shape[-1] == 640:
|
||||
unet_config['c_hidden'] = [320, 640, 1280, 1280]
|
||||
unet_config['nhead'] = [-1, -1, 20, 20]
|
||||
unet_config['blocks'] = [[2, 6, 28, 6], [6, 28, 6, 2]]
|
||||
unet_config['block_repeat'] = [[1, 1, 1, 1], [3, 3, 2, 2]]
|
||||
elif w.shape[-1] == 576: #stage b lite
|
||||
unet_config['c_hidden'] = [320, 576, 1152, 1152]
|
||||
unet_config['nhead'] = [-1, 9, 18, 18]
|
||||
unet_config['blocks'] = [[2, 4, 14, 4], [4, 14, 4, 2]]
|
||||
unet_config['block_repeat'] = [[1, 1, 1, 1], [2, 2, 2, 2]]
|
||||
|
||||
return unet_config
|
||||
|
||||
unet_config = {
|
||||
"use_checkpoint": False,
|
||||
"image_size": 32,
|
||||
@@ -45,7 +74,6 @@ def detect_unet_config(state_dict, key_prefix, dtype):
|
||||
else:
|
||||
unet_config["adm_in_channels"] = None
|
||||
|
||||
unet_config["dtype"] = dtype
|
||||
model_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[0]
|
||||
in_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[1]
|
||||
|
||||
@@ -159,8 +187,8 @@ def model_config_from_unet_config(unet_config):
|
||||
print("no match", unet_config)
|
||||
return None
|
||||
|
||||
def model_config_from_unet(state_dict, unet_key_prefix, dtype, use_base_if_no_match=False):
|
||||
unet_config = detect_unet_config(state_dict, unet_key_prefix, dtype)
|
||||
def model_config_from_unet(state_dict, unet_key_prefix, use_base_if_no_match=False):
|
||||
unet_config = detect_unet_config(state_dict, unet_key_prefix)
|
||||
model_config = model_config_from_unet_config(unet_config)
|
||||
if model_config is None and use_base_if_no_match:
|
||||
return comfy.supported_models_base.BASE(unet_config)
|
||||
@@ -206,7 +234,7 @@ def convert_config(unet_config):
|
||||
return new_config
|
||||
|
||||
|
||||
def unet_config_from_diffusers_unet(state_dict, dtype):
|
||||
def unet_config_from_diffusers_unet(state_dict, dtype=None):
|
||||
match = {}
|
||||
transformer_depth = []
|
||||
|
||||
@@ -313,8 +341,8 @@ def unet_config_from_diffusers_unet(state_dict, dtype):
|
||||
return convert_config(unet_config)
|
||||
return None
|
||||
|
||||
def model_config_from_diffusers_unet(state_dict, dtype):
|
||||
unet_config = unet_config_from_diffusers_unet(state_dict, dtype)
|
||||
def model_config_from_diffusers_unet(state_dict):
|
||||
unet_config = unet_config_from_diffusers_unet(state_dict)
|
||||
if unet_config is not None:
|
||||
return model_config_from_unet_config(unet_config)
|
||||
return None
|
||||
|
||||
@@ -487,7 +487,7 @@ def unet_inital_load_device(parameters, dtype):
|
||||
else:
|
||||
return cpu_dev
|
||||
|
||||
def unet_dtype(device=None, model_params=0):
|
||||
def unet_dtype(device=None, model_params=0, supported_dtypes=[torch.float16, torch.bfloat16, torch.float32]):
|
||||
if args.bf16_unet:
|
||||
return torch.bfloat16
|
||||
if args.fp16_unet:
|
||||
@@ -496,21 +496,32 @@ def unet_dtype(device=None, model_params=0):
|
||||
return torch.float8_e4m3fn
|
||||
if args.fp8_e5m2_unet:
|
||||
return torch.float8_e5m2
|
||||
if should_use_fp16(device=device, model_params=model_params):
|
||||
return torch.float16
|
||||
if should_use_fp16(device=device, model_params=model_params, manual_cast=True):
|
||||
if torch.float16 in supported_dtypes:
|
||||
return torch.float16
|
||||
if should_use_bf16(device, model_params=model_params, manual_cast=True):
|
||||
if torch.bfloat16 in supported_dtypes:
|
||||
return torch.bfloat16
|
||||
return torch.float32
|
||||
|
||||
# None means no manual cast
|
||||
def unet_manual_cast(weight_dtype, inference_device):
|
||||
def unet_manual_cast(weight_dtype, inference_device, supported_dtypes=[torch.float16, torch.bfloat16, torch.float32]):
|
||||
if weight_dtype == torch.float32:
|
||||
return None
|
||||
|
||||
fp16_supported = comfy.model_management.should_use_fp16(inference_device, prioritize_performance=False)
|
||||
fp16_supported = should_use_fp16(inference_device, prioritize_performance=False)
|
||||
if fp16_supported and weight_dtype == torch.float16:
|
||||
return None
|
||||
|
||||
if fp16_supported:
|
||||
bf16_supported = should_use_bf16(inference_device)
|
||||
if bf16_supported and weight_dtype == torch.bfloat16:
|
||||
return None
|
||||
|
||||
if fp16_supported and torch.float16 in supported_dtypes:
|
||||
return torch.float16
|
||||
|
||||
elif bf16_supported and torch.bfloat16 in supported_dtypes:
|
||||
return torch.bfloat16
|
||||
else:
|
||||
return torch.float32
|
||||
|
||||
@@ -546,10 +557,8 @@ def text_encoder_dtype(device=None):
|
||||
if is_device_cpu(device):
|
||||
return torch.float16
|
||||
|
||||
if should_use_fp16(device, prioritize_performance=False):
|
||||
return torch.float16
|
||||
else:
|
||||
return torch.float32
|
||||
return torch.float16
|
||||
|
||||
|
||||
def intermediate_device():
|
||||
if args.gpu_only:
|
||||
@@ -686,19 +695,22 @@ def mps_mode():
|
||||
global cpu_state
|
||||
return cpu_state == CPUState.MPS
|
||||
|
||||
def is_device_cpu(device):
|
||||
def is_device_type(device, type):
|
||||
if hasattr(device, 'type'):
|
||||
if (device.type == 'cpu'):
|
||||
if (device.type == type):
|
||||
return True
|
||||
return False
|
||||
|
||||
def is_device_cpu(device):
|
||||
return is_device_type(device, 'cpu')
|
||||
|
||||
def is_device_mps(device):
|
||||
if hasattr(device, 'type'):
|
||||
if (device.type == 'mps'):
|
||||
return True
|
||||
return False
|
||||
return is_device_type(device, 'mps')
|
||||
|
||||
def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
|
||||
def is_device_cuda(device):
|
||||
return is_device_type(device, 'cuda')
|
||||
|
||||
def should_use_fp16(device=None, model_params=0, prioritize_performance=True, manual_cast=False):
|
||||
global directml_enabled
|
||||
|
||||
if device is not None:
|
||||
@@ -708,9 +720,9 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
|
||||
if FORCE_FP16:
|
||||
return True
|
||||
|
||||
if device is not None: #TODO
|
||||
if device is not None:
|
||||
if is_device_mps(device):
|
||||
return False
|
||||
return True
|
||||
|
||||
if FORCE_FP32:
|
||||
return False
|
||||
@@ -718,16 +730,22 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
|
||||
if directml_enabled:
|
||||
return False
|
||||
|
||||
if cpu_mode() or mps_mode():
|
||||
return False #TODO ?
|
||||
if mps_mode():
|
||||
return True
|
||||
|
||||
if cpu_mode():
|
||||
return False
|
||||
|
||||
if is_intel_xpu():
|
||||
return True
|
||||
|
||||
if torch.cuda.is_bf16_supported():
|
||||
if torch.version.hip:
|
||||
return True
|
||||
|
||||
props = torch.cuda.get_device_properties("cuda")
|
||||
if props.major >= 8:
|
||||
return True
|
||||
|
||||
if props.major < 6:
|
||||
return False
|
||||
|
||||
@@ -740,7 +758,7 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
|
||||
if x in props.name.lower():
|
||||
fp16_works = True
|
||||
|
||||
if fp16_works:
|
||||
if fp16_works or manual_cast:
|
||||
free_model_memory = (get_free_memory() * 0.9 - minimum_inference_memory())
|
||||
if (not prioritize_performance) or model_params * 4 > free_model_memory:
|
||||
return True
|
||||
@@ -756,6 +774,43 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
|
||||
|
||||
return True
|
||||
|
||||
def should_use_bf16(device=None, model_params=0, prioritize_performance=True, manual_cast=False):
|
||||
if device is not None:
|
||||
if is_device_cpu(device): #TODO ? bf16 works on CPU but is extremely slow
|
||||
return False
|
||||
|
||||
if device is not None: #TODO not sure about mps bf16 support
|
||||
if is_device_mps(device):
|
||||
return False
|
||||
|
||||
if FORCE_FP32:
|
||||
return False
|
||||
|
||||
if directml_enabled:
|
||||
return False
|
||||
|
||||
if cpu_mode() or mps_mode():
|
||||
return False
|
||||
|
||||
if is_intel_xpu():
|
||||
return True
|
||||
|
||||
if device is None:
|
||||
device = torch.device("cuda")
|
||||
|
||||
props = torch.cuda.get_device_properties(device)
|
||||
if props.major >= 8:
|
||||
return True
|
||||
|
||||
bf16_works = torch.cuda.is_bf16_supported()
|
||||
|
||||
if bf16_works or manual_cast:
|
||||
free_model_memory = (get_free_memory() * 0.9 - minimum_inference_memory())
|
||||
if (not prioritize_performance) or model_params * 4 > free_model_memory:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def soft_empty_cache(force=False):
|
||||
global cpu_state
|
||||
if cpu_state == CPUState.MPS:
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import torch
|
||||
import numpy as np
|
||||
from comfy.ldm.modules.diffusionmodules.util import make_beta_schedule
|
||||
import math
|
||||
|
||||
@@ -42,8 +41,7 @@ class ModelSamplingDiscrete(torch.nn.Module):
|
||||
else:
|
||||
betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s)
|
||||
alphas = 1. - betas
|
||||
alphas_cumprod = torch.tensor(np.cumprod(alphas, axis=0), dtype=torch.float32)
|
||||
# alphas_cumprod_prev = np.append(1., alphas_cumprod[:-1])
|
||||
alphas_cumprod = torch.cumprod(alphas, dim=0)
|
||||
|
||||
timesteps, = betas.shape
|
||||
self.num_timesteps = int(timesteps)
|
||||
@@ -58,8 +56,8 @@ class ModelSamplingDiscrete(torch.nn.Module):
|
||||
self.set_sigmas(sigmas)
|
||||
|
||||
def set_sigmas(self, sigmas):
|
||||
self.register_buffer('sigmas', sigmas)
|
||||
self.register_buffer('log_sigmas', sigmas.log())
|
||||
self.register_buffer('sigmas', sigmas.float())
|
||||
self.register_buffer('log_sigmas', sigmas.log().float())
|
||||
|
||||
@property
|
||||
def sigma_min(self):
|
||||
@@ -134,3 +132,56 @@ class ModelSamplingContinuousEDM(torch.nn.Module):
|
||||
|
||||
log_sigma_min = math.log(self.sigma_min)
|
||||
return math.exp((math.log(self.sigma_max) - log_sigma_min) * percent + log_sigma_min)
|
||||
|
||||
class StableCascadeSampling(ModelSamplingDiscrete):
|
||||
def __init__(self, model_config=None):
|
||||
super().__init__()
|
||||
|
||||
if model_config is not None:
|
||||
sampling_settings = model_config.sampling_settings
|
||||
else:
|
||||
sampling_settings = {}
|
||||
|
||||
self.set_parameters(sampling_settings.get("shift", 1.0))
|
||||
|
||||
def set_parameters(self, shift=1.0, cosine_s=8e-3):
|
||||
self.shift = shift
|
||||
self.cosine_s = torch.tensor(cosine_s)
|
||||
self._init_alpha_cumprod = torch.cos(self.cosine_s / (1 + self.cosine_s) * torch.pi * 0.5) ** 2
|
||||
|
||||
#This part is just for compatibility with some schedulers in the codebase
|
||||
self.num_timesteps = 10000
|
||||
sigmas = torch.empty((self.num_timesteps), dtype=torch.float32)
|
||||
for x in range(self.num_timesteps):
|
||||
t = (x + 1) / self.num_timesteps
|
||||
sigmas[x] = self.sigma(t)
|
||||
|
||||
self.set_sigmas(sigmas)
|
||||
|
||||
def sigma(self, timestep):
|
||||
alpha_cumprod = (torch.cos((timestep + self.cosine_s) / (1 + self.cosine_s) * torch.pi * 0.5) ** 2 / self._init_alpha_cumprod)
|
||||
|
||||
if self.shift != 1.0:
|
||||
var = alpha_cumprod
|
||||
logSNR = (var/(1-var)).log()
|
||||
logSNR += 2 * torch.log(1.0 / torch.tensor(self.shift))
|
||||
alpha_cumprod = logSNR.sigmoid()
|
||||
|
||||
alpha_cumprod = alpha_cumprod.clamp(0.0001, 0.9999)
|
||||
return ((1 - alpha_cumprod) / alpha_cumprod) ** 0.5
|
||||
|
||||
def timestep(self, sigma):
|
||||
var = 1 / ((sigma * sigma) + 1)
|
||||
var = var.clamp(0, 1.0)
|
||||
s, min_var = self.cosine_s.to(var.device), self._init_alpha_cumprod.to(var.device)
|
||||
t = (((var * min_var) ** 0.5).acos() / (torch.pi * 0.5)) * (1 + s) - s
|
||||
return t
|
||||
|
||||
def percent_to_sigma(self, percent):
|
||||
if percent <= 0.0:
|
||||
return 999999999.9
|
||||
if percent >= 1.0:
|
||||
return 0.0
|
||||
|
||||
percent = 1.0 - percent
|
||||
return self.sigma(torch.tensor(percent))
|
||||
|
||||
@@ -1,3 +1,21 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import torch
|
||||
import comfy.model_management
|
||||
|
||||
@@ -78,7 +96,11 @@ class disable_weight_init:
|
||||
return None
|
||||
|
||||
def forward_comfy_cast_weights(self, input):
|
||||
weight, bias = cast_bias_weight(self, input)
|
||||
if self.weight is not None:
|
||||
weight, bias = cast_bias_weight(self, input)
|
||||
else:
|
||||
weight = None
|
||||
bias = None
|
||||
return torch.nn.functional.layer_norm(input, self.normalized_shape, weight, bias, self.eps)
|
||||
|
||||
def forward(self, *args, **kwargs):
|
||||
@@ -87,6 +109,28 @@ class disable_weight_init:
|
||||
else:
|
||||
return super().forward(*args, **kwargs)
|
||||
|
||||
class ConvTranspose2d(torch.nn.ConvTranspose2d):
|
||||
comfy_cast_weights = False
|
||||
def reset_parameters(self):
|
||||
return None
|
||||
|
||||
def forward_comfy_cast_weights(self, input, output_size=None):
|
||||
num_spatial_dims = 2
|
||||
output_padding = self._output_padding(
|
||||
input, output_size, self.stride, self.padding, self.kernel_size,
|
||||
num_spatial_dims, self.dilation)
|
||||
|
||||
weight, bias = cast_bias_weight(self, input)
|
||||
return torch.nn.functional.conv_transpose2d(
|
||||
input, weight, bias, self.stride, self.padding,
|
||||
output_padding, self.groups, self.dilation)
|
||||
|
||||
def forward(self, *args, **kwargs):
|
||||
if self.comfy_cast_weights:
|
||||
return self.forward_comfy_cast_weights(*args, **kwargs)
|
||||
else:
|
||||
return super().forward(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def conv_nd(s, dims, *args, **kwargs):
|
||||
if dims == 2:
|
||||
@@ -112,3 +156,6 @@ class manual_cast(disable_weight_init):
|
||||
|
||||
class LayerNorm(disable_weight_init.LayerNorm):
|
||||
comfy_cast_weights = True
|
||||
|
||||
class ConvTranspose2d(disable_weight_init.ConvTranspose2d):
|
||||
comfy_cast_weights = True
|
||||
|
||||
@@ -295,7 +295,7 @@ def simple_scheduler(model, steps):
|
||||
def ddim_scheduler(model, steps):
|
||||
s = model.model_sampling
|
||||
sigs = []
|
||||
ss = len(s.sigmas) // steps
|
||||
ss = max(len(s.sigmas) // steps, 1)
|
||||
x = 1
|
||||
while x < len(s.sigmas):
|
||||
sigs += [float(s.sigmas[x])]
|
||||
@@ -652,6 +652,7 @@ def sampler_object(name):
|
||||
class KSampler:
|
||||
SCHEDULERS = SCHEDULER_NAMES
|
||||
SAMPLERS = SAMPLER_NAMES
|
||||
DISCARD_PENULTIMATE_SIGMA_SAMPLERS = set(('dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2'))
|
||||
|
||||
def __init__(self, model, steps, device, sampler=None, scheduler=None, denoise=None, model_options={}):
|
||||
self.model = model
|
||||
@@ -670,7 +671,7 @@ class KSampler:
|
||||
sigmas = None
|
||||
|
||||
discard_penultimate_sigma = False
|
||||
if self.sampler in ['dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2']:
|
||||
if self.sampler in self.DISCARD_PENULTIMATE_SIGMA_SAMPLERS:
|
||||
steps += 1
|
||||
discard_penultimate_sigma = True
|
||||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
import torch
|
||||
from enum import Enum
|
||||
|
||||
from comfy import model_management
|
||||
from .ldm.models.autoencoder import AutoencoderKL, AutoencodingEngine
|
||||
from .ldm.cascade.stage_a import StageA
|
||||
from .ldm.cascade.stage_c_coder import StageC_coder
|
||||
|
||||
import yaml
|
||||
|
||||
import comfy.utils
|
||||
@@ -134,8 +138,11 @@ class CLIP:
|
||||
tokens = self.tokenize(text)
|
||||
return self.encode_from_tokens(tokens)
|
||||
|
||||
def load_sd(self, sd):
|
||||
return self.cond_stage_model.load_sd(sd)
|
||||
def load_sd(self, sd, full_model=False):
|
||||
if full_model:
|
||||
return self.cond_stage_model.load_state_dict(sd, strict=False)
|
||||
else:
|
||||
return self.cond_stage_model.load_sd(sd)
|
||||
|
||||
def get_sd(self):
|
||||
return self.cond_stage_model.state_dict()
|
||||
@@ -155,7 +162,10 @@ class VAE:
|
||||
self.memory_used_encode = lambda shape, dtype: (1767 * shape[2] * shape[3]) * model_management.dtype_size(dtype) #These are for AutoencoderKL and need tweaking (should be lower)
|
||||
self.memory_used_decode = lambda shape, dtype: (2178 * shape[2] * shape[3] * 64) * model_management.dtype_size(dtype)
|
||||
self.downscale_ratio = 8
|
||||
self.upscale_ratio = 8
|
||||
self.latent_channels = 4
|
||||
self.process_input = lambda image: image * 2.0 - 1.0
|
||||
self.process_output = lambda image: torch.clamp((image + 1.0) / 2.0, min=0.0, max=1.0)
|
||||
|
||||
if config is None:
|
||||
if "decoder.mid.block_1.mix_factor" in sd:
|
||||
@@ -168,6 +178,34 @@ class VAE:
|
||||
decoder_config={'target': "comfy.ldm.modules.temporal_ae.VideoDecoder", 'params': decoder_config})
|
||||
elif "taesd_decoder.1.weight" in sd:
|
||||
self.first_stage_model = comfy.taesd.taesd.TAESD()
|
||||
elif "vquantizer.codebook.weight" in sd: #VQGan: stage a of stable cascade
|
||||
self.first_stage_model = StageA()
|
||||
self.downscale_ratio = 4
|
||||
self.upscale_ratio = 4
|
||||
#TODO
|
||||
#self.memory_used_encode
|
||||
#self.memory_used_decode
|
||||
self.process_input = lambda image: image
|
||||
self.process_output = lambda image: image
|
||||
elif "backbone.1.0.block.0.1.num_batches_tracked" in sd: #effnet: encoder for stage c latent of stable cascade
|
||||
self.first_stage_model = StageC_coder()
|
||||
self.downscale_ratio = 32
|
||||
self.latent_channels = 16
|
||||
new_sd = {}
|
||||
for k in sd:
|
||||
new_sd["encoder.{}".format(k)] = sd[k]
|
||||
sd = new_sd
|
||||
elif "blocks.11.num_batches_tracked" in sd: #previewer: decoder for stage c latent of stable cascade
|
||||
self.first_stage_model = StageC_coder()
|
||||
self.latent_channels = 16
|
||||
new_sd = {}
|
||||
for k in sd:
|
||||
new_sd["previewer.{}".format(k)] = sd[k]
|
||||
sd = new_sd
|
||||
elif "encoder.backbone.1.0.block.0.1.num_batches_tracked" in sd: #combined effnet and previewer for stable cascade
|
||||
self.first_stage_model = StageC_coder()
|
||||
self.downscale_ratio = 32
|
||||
self.latent_channels = 16
|
||||
else:
|
||||
#default SD1.x/SD2.x VAE parameters
|
||||
ddconfig = {'double_z': True, 'z_channels': 4, 'resolution': 256, 'in_channels': 3, 'out_ch': 3, 'ch': 128, 'ch_mult': [1, 2, 4, 4], 'num_res_blocks': 2, 'attn_resolutions': [], 'dropout': 0.0}
|
||||
@@ -175,6 +213,7 @@ class VAE:
|
||||
if 'encoder.down.2.downsample.conv.weight' not in sd: #Stable diffusion x4 upscaler VAE
|
||||
ddconfig['ch_mult'] = [1, 2, 4]
|
||||
self.downscale_ratio = 4
|
||||
self.upscale_ratio = 4
|
||||
|
||||
self.first_stage_model = AutoencoderKL(ddconfig=ddconfig, embed_dim=4)
|
||||
else:
|
||||
@@ -200,18 +239,27 @@ class VAE:
|
||||
|
||||
self.patcher = comfy.model_patcher.ModelPatcher(self.first_stage_model, load_device=self.device, offload_device=offload_device)
|
||||
|
||||
def vae_encode_crop_pixels(self, pixels):
|
||||
x = (pixels.shape[1] // self.downscale_ratio) * self.downscale_ratio
|
||||
y = (pixels.shape[2] // self.downscale_ratio) * self.downscale_ratio
|
||||
if pixels.shape[1] != x or pixels.shape[2] != y:
|
||||
x_offset = (pixels.shape[1] % self.downscale_ratio) // 2
|
||||
y_offset = (pixels.shape[2] % self.downscale_ratio) // 2
|
||||
pixels = pixels[:, x_offset:x + x_offset, y_offset:y + y_offset, :]
|
||||
return pixels
|
||||
|
||||
def decode_tiled_(self, samples, tile_x=64, tile_y=64, overlap = 16):
|
||||
steps = samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x, tile_y, overlap)
|
||||
steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x // 2, tile_y * 2, overlap)
|
||||
steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x * 2, tile_y // 2, overlap)
|
||||
pbar = comfy.utils.ProgressBar(steps)
|
||||
|
||||
decode_fn = lambda a: (self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)) + 1.0).float()
|
||||
output = torch.clamp((
|
||||
(comfy.utils.tiled_scale(samples, decode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar) +
|
||||
comfy.utils.tiled_scale(samples, decode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar) +
|
||||
comfy.utils.tiled_scale(samples, decode_fn, tile_x, tile_y, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar))
|
||||
/ 3.0) / 2.0, min=0.0, max=1.0)
|
||||
decode_fn = lambda a: self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)).float()
|
||||
output = self.process_output(
|
||||
(comfy.utils.tiled_scale(samples, decode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar) +
|
||||
comfy.utils.tiled_scale(samples, decode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar) +
|
||||
comfy.utils.tiled_scale(samples, decode_fn, tile_x, tile_y, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar))
|
||||
/ 3.0)
|
||||
return output
|
||||
|
||||
def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64):
|
||||
@@ -220,7 +268,7 @@ class VAE:
|
||||
steps += pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x * 2, tile_y // 2, overlap)
|
||||
pbar = comfy.utils.ProgressBar(steps)
|
||||
|
||||
encode_fn = lambda a: self.first_stage_model.encode((2. * a - 1.).to(self.vae_dtype).to(self.device)).float()
|
||||
encode_fn = lambda a: self.first_stage_model.encode((self.process_input(a)).to(self.vae_dtype).to(self.device)).float()
|
||||
samples = comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x, tile_y, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
|
||||
samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
|
||||
samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
|
||||
@@ -235,10 +283,10 @@ class VAE:
|
||||
batch_number = int(free_memory / memory_used)
|
||||
batch_number = max(1, batch_number)
|
||||
|
||||
pixel_samples = torch.empty((samples_in.shape[0], 3, round(samples_in.shape[2] * self.downscale_ratio), round(samples_in.shape[3] * self.downscale_ratio)), device=self.output_device)
|
||||
pixel_samples = torch.empty((samples_in.shape[0], 3, round(samples_in.shape[2] * self.upscale_ratio), round(samples_in.shape[3] * self.upscale_ratio)), device=self.output_device)
|
||||
for x in range(0, samples_in.shape[0], batch_number):
|
||||
samples = samples_in[x:x+batch_number].to(self.vae_dtype).to(self.device)
|
||||
pixel_samples[x:x+batch_number] = torch.clamp((self.first_stage_model.decode(samples).to(self.output_device).float() + 1.0) / 2.0, min=0.0, max=1.0)
|
||||
pixel_samples[x:x+batch_number] = self.process_output(self.first_stage_model.decode(samples).to(self.output_device).float())
|
||||
except model_management.OOM_EXCEPTION as e:
|
||||
print("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.")
|
||||
pixel_samples = self.decode_tiled_(samples_in)
|
||||
@@ -252,6 +300,7 @@ class VAE:
|
||||
return output.movedim(1,-1)
|
||||
|
||||
def encode(self, pixel_samples):
|
||||
pixel_samples = self.vae_encode_crop_pixels(pixel_samples)
|
||||
pixel_samples = pixel_samples.movedim(-1,1)
|
||||
try:
|
||||
memory_used = self.memory_used_encode(pixel_samples.shape, self.vae_dtype)
|
||||
@@ -261,7 +310,7 @@ class VAE:
|
||||
batch_number = max(1, batch_number)
|
||||
samples = torch.empty((pixel_samples.shape[0], self.latent_channels, round(pixel_samples.shape[2] // self.downscale_ratio), round(pixel_samples.shape[3] // self.downscale_ratio)), device=self.output_device)
|
||||
for x in range(0, pixel_samples.shape[0], batch_number):
|
||||
pixels_in = (2. * pixel_samples[x:x+batch_number] - 1.).to(self.vae_dtype).to(self.device)
|
||||
pixels_in = self.process_input(pixel_samples[x:x+batch_number]).to(self.vae_dtype).to(self.device)
|
||||
samples[x:x+batch_number] = self.first_stage_model.encode(pixels_in).to(self.output_device).float()
|
||||
|
||||
except model_management.OOM_EXCEPTION as e:
|
||||
@@ -271,6 +320,7 @@ class VAE:
|
||||
return samples
|
||||
|
||||
def encode_tiled(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64):
|
||||
pixel_samples = self.vae_encode_crop_pixels(pixel_samples)
|
||||
model_management.load_model_gpu(self.patcher)
|
||||
pixel_samples = pixel_samples.movedim(-1,1)
|
||||
samples = self.encode_tiled_(pixel_samples, tile_x=tile_x, tile_y=tile_y, overlap=overlap)
|
||||
@@ -297,8 +347,11 @@ def load_style_model(ckpt_path):
|
||||
model.load_state_dict(model_data)
|
||||
return StyleModel(model)
|
||||
|
||||
class CLIPType(Enum):
|
||||
STABLE_DIFFUSION = 1
|
||||
STABLE_CASCADE = 2
|
||||
|
||||
def load_clip(ckpt_paths, embedding_directory=None):
|
||||
def load_clip(ckpt_paths, embedding_directory=None, clip_type=CLIPType.STABLE_DIFFUSION):
|
||||
clip_data = []
|
||||
for p in ckpt_paths:
|
||||
clip_data.append(comfy.utils.load_torch_file(p, safe_load=True))
|
||||
@@ -314,8 +367,12 @@ def load_clip(ckpt_paths, embedding_directory=None):
|
||||
clip_target.params = {}
|
||||
if len(clip_data) == 1:
|
||||
if "text_model.encoder.layers.30.mlp.fc1.weight" in clip_data[0]:
|
||||
clip_target.clip = sdxl_clip.SDXLRefinerClipModel
|
||||
clip_target.tokenizer = sdxl_clip.SDXLTokenizer
|
||||
if clip_type == CLIPType.STABLE_CASCADE:
|
||||
clip_target.clip = sdxl_clip.StableCascadeClipModel
|
||||
clip_target.tokenizer = sdxl_clip.StableCascadeTokenizer
|
||||
else:
|
||||
clip_target.clip = sdxl_clip.SDXLRefinerClipModel
|
||||
clip_target.tokenizer = sdxl_clip.SDXLTokenizer
|
||||
elif "text_model.encoder.layers.22.mlp.fc1.weight" in clip_data[0]:
|
||||
clip_target.clip = sd2_clip.SD2ClipModel
|
||||
clip_target.tokenizer = sd2_clip.SD2Tokenizer
|
||||
@@ -438,15 +495,12 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o
|
||||
clip_target = None
|
||||
|
||||
parameters = comfy.utils.calculate_parameters(sd, "model.diffusion_model.")
|
||||
unet_dtype = model_management.unet_dtype(model_params=parameters)
|
||||
load_device = model_management.get_torch_device()
|
||||
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device)
|
||||
|
||||
class WeightsLoader(torch.nn.Module):
|
||||
pass
|
||||
|
||||
model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.", unet_dtype)
|
||||
model_config.set_manual_cast(manual_cast_dtype)
|
||||
model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.")
|
||||
unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes)
|
||||
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device, model_config.supported_inference_dtypes)
|
||||
model_config.set_inference_dtype(unet_dtype, manual_cast_dtype)
|
||||
|
||||
if model_config is None:
|
||||
raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_path))
|
||||
@@ -467,13 +521,19 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o
|
||||
vae = VAE(sd=vae_sd)
|
||||
|
||||
if output_clip:
|
||||
w = WeightsLoader()
|
||||
clip_target = model_config.clip_target()
|
||||
if clip_target is not None:
|
||||
clip = CLIP(clip_target, embedding_directory=embedding_directory)
|
||||
w.cond_stage_model = clip.cond_stage_model
|
||||
sd = model_config.process_clip_state_dict(sd)
|
||||
load_model_weights(w, sd)
|
||||
clip_sd = model_config.process_clip_state_dict(sd)
|
||||
if len(clip_sd) > 0:
|
||||
clip = CLIP(clip_target, embedding_directory=embedding_directory)
|
||||
m, u = clip.load_sd(clip_sd, full_model=True)
|
||||
if len(m) > 0:
|
||||
print("clip missing:", m)
|
||||
|
||||
if len(u) > 0:
|
||||
print("clip unexpected:", u)
|
||||
else:
|
||||
print("no CLIP/text encoder weights in checkpoint, the text encoder model will not be loaded.")
|
||||
|
||||
left_over = sd.keys()
|
||||
if len(left_over) > 0:
|
||||
@@ -492,16 +552,15 @@ def load_unet_state_dict(sd): #load unet in diffusers format
|
||||
parameters = comfy.utils.calculate_parameters(sd)
|
||||
unet_dtype = model_management.unet_dtype(model_params=parameters)
|
||||
load_device = model_management.get_torch_device()
|
||||
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device)
|
||||
|
||||
if "input_blocks.0.0.weight" in sd: #ldm
|
||||
model_config = model_detection.model_config_from_unet(sd, "", unet_dtype)
|
||||
if "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade
|
||||
model_config = model_detection.model_config_from_unet(sd, "")
|
||||
if model_config is None:
|
||||
return None
|
||||
new_sd = sd
|
||||
|
||||
else: #diffusers
|
||||
model_config = model_detection.model_config_from_diffusers_unet(sd, unet_dtype)
|
||||
model_config = model_detection.model_config_from_diffusers_unet(sd)
|
||||
if model_config is None:
|
||||
return None
|
||||
|
||||
@@ -513,8 +572,11 @@ def load_unet_state_dict(sd): #load unet in diffusers format
|
||||
new_sd[diffusers_keys[k]] = sd.pop(k)
|
||||
else:
|
||||
print(diffusers_keys[k], k)
|
||||
|
||||
offload_device = model_management.unet_offload_device()
|
||||
model_config.set_manual_cast(manual_cast_dtype)
|
||||
unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes)
|
||||
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device, model_config.supported_inference_dtypes)
|
||||
model_config.set_inference_dtype(unet_dtype, manual_cast_dtype)
|
||||
model = model_config.get_model(new_sd, "")
|
||||
model = model.to(offload_device)
|
||||
model.load_model_weights(new_sd, "")
|
||||
|
||||
@@ -67,7 +67,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
|
||||
]
|
||||
def __init__(self, version="openai/clip-vit-large-patch14", device="cpu", max_length=77,
|
||||
freeze=True, layer="last", layer_idx=None, textmodel_json_config=None, dtype=None, model_class=comfy.clip_model.CLIPTextModel,
|
||||
special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=True): # clip-vit-base-patch32
|
||||
special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=True, enable_attention_masks=False): # clip-vit-base-patch32
|
||||
super().__init__()
|
||||
assert layer in self.LAYERS
|
||||
|
||||
@@ -88,7 +88,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
|
||||
self.special_tokens = special_tokens
|
||||
self.text_projection = torch.nn.Parameter(torch.eye(self.transformer.get_input_embeddings().weight.shape[1]))
|
||||
self.logit_scale = torch.nn.Parameter(torch.tensor(4.6055))
|
||||
self.enable_attention_masks = False
|
||||
self.enable_attention_masks = enable_attention_masks
|
||||
|
||||
self.layer_norm_hidden_state = layer_norm_hidden_state
|
||||
if layer == "hidden":
|
||||
|
||||
@@ -64,3 +64,25 @@ class SDXLClipModel(torch.nn.Module):
|
||||
class SDXLRefinerClipModel(sd1_clip.SD1ClipModel):
|
||||
def __init__(self, device="cpu", dtype=None):
|
||||
super().__init__(device=device, dtype=dtype, clip_name="g", clip_model=SDXLClipG)
|
||||
|
||||
|
||||
class StableCascadeClipGTokenizer(sd1_clip.SDTokenizer):
|
||||
def __init__(self, tokenizer_path=None, embedding_directory=None):
|
||||
super().__init__(tokenizer_path, pad_with_end=True, embedding_directory=embedding_directory, embedding_size=1280, embedding_key='clip_g')
|
||||
|
||||
class StableCascadeTokenizer(sd1_clip.SD1Tokenizer):
|
||||
def __init__(self, embedding_directory=None):
|
||||
super().__init__(embedding_directory=embedding_directory, clip_name="g", tokenizer=StableCascadeClipGTokenizer)
|
||||
|
||||
class StableCascadeClipG(sd1_clip.SDClipModel):
|
||||
def __init__(self, device="cpu", max_length=77, freeze=True, layer="hidden", layer_idx=-1, dtype=None):
|
||||
textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_config_bigg.json")
|
||||
super().__init__(device=device, freeze=freeze, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype,
|
||||
special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=False, enable_attention_masks=True)
|
||||
|
||||
def load_sd(self, sd):
|
||||
return super().load_sd(sd)
|
||||
|
||||
class StableCascadeClipModel(sd1_clip.SD1ClipModel):
|
||||
def __init__(self, device="cpu", dtype=None):
|
||||
super().__init__(device=device, dtype=dtype, clip_name="g", clip_model=StableCascadeClipG)
|
||||
|
||||
@@ -40,8 +40,8 @@ class SD15(supported_models_base.BASE):
|
||||
state_dict['cond_stage_model.transformer.text_model.embeddings.position_ids'] = ids.round()
|
||||
|
||||
replace_prefix = {}
|
||||
replace_prefix["cond_stage_model."] = "cond_stage_model.clip_l."
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
replace_prefix["cond_stage_model."] = "clip_l."
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
|
||||
return state_dict
|
||||
|
||||
def process_clip_state_dict_for_saving(self, state_dict):
|
||||
@@ -72,10 +72,10 @@ class SD20(supported_models_base.BASE):
|
||||
|
||||
def process_clip_state_dict(self, state_dict):
|
||||
replace_prefix = {}
|
||||
replace_prefix["conditioner.embedders.0.model."] = "cond_stage_model.model." #SD2 in sgm format
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
|
||||
state_dict = utils.transformers_convert(state_dict, "cond_stage_model.model.", "cond_stage_model.clip_h.transformer.text_model.", 24)
|
||||
replace_prefix["conditioner.embedders.0.model."] = "clip_h." #SD2 in sgm format
|
||||
replace_prefix["cond_stage_model.model."] = "clip_h."
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
|
||||
state_dict = utils.transformers_convert(state_dict, "clip_h.", "clip_h.transformer.text_model.", 24)
|
||||
return state_dict
|
||||
|
||||
def process_clip_state_dict_for_saving(self, state_dict):
|
||||
@@ -131,11 +131,10 @@ class SDXLRefiner(supported_models_base.BASE):
|
||||
def process_clip_state_dict(self, state_dict):
|
||||
keys_to_replace = {}
|
||||
replace_prefix = {}
|
||||
replace_prefix["conditioner.embedders.0.model."] = "clip_g."
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
|
||||
|
||||
state_dict = utils.transformers_convert(state_dict, "conditioner.embedders.0.model.", "cond_stage_model.clip_g.transformer.text_model.", 32)
|
||||
keys_to_replace["conditioner.embedders.0.model.text_projection"] = "cond_stage_model.clip_g.text_projection"
|
||||
keys_to_replace["conditioner.embedders.0.model.logit_scale"] = "cond_stage_model.clip_g.logit_scale"
|
||||
|
||||
state_dict = utils.transformers_convert(state_dict, "clip_g.", "clip_g.transformer.text_model.", 32)
|
||||
state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace)
|
||||
return state_dict
|
||||
|
||||
@@ -179,13 +178,13 @@ class SDXL(supported_models_base.BASE):
|
||||
keys_to_replace = {}
|
||||
replace_prefix = {}
|
||||
|
||||
replace_prefix["conditioner.embedders.0.transformer.text_model"] = "cond_stage_model.clip_l.transformer.text_model"
|
||||
state_dict = utils.transformers_convert(state_dict, "conditioner.embedders.1.model.", "cond_stage_model.clip_g.transformer.text_model.", 32)
|
||||
keys_to_replace["conditioner.embedders.1.model.text_projection"] = "cond_stage_model.clip_g.text_projection"
|
||||
keys_to_replace["conditioner.embedders.1.model.text_projection.weight"] = "cond_stage_model.clip_g.text_projection"
|
||||
keys_to_replace["conditioner.embedders.1.model.logit_scale"] = "cond_stage_model.clip_g.logit_scale"
|
||||
replace_prefix["conditioner.embedders.0.transformer.text_model"] = "clip_l.transformer.text_model"
|
||||
replace_prefix["conditioner.embedders.1.model."] = "clip_g."
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
|
||||
|
||||
state_dict = utils.transformers_convert(state_dict, "clip_g.", "clip_g.transformer.text_model.", 32)
|
||||
keys_to_replace["clip_g.text_projection.weight"] = "clip_g.text_projection"
|
||||
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace)
|
||||
return state_dict
|
||||
|
||||
@@ -306,5 +305,66 @@ class SD_X4Upscaler(SD20):
|
||||
out = model_base.SD_X4Upscaler(self, device=device)
|
||||
return out
|
||||
|
||||
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, Segmind_Vega, SD_X4Upscaler]
|
||||
class Stable_Cascade_C(supported_models_base.BASE):
|
||||
unet_config = {
|
||||
"stable_cascade_stage": 'c',
|
||||
}
|
||||
|
||||
unet_extra_config = {}
|
||||
|
||||
latent_format = latent_formats.SC_Prior
|
||||
supported_inference_dtypes = [torch.bfloat16, torch.float32]
|
||||
|
||||
sampling_settings = {
|
||||
"shift": 2.0,
|
||||
}
|
||||
|
||||
vae_key_prefix = ["vae."]
|
||||
text_encoder_key_prefix = ["text_encoder."]
|
||||
clip_vision_prefix = "clip_l_vision."
|
||||
|
||||
def process_unet_state_dict(self, state_dict):
|
||||
key_list = list(state_dict.keys())
|
||||
for y in ["weight", "bias"]:
|
||||
suffix = "in_proj_{}".format(y)
|
||||
keys = filter(lambda a: a.endswith(suffix), key_list)
|
||||
for k_from in keys:
|
||||
weights = state_dict.pop(k_from)
|
||||
prefix = k_from[:-(len(suffix) + 1)]
|
||||
shape_from = weights.shape[0] // 3
|
||||
for x in range(3):
|
||||
p = ["to_q", "to_k", "to_v"]
|
||||
k_to = "{}.{}.{}".format(prefix, p[x], y)
|
||||
state_dict[k_to] = weights[shape_from*x:shape_from*(x + 1)]
|
||||
return state_dict
|
||||
|
||||
def get_model(self, state_dict, prefix="", device=None):
|
||||
out = model_base.StableCascade_C(self, device=device)
|
||||
return out
|
||||
|
||||
def clip_target(self):
|
||||
return supported_models_base.ClipTarget(sdxl_clip.StableCascadeTokenizer, sdxl_clip.StableCascadeClipModel)
|
||||
|
||||
class Stable_Cascade_B(Stable_Cascade_C):
|
||||
unet_config = {
|
||||
"stable_cascade_stage": 'b',
|
||||
}
|
||||
|
||||
unet_extra_config = {}
|
||||
|
||||
latent_format = latent_formats.SC_B
|
||||
supported_inference_dtypes = [torch.float16, torch.bfloat16, torch.float32]
|
||||
|
||||
sampling_settings = {
|
||||
"shift": 1.0,
|
||||
}
|
||||
|
||||
clip_vision_prefix = None
|
||||
|
||||
def get_model(self, state_dict, prefix="", device=None):
|
||||
out = model_base.StableCascade_B(self, device=device)
|
||||
return out
|
||||
|
||||
|
||||
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B]
|
||||
models += [SVD_img2vid]
|
||||
|
||||
@@ -22,13 +22,15 @@ class BASE:
|
||||
sampling_settings = {}
|
||||
latent_format = latent_formats.LatentFormat
|
||||
vae_key_prefix = ["first_stage_model."]
|
||||
text_encoder_key_prefix = ["cond_stage_model."]
|
||||
supported_inference_dtypes = [torch.float16, torch.bfloat16, torch.float32]
|
||||
|
||||
manual_cast_dtype = None
|
||||
|
||||
@classmethod
|
||||
def matches(s, unet_config):
|
||||
for k in s.unet_config:
|
||||
if s.unet_config[k] != unet_config[k]:
|
||||
if k not in unet_config or s.unet_config[k] != unet_config[k]:
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -54,6 +56,7 @@ class BASE:
|
||||
return out
|
||||
|
||||
def process_clip_state_dict(self, state_dict):
|
||||
state_dict = utils.state_dict_prefix_replace(state_dict, {k: "" for k in self.text_encoder_key_prefix}, filter_keys=True)
|
||||
return state_dict
|
||||
|
||||
def process_unet_state_dict(self, state_dict):
|
||||
@@ -63,7 +66,7 @@ class BASE:
|
||||
return state_dict
|
||||
|
||||
def process_clip_state_dict_for_saving(self, state_dict):
|
||||
replace_prefix = {"": "cond_stage_model."}
|
||||
replace_prefix = {"": self.text_encoder_key_prefix[0]}
|
||||
return utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
|
||||
def process_clip_vision_state_dict_for_saving(self, state_dict):
|
||||
@@ -77,8 +80,9 @@ class BASE:
|
||||
return utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
|
||||
def process_vae_state_dict_for_saving(self, state_dict):
|
||||
replace_prefix = {"": "first_stage_model."}
|
||||
replace_prefix = {"": self.vae_key_prefix[0]}
|
||||
return utils.state_dict_prefix_replace(state_dict, replace_prefix)
|
||||
|
||||
def set_manual_cast(self, manual_cast_dtype):
|
||||
def set_inference_dtype(self, dtype, manual_cast_dtype):
|
||||
self.unet_config['dtype'] = dtype
|
||||
self.manual_cast_dtype = manual_cast_dtype
|
||||
|
||||
@@ -169,6 +169,8 @@ UNET_MAP_BASIC = {
|
||||
}
|
||||
|
||||
def unet_to_diffusers(unet_config):
|
||||
if "num_res_blocks" not in unet_config:
|
||||
return {}
|
||||
num_res_blocks = unet_config["num_res_blocks"]
|
||||
channel_mult = unet_config["channel_mult"]
|
||||
transformer_depth = unet_config["transformer_depth"][:]
|
||||
@@ -413,6 +415,8 @@ def tiled_scale(samples, function, tile_x=64, tile_y=64, overlap = 8, upscale_am
|
||||
out_div = torch.zeros((s.shape[0], out_channels, round(s.shape[2] * upscale_amount), round(s.shape[3] * upscale_amount)), device=output_device)
|
||||
for y in range(0, s.shape[2], tile_y - overlap):
|
||||
for x in range(0, s.shape[3], tile_x - overlap):
|
||||
x = max(0, min(s.shape[-1] - overlap, x))
|
||||
y = max(0, min(s.shape[-2] - overlap, y))
|
||||
s_in = s[:,:,y:y+tile_y,x:x+tile_x]
|
||||
|
||||
ps = function(s_in).to(output_device)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
|
||||
class CLIPTextEncodeControlnet:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {"clip": ("CLIP", ), "conditioning": ("CONDITIONING", ), "text": ("STRING", {"multiline": True})}}
|
||||
RETURN_TYPES = ("CONDITIONING",)
|
||||
FUNCTION = "encode"
|
||||
|
||||
CATEGORY = "_for_testing/conditioning"
|
||||
|
||||
def encode(self, clip, conditioning, text):
|
||||
tokens = clip.tokenize(text)
|
||||
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
|
||||
c = []
|
||||
for t in conditioning:
|
||||
n = [t[0], t[1].copy()]
|
||||
n[1]['cross_attn_controlnet'] = cond
|
||||
n[1]['pooled_output_controlnet'] = pooled
|
||||
c.append(n)
|
||||
return (c, )
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"CLIPTextEncodeControlnet": CLIPTextEncodeControlnet
|
||||
}
|
||||
@@ -48,6 +48,25 @@ class RepeatImageBatch:
|
||||
s = image.repeat((amount, 1,1,1))
|
||||
return (s,)
|
||||
|
||||
class ImageFromBatch:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": { "image": ("IMAGE",),
|
||||
"batch_index": ("INT", {"default": 0, "min": 0, "max": 63}),
|
||||
"length": ("INT", {"default": 1, "min": 1, "max": 64}),
|
||||
}}
|
||||
RETURN_TYPES = ("IMAGE",)
|
||||
FUNCTION = "frombatch"
|
||||
|
||||
CATEGORY = "image/batch"
|
||||
|
||||
def frombatch(self, image, batch_index, length):
|
||||
s_in = image
|
||||
batch_index = min(s_in.shape[0] - 1, batch_index)
|
||||
length = min(s_in.shape[0] - batch_index, length)
|
||||
s = s_in[batch_index:batch_index + length].clone()
|
||||
return (s,)
|
||||
|
||||
class SaveAnimatedWEBP:
|
||||
def __init__(self):
|
||||
self.output_dir = folder_paths.get_output_directory()
|
||||
@@ -170,6 +189,7 @@ class SaveAnimatedPNG:
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"ImageCrop": ImageCrop,
|
||||
"RepeatImageBatch": RepeatImageBatch,
|
||||
"ImageFromBatch": ImageFromBatch,
|
||||
"SaveAnimatedWEBP": SaveAnimatedWEBP,
|
||||
"SaveAnimatedPNG": SaveAnimatedPNG,
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ class LatentBatchSeedBehavior:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": { "samples": ("LATENT",),
|
||||
"seed_behavior": (["random", "fixed"],),}}
|
||||
"seed_behavior": (["random", "fixed"],{"default": "fixed"}),}}
|
||||
|
||||
RETURN_TYPES = ("LATENT",)
|
||||
FUNCTION = "op"
|
||||
|
||||
@@ -99,6 +99,32 @@ class ModelSamplingDiscrete:
|
||||
m.add_object_patch("model_sampling", model_sampling)
|
||||
return (m, )
|
||||
|
||||
class ModelSamplingStableCascade:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": { "model": ("MODEL",),
|
||||
"shift": ("FLOAT", {"default": 2.0, "min": 0.0, "max": 100.0, "step":0.01}),
|
||||
}}
|
||||
|
||||
RETURN_TYPES = ("MODEL",)
|
||||
FUNCTION = "patch"
|
||||
|
||||
CATEGORY = "advanced/model"
|
||||
|
||||
def patch(self, model, shift):
|
||||
m = model.clone()
|
||||
|
||||
sampling_base = comfy.model_sampling.StableCascadeSampling
|
||||
sampling_type = comfy.model_sampling.EPS
|
||||
|
||||
class ModelSamplingAdvanced(sampling_base, sampling_type):
|
||||
pass
|
||||
|
||||
model_sampling = ModelSamplingAdvanced(model.model.model_config)
|
||||
model_sampling.set_parameters(shift)
|
||||
m.add_object_patch("model_sampling", model_sampling)
|
||||
return (m, )
|
||||
|
||||
class ModelSamplingContinuousEDM:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
@@ -171,5 +197,6 @@ class RescaleCFG:
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"ModelSamplingDiscrete": ModelSamplingDiscrete,
|
||||
"ModelSamplingContinuousEDM": ModelSamplingContinuousEDM,
|
||||
"ModelSamplingStableCascade": ModelSamplingStableCascade,
|
||||
"RescaleCFG": RescaleCFG,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
"""
|
||||
This file is part of ComfyUI.
|
||||
Copyright (C) 2024 Stability AI
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import torch
|
||||
import nodes
|
||||
import comfy.utils
|
||||
|
||||
|
||||
class StableCascade_EmptyLatentImage:
|
||||
def __init__(self, device="cpu"):
|
||||
self.device = device
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"width": ("INT", {"default": 1024, "min": 256, "max": nodes.MAX_RESOLUTION, "step": 8}),
|
||||
"height": ("INT", {"default": 1024, "min": 256, "max": nodes.MAX_RESOLUTION, "step": 8}),
|
||||
"compression": ("INT", {"default": 42, "min": 4, "max": 128, "step": 1}),
|
||||
"batch_size": ("INT", {"default": 1, "min": 1, "max": 4096})
|
||||
}}
|
||||
RETURN_TYPES = ("LATENT", "LATENT")
|
||||
RETURN_NAMES = ("stage_c", "stage_b")
|
||||
FUNCTION = "generate"
|
||||
|
||||
CATEGORY = "_for_testing/stable_cascade"
|
||||
|
||||
def generate(self, width, height, compression, batch_size=1):
|
||||
c_latent = torch.zeros([batch_size, 16, height // compression, width // compression])
|
||||
b_latent = torch.zeros([batch_size, 4, height // 4, width // 4])
|
||||
return ({
|
||||
"samples": c_latent,
|
||||
}, {
|
||||
"samples": b_latent,
|
||||
})
|
||||
|
||||
class StableCascade_StageC_VAEEncode:
|
||||
def __init__(self, device="cpu"):
|
||||
self.device = device
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"image": ("IMAGE",),
|
||||
"vae": ("VAE", ),
|
||||
"compression": ("INT", {"default": 42, "min": 4, "max": 128, "step": 1}),
|
||||
}}
|
||||
RETURN_TYPES = ("LATENT", "LATENT")
|
||||
RETURN_NAMES = ("stage_c", "stage_b")
|
||||
FUNCTION = "generate"
|
||||
|
||||
CATEGORY = "_for_testing/stable_cascade"
|
||||
|
||||
def generate(self, image, vae, compression):
|
||||
width = image.shape[-2]
|
||||
height = image.shape[-3]
|
||||
out_width = (width // compression) * vae.downscale_ratio
|
||||
out_height = (height // compression) * vae.downscale_ratio
|
||||
|
||||
s = comfy.utils.common_upscale(image.movedim(-1,1), out_width, out_height, "bicubic", "center").movedim(1,-1)
|
||||
|
||||
c_latent = vae.encode(s[:,:,:,:3])
|
||||
b_latent = torch.zeros([c_latent.shape[0], 4, height // 4, width // 4])
|
||||
return ({
|
||||
"samples": c_latent,
|
||||
}, {
|
||||
"samples": b_latent,
|
||||
})
|
||||
|
||||
class StableCascade_StageB_Conditioning:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": { "conditioning": ("CONDITIONING",),
|
||||
"stage_c": ("LATENT",),
|
||||
}}
|
||||
RETURN_TYPES = ("CONDITIONING",)
|
||||
|
||||
FUNCTION = "set_prior"
|
||||
|
||||
CATEGORY = "_for_testing/stable_cascade"
|
||||
|
||||
def set_prior(self, conditioning, stage_c):
|
||||
c = []
|
||||
for t in conditioning:
|
||||
d = t[1].copy()
|
||||
d['stable_cascade_prior'] = stage_c['samples']
|
||||
n = [t[0], d]
|
||||
c.append(n)
|
||||
return (c, )
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"StableCascade_EmptyLatentImage": StableCascade_EmptyLatentImage,
|
||||
"StableCascade_StageB_Conditioning": StableCascade_StageB_Conditioning,
|
||||
"StableCascade_StageC_VAEEncode": StableCascade_StageC_VAEEncode,
|
||||
}
|
||||
+244
-252
@@ -1,257 +1,249 @@
|
||||
** ComfyUI startup time: 2024-02-03 21:05:40.485965
|
||||
[2024-02-03 21:05] ** Platform: Linux
|
||||
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-03 21:05]
|
||||
** ComfyUI startup time: 2024-02-20 07:57:36.757969
|
||||
[2024-02-20 07:57] ** Platform: Linux
|
||||
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-20 07:57]
|
||||
Prestartup times for custom nodes:
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-03 21:05] ****** User settings have been changed to be stored on the server instead of browser storage. ******
|
||||
[2024-02-03 21:05] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
|
||||
[2024-02-03 21:05]
[36mEfficiency Nodes:[0m Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...[92mSuccess![0m
|
||||
[2024-02-03 21:05] [93mEfficiency Nodes Warning:[0m Failed to import python package 'simpleeval'; related nodes disabled.
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3)
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating subpack
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
|
||||
[2024-02-03 21:05] Collecting GitPython
|
||||
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB)
|
||||
[2024-02-03 21:05] Collecting gitdb<5,>=4.0.1
|
||||
[2024-02-03 21:05] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
|
||||
[2024-02-03 21:05] Collecting smmap<6,>=3.0.1
|
||||
[2024-02-03 21:05] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
|
||||
[2024-02-03 21:05] Installing collected packages: smmap, gitdb, GitPython
|
||||
[2024-02-03 21:05] Successfully installed GitPython-3.1.41 gitdb-4.0.11 smmap-5.0.1
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1707271547&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI3MTU0N319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=gO2u6BHHN041QdWEenk3PJJ%7EhG3Tu7VRc1dirPXQpC8MBc4Ifs3Qb3Og0wDiJlsO14jRkodYAfxYQfZUfTnvbHLwVf9amr1BeVUDXdveTgReZG5do79je4MdE-OkcFscsctQFxjMWiPPFc96MWYDPsBloV8xos6YNYXTdPPB2efa19nFNFP56hwbjSbenkEE3Detf7j0m4ta%7ExwlvMDiUQArg8bJm27FQu-Kkj7JXg01Y9jR1exiBm7P9FXT4zLA0M2kIbB87CDsjN0Rc9c3cSMyg0GhqGu%7Enh404cPbY5Cp1HbDvEUoodC2rDQhqTbiUu-D1BIH4TKG7ICYjrV-Jw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
|
||||
[2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
|
||||
[2024-02-20 07:57]
[36mEfficiency Nodes:[0m Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...[92mSuccess![0m
|
||||
[2024-02-20 07:57] [93mEfficiency Nodes Warning:[0m Failed to import python package 'simpleeval'; related nodes disabled.
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
|
||||
[2024-02-20 07:57] Collecting GitPython
|
||||
[2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
|
||||
[2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
|
||||
[2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
|
||||
[2024-02-20 07:57] Collecting smmap<6,>=3.0.1
|
||||
[2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
|
||||
[2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
|
||||
[2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1708700672&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMDY3Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YqPhukw4gdolcqysRQfZPHDbxzji5-x5N1afxX14%7E2Djh%7EUQVRNqFfDFdRJ1nKdleqCAKaafGcQUQbvFHtRq4C--en9fYAComs8mKWrcBan1vUgMFg8QTWWig5x0nBiJe1A8eCoQ7D7qyR8sx7SukcQf62xhEe0H3GVA94aAWIy0AW29WhaUeAM7MQw0DjCbaOCejOQn8neMrqUjjlsux1AwSlw%7EBJU2kk3ZBekzonX2zag7GQoht0lwopD-y0XQ7WH%7ELPaD1VOWphpdq59ZZhIs515Nz7HyVckx6YtvOzJnsaCVMBDPls9sUHhBMd5i54E8RudbHu9uBpZWWe3haQ__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 51996128/51996128 [00:00<00:00, 82768130.39it/s]
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1707267882&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2Nzg4Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=rSo6jzXkXXBX0UqUzGSLHwPnR-utKCLRx%7EZqDCu7P01C%7EXkHoOz6urAqNu4S1MR5dbozl4UA1S%7EikO95CdhqCEgUbavkbRIoemWUALHcqAMEDS4S52NRNvAriED2WcL0JcUHCxa3VYo8xBgYYFdyP7cj8H0LGDzJqNk9HH2wh2hkY0jwsilpD1XL2b5iawwTLuop6mqdsnwpxYfY1JHCUhSEJh3oDG-LgQiwqOY90sTdDlVkImP8Pr4jQy0KU29B%7EZcGuOrFPkFQm8ajy8ZfggEK2BJOYvWT501M125DVWmsw8xbXilLRAnvXTP276QFKHbMie5piQ0inwmcE-mRhw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1708703860&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMzg2MH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=WVG1I3otJ5Ly6l60OQafoATYQdskZxwTNQBmHrHmNyFRx7SPqOUKViTgQyweq03mxnLh1H0aKl0WDXr%7EJ0yy18OsSYN09GZD77uNDGqAaPO8m20KwJySinKRfbbFZmYo1dwEKmG1-mYXqUxOBhdPRo9pKXkguPzGy1APjpSlDz4zqBlsginzyzrYIpbeZ3an1d4JtihzITVzOyRGOPL1kE6H87gK9faOv1cjWIj2QJL9Fx2YepNDdCtVeHapnEH9v7HvYrcz268nVtRXBUmP9P3JdClKBIR-lq9CHic02INNEJQHG7-hXGD-RZl3A%7EB4hdNP8Nf%7EtRmpL8yu6pgEww__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 22484536/22484536 [00:00<00:00, 76459125.60it/s]
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1707268213&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2ODIxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=furDvMunH-c4MWMYZA7AZeKyBE4gscdQeKgna6MFJmx4Lb5-TBs0LcIbMSEgTexlaK%7EUxNsFOeseZLI9rfnnVVYGS7MgyGNlucus60DQOIzR4x%7EtGChq-WtSiTmFX5p1gkc51ativvYWp2K-qyXO0Kminc6YHq1OpYFfWHguJ-V83LbQe61J1VPaUW%7ES2hZEV927r-tK81rSLRzQOB5NFTibMDrqXsV6yTyEaerjczsXsrAoPVr5ibHMhtAfV5gcIeIO5Nuc4nSXQgw75H4Xnf%7E5f6Uzi-wtiKKgHaDVdazTMqkdyWSggr-cxSnFag%7ETZW-nol6kTmbJ17uh084uGg__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1708702215&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMjIxNX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=HOG-dw%7EPHSKUMmad-wwtHqqY7PnOinwIKJUv7IM-Ui5GXq7NFg-spyPkbJXwqkB5LVWxC5l-aWQDBzxVpQisLiu47YPo%7EUPAJ86DU%7EDdvHN7DEOBJoUqwjWYlfudwfNvLyE7DfEGM3xKh7gctMnD2DengytQ4rZrk4vWzrh9fXYamwLMFPr8QfdgwFdinUqZUt0WAkzZUVOeR8Vm42KTL40LKor9JZzQuzlNy5ul0jal1SudRYH3vank8ld1KMa0wsKVs2WUiMaEldAIXtMSqsCNNiKiu0v2ibamMmv4-Xy5FNetmkYH3s5IjBpdyRO127EuCz0EZttV4Lloe7SCvw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 54791722/54791722 [00:00<00:00, 90788474.85it/s]
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Collecting ultralytics!=8.0.177
|
||||
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3)
|
||||
[2024-02-03 21:05] Collecting seaborn>=0.11.0
|
||||
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-03 21:05] Collecting pandas>=1.1.4
|
||||
[2024-02-03 21:05] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-03 21:05] Collecting py-cpuinfo
|
||||
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
|
||||
[2024-02-03 21:05] Collecting thop>=0.1.1
|
||||
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-03 21:05] Collecting pytz>=2020.1
|
||||
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
|
||||
[2024-02-03 21:05] Collecting tzdata>=2022.7
|
||||
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-03 21:05] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
|
||||
[2024-02-03 21:05] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2023.4 ultralytics-8.1.9
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Requirement already satisfied: ultralytics!=8.0.177 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.9)
|
||||
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: seaborn>=0.11.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: py-cpuinfo in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: thop>=0.1.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pandas>=1.1.4 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pytz>=2020.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tzdata>=2022.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.4)
|
||||
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
|
||||
[2024-02-03 21:05] Collecting segment-anything
|
||||
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB)
|
||||
[2024-02-03 21:05] Collecting scikit-image
|
||||
[2024-02-03 21:06] Using cached scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB)
|
||||
[2024-02-03 21:06] Collecting piexif
|
||||
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
|
||||
[2024-02-03 21:06] Collecting opencv-python-headless
|
||||
[2024-02-03 21:06] Using cached opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.6 MB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.41)
|
||||
[2024-02-03 21:06] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
|
||||
[2024-02-03 21:06] Collecting lazy_loader>=0.3
|
||||
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.33.1)
|
||||
[2024-02-03 21:06] Collecting tifffile>=2022.8.12
|
||||
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.3)
|
||||
[2024-02-03 21:06] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
|
||||
[2024-02-03 21:06] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
|
||||
[2024-02-03 21:06] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
|
||||
[2024-02-03 21:06] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
|
||||
[2024-02-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image
|
||||
[2024-02-03 21:06] Successfully installed lazy_loader-0.3 opencv-python-headless-4.9.0.80 piexif-1.1.3 scikit-image-0.22.0 segment-anything-1.0 tifffile-2024.1.30
|
||||
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: Check basic models
|
||||
[2024-02-03 21:06] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
|
||||
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s]
|
||||
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: onnx model directory created (/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
|
||||
[2024-02-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
|
||||
[2024-02-03 21:06] [Impact Pack] Wildcards loading done.
|
||||
[2024-02-03 21:06] [AnimateDiffEvo] - [0;31mERROR[0m - No motion models found. Please download one and place in: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mCreated default conf file at `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mOpenCV Python FFMPEG support is enabled[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite [93mWarning: [0m`ffmpeg_bin_path` is not set in `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mFinished.[0m [32mLoaded[0m [0m211[0m [32mnodes successfully.[0m
|
||||
[2024-02-03 21:06]
|
||||
[3m[93m"Opportunities don't happen. You create them."[0m[3m - Chris Grosser[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] [VideoHelperSuite] - [0;33mWARNING[0m - Failed to import imageio_ffmpeg
|
||||
[2024-02-03 21:06] [34mFizzleDorf Custom Nodes: [92mLoaded[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] [92m[rgthree] Loaded 33 epic nodes.[0m
|
||||
[2024-02-03 21:06] [92m[rgthree] Will use rgthree's optimized recursive execution.[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Collecting requirements-parser
|
||||
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
|
||||
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0
|
||||
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB)
|
||||
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser
|
||||
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Command executed successfully!
|
||||
[2024-02-03 21:06] [36;20m[comfy_mtb] | INFO -> loaded [96m53[0m nodes successfuly[0m
|
||||
[2024-02-03 21:06] [36;20m[comfy_mtb] | INFO -> Some nodes (12) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.[0m
|
||||
[2024-02-03 21:06] /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux/node_wrappers/dwpose.py:26: UserWarning: DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly
|
||||
warnings.warn("DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly")
|
||||
[2024-02-03 21:06] ### Loading: ComfyUI-Manager (V2.7)
|
||||
[2024-02-03 21:06] ### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Collecting ultralytics!=8.0.177
|
||||
[2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-20 07:57] Collecting seaborn>=0.11.0
|
||||
[2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Collecting py-cpuinfo
|
||||
[2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-20 07:57] Collecting thop>=0.1.1
|
||||
[2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
|
||||
[2024-02-20 07:57] Collecting pandas>=1.1.4
|
||||
[2024-02-20 07:57] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-20 07:57] Collecting tzdata>=2022.7
|
||||
[2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
|
||||
[2024-02-20 07:57] Collecting pytz>=2020.1
|
||||
[2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
|
||||
[2024-02-20 07:57] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2024.1 ultralytics-8.1.16
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Requirement already satisfied: ultralytics!=8.0.177 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.16)
|
||||
[2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: py-cpuinfo in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pandas>=1.1.4 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: seaborn>=0.11.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: thop>=0.1.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tzdata>=2022.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pytz>=2020.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
|
||||
[2024-02-20 07:57] Requirement already satisfied: segment-anything in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 1)) (1.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scikit-image in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.22.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: piexif in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 3)) (1.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python-headless in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 5)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.42)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.34.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tifffile>=2022.8.12 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2024.2.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: lazy_loader>=0.3 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
|
||||
[2024-02-20 07:57] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
|
||||
[2024-02-20 07:57] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
|
||||
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: onnx model directory created (/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
|
||||
[2024-02-20 07:57] [Impact Pack] Wildcards loading done.
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] [92m[rgthree] Loaded 34 magnificent nodes.[0m
|
||||
[2024-02-20 07:57] [92m[rgthree] Will use rgthree's optimized recursive execution.[0m
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
|
||||
[2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
|
||||
[2024-02-20 07:58] [VideoHelperSuite] - [0;33mWARNING[0m - Failed to import imageio_ffmpeg
|
||||
[2024-02-20 07:58] [AnimateDiffEvo] - [0;31mERROR[0m - No motion models found. Please download one and place in: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
|
||||
[2024-02-20 07:58] [34mFizzleDorf Custom Nodes: [92mLoaded[0m
|
||||
[2024-02-20 07:58] Collecting requirements-parser
|
||||
[2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
|
||||
[2024-02-20 07:58] Collecting types-setuptools>=57.0.0
|
||||
[2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
|
||||
[2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
|
||||
[2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] Command executed successfully!
|
||||
[2024-02-20 07:58] [36;20m[comfy_mtb] | INFO -> loaded [96m55[0m nodes successfuly[0m
|
||||
[2024-02-20 07:58] [36;20m[comfy_mtb] | INFO -> Some nodes (10) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mCreated default conf file at `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mOpenCV Python FFMPEG support is enabled[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite [93mWarning: [0m`ffmpeg_bin_path` is not set in `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mFinished.[0m [32mLoaded[0m [0m211[0m [32mnodes successfully.[0m
|
||||
[2024-02-20 07:58]
|
||||
[3m[93m"Creativity takes courage."[0m[3m - Henri Matisse[0m
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58]
|
||||
Import times for custom nodes:
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
|
||||
[2024-02-03 21:06] 0.9 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
|
||||
[2024-02-03 21:06] 1.3 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
|
||||
[2024-02-03 21:06] 2.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
|
||||
[2024-02-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Starting server
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] To see the GUI go to: http://127.0.0.1:8188
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
|
||||
[2024-02-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
|
||||
[2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
|
||||
[2024-02-20 07:58] 0.5 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
|
||||
[2024-02-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
|
||||
[2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
|
||||
[2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
|
||||
[2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] Starting server
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
|
||||
|
||||
@@ -1,267 +1,259 @@
|
||||
** ComfyUI startup time: 2024-02-03 21:05:40.484447
|
||||
[2024-02-03 21:05] ** Platform: Linux
|
||||
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-03 21:05]
|
||||
** ComfyUI startup time: 2024-02-20 07:57:36.757364
|
||||
[2024-02-20 07:57] ** Platform: Linux
|
||||
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-20 07:57]
|
||||
Prestartup times for custom nodes:
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-03 21:05] ** ComfyUI startup time: 2024-02-03 21:05:40.485965
|
||||
[2024-02-03 21:05] ** Platform: Linux
|
||||
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ** ComfyUI startup time: 2024-02-20 07:57:36.757969
|
||||
[2024-02-20 07:57] ** Platform: Linux
|
||||
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
|
||||
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
|
||||
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
|
||||
[2024-02-20 07:57]
|
||||
Prestartup times for custom nodes:
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-03 21:05] ****** User settings have been changed to be stored on the server instead of browser storage. ******
|
||||
[2024-02-03 21:05] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
|
||||
[2024-02-03 21:05]
[36mEfficiency Nodes:[0m Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...[92mSuccess![0m
|
||||
[2024-02-03 21:05] [93mEfficiency Nodes Warning:[0m Failed to import python package 'simpleeval'; related nodes disabled.
|
||||
[2024-02-03 21:05]
|
||||
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3)
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies
|
||||
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating subpack
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
|
||||
[2024-02-03 21:05] Collecting GitPython
|
||||
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB)
|
||||
[2024-02-03 21:05] Collecting gitdb<5,>=4.0.1
|
||||
[2024-02-03 21:05] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
|
||||
[2024-02-03 21:05] Collecting smmap<6,>=3.0.1
|
||||
[2024-02-03 21:05] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
|
||||
[2024-02-03 21:05] Installing collected packages: smmap, gitdb, GitPython
|
||||
[2024-02-03 21:05] Successfully installed GitPython-3.1.41 gitdb-4.0.11 smmap-5.0.1
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1707271547&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI3MTU0N319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=gO2u6BHHN041QdWEenk3PJJ%7EhG3Tu7VRc1dirPXQpC8MBc4Ifs3Qb3Og0wDiJlsO14jRkodYAfxYQfZUfTnvbHLwVf9amr1BeVUDXdveTgReZG5do79je4MdE-OkcFscsctQFxjMWiPPFc96MWYDPsBloV8xos6YNYXTdPPB2efa19nFNFP56hwbjSbenkEE3Detf7j0m4ta%7ExwlvMDiUQArg8bJm27FQu-Kkj7JXg01Y9jR1exiBm7P9FXT4zLA0M2kIbB87CDsjN0Rc9c3cSMyg0GhqGu%7Enh404cPbY5Cp1HbDvEUoodC2rDQhqTbiUu-D1BIH4TKG7ICYjrV-Jw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
|
||||
[2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
|
||||
[2024-02-20 07:57]
[36mEfficiency Nodes:[0m Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...[92mSuccess![0m
|
||||
[2024-02-20 07:57] [93mEfficiency Nodes Warning:[0m Failed to import python package 'simpleeval'; related nodes disabled.
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
|
||||
[2024-02-20 07:57] Collecting GitPython
|
||||
[2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
|
||||
[2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
|
||||
[2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
|
||||
[2024-02-20 07:57] Collecting smmap<6,>=3.0.1
|
||||
[2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
|
||||
[2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
|
||||
[2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1708700672&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMDY3Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YqPhukw4gdolcqysRQfZPHDbxzji5-x5N1afxX14%7E2Djh%7EUQVRNqFfDFdRJ1nKdleqCAKaafGcQUQbvFHtRq4C--en9fYAComs8mKWrcBan1vUgMFg8QTWWig5x0nBiJe1A8eCoQ7D7qyR8sx7SukcQf62xhEe0H3GVA94aAWIy0AW29WhaUeAM7MQw0DjCbaOCejOQn8neMrqUjjlsux1AwSlw%7EBJU2kk3ZBekzonX2zag7GQoht0lwopD-y0XQ7WH%7ELPaD1VOWphpdq59ZZhIs515Nz7HyVckx6YtvOzJnsaCVMBDPls9sUHhBMd5i54E8RudbHu9uBpZWWe3haQ__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 51996128/51996128 [00:00<00:00, 82768130.39it/s]
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1707267882&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2Nzg4Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=rSo6jzXkXXBX0UqUzGSLHwPnR-utKCLRx%7EZqDCu7P01C%7EXkHoOz6urAqNu4S1MR5dbozl4UA1S%7EikO95CdhqCEgUbavkbRIoemWUALHcqAMEDS4S52NRNvAriED2WcL0JcUHCxa3VYo8xBgYYFdyP7cj8H0LGDzJqNk9HH2wh2hkY0jwsilpD1XL2b5iawwTLuop6mqdsnwpxYfY1JHCUhSEJh3oDG-LgQiwqOY90sTdDlVkImP8Pr4jQy0KU29B%7EZcGuOrFPkFQm8ajy8ZfggEK2BJOYvWT501M125DVWmsw8xbXilLRAnvXTP276QFKHbMie5piQ0inwmcE-mRhw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1708703860&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMzg2MH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=WVG1I3otJ5Ly6l60OQafoATYQdskZxwTNQBmHrHmNyFRx7SPqOUKViTgQyweq03mxnLh1H0aKl0WDXr%7EJ0yy18OsSYN09GZD77uNDGqAaPO8m20KwJySinKRfbbFZmYo1dwEKmG1-mYXqUxOBhdPRo9pKXkguPzGy1APjpSlDz4zqBlsginzyzrYIpbeZ3an1d4JtihzITVzOyRGOPL1kE6H87gK9faOv1cjWIj2QJL9Fx2YepNDdCtVeHapnEH9v7HvYrcz268nVtRXBUmP9P3JdClKBIR-lq9CHic02INNEJQHG7-hXGD-RZl3A%7EB4hdNP8Nf%7EtRmpL8yu6pgEww__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 22484536/22484536 [00:00<00:00, 76459125.60it/s]
|
||||
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1707268213&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2ODIxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=furDvMunH-c4MWMYZA7AZeKyBE4gscdQeKgna6MFJmx4Lb5-TBs0LcIbMSEgTexlaK%7EUxNsFOeseZLI9rfnnVVYGS7MgyGNlucus60DQOIzR4x%7EtGChq-WtSiTmFX5p1gkc51ativvYWp2K-qyXO0Kminc6YHq1OpYFfWHguJ-V83LbQe61J1VPaUW%7ES2hZEV927r-tK81rSLRzQOB5NFTibMDrqXsV6yTyEaerjczsXsrAoPVr5ibHMhtAfV5gcIeIO5Nuc4nSXQgw75H4Xnf%7E5f6Uzi-wtiKKgHaDVdazTMqkdyWSggr-cxSnFag%7ETZW-nol6kTmbJ17uh084uGg__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
|
||||
[2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1708702215&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMjIxNX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=HOG-dw%7EPHSKUMmad-wwtHqqY7PnOinwIKJUv7IM-Ui5GXq7NFg-spyPkbJXwqkB5LVWxC5l-aWQDBzxVpQisLiu47YPo%7EUPAJ86DU%7EDdvHN7DEOBJoUqwjWYlfudwfNvLyE7DfEGM3xKh7gctMnD2DengytQ4rZrk4vWzrh9fXYamwLMFPr8QfdgwFdinUqZUt0WAkzZUVOeR8Vm42KTL40LKor9JZzQuzlNy5ul0jal1SudRYH3vank8ld1KMa0wsKVs2WUiMaEldAIXtMSqsCNNiKiu0v2ibamMmv4-Xy5FNetmkYH3s5IjBpdyRO127EuCz0EZttV4Lloe7SCvw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
|
||||
|
||||
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 54791722/54791722 [00:00<00:00, 90788474.85it/s]
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Collecting ultralytics!=8.0.177
|
||||
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3)
|
||||
[2024-02-03 21:05] Collecting seaborn>=0.11.0
|
||||
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-03 21:05] Collecting pandas>=1.1.4
|
||||
[2024-02-03 21:05] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-03 21:05] Collecting py-cpuinfo
|
||||
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
|
||||
[2024-02-03 21:05] Collecting thop>=0.1.1
|
||||
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-03 21:05] Collecting pytz>=2020.1
|
||||
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
|
||||
[2024-02-03 21:05] Collecting tzdata>=2022.7
|
||||
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 kB)
|
||||
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-03 21:05] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
|
||||
[2024-02-03 21:05] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2023.4 ultralytics-8.1.9
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-03 21:05] Requirement already satisfied: ultralytics!=8.0.177 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.9)
|
||||
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: seaborn>=0.11.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: py-cpuinfo in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: thop>=0.1.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pandas>=1.1.4 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: pytz>=2020.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: tzdata>=2022.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.4)
|
||||
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
|
||||
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
|
||||
[2024-02-03 21:05] Collecting segment-anything
|
||||
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB)
|
||||
[2024-02-03 21:05] Collecting scikit-image
|
||||
[2024-02-03 21:06] Using cached scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB)
|
||||
[2024-02-03 21:06] Collecting piexif
|
||||
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
|
||||
[2024-02-03 21:06] Collecting opencv-python-headless
|
||||
[2024-02-03 21:06] Using cached opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.6 MB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.41)
|
||||
[2024-02-03 21:06] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
|
||||
[2024-02-03 21:06] Collecting lazy_loader>=0.3
|
||||
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.33.1)
|
||||
[2024-02-03 21:06] Collecting tifffile>=2022.8.12
|
||||
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB)
|
||||
[2024-02-03 21:06] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.3)
|
||||
[2024-02-03 21:06] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
|
||||
[2024-02-03 21:06] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
|
||||
[2024-02-03 21:06] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
|
||||
[2024-02-03 21:06] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
|
||||
[2024-02-03 21:06] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
|
||||
[2024-02-03 21:06] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.0)
|
||||
[2024-02-03 21:06] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
|
||||
[2024-02-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image
|
||||
[2024-02-03 21:06] Successfully installed lazy_loader-0.3 opencv-python-headless-4.9.0.80 piexif-1.1.3 scikit-image-0.22.0 segment-anything-1.0 tifffile-2024.1.30
|
||||
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: Check basic models
|
||||
[2024-02-03 21:06] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
|
||||
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s]
|
||||
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: onnx model directory created (/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
|
||||
[2024-02-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
|
||||
[2024-02-03 21:06] [Impact Pack] Wildcards loading done.
|
||||
[2024-02-03 21:06] [AnimateDiffEvo] - [0;31mERROR[0m - No motion models found. Please download one and place in: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mCreated default conf file at `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mOpenCV Python FFMPEG support is enabled[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite [93mWarning: [0m`ffmpeg_bin_path` is not set in `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.[0m
|
||||
[2024-02-03 21:06] [34mWAS Node Suite: [0mFinished.[0m [32mLoaded[0m [0m211[0m [32mnodes successfully.[0m
|
||||
[2024-02-03 21:06]
|
||||
[3m[93m"Opportunities don't happen. You create them."[0m[3m - Chris Grosser[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] [VideoHelperSuite] - [0;33mWARNING[0m - Failed to import imageio_ffmpeg
|
||||
[2024-02-03 21:06] [34mFizzleDorf Custom Nodes: [92mLoaded[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] [92m[rgthree] Loaded 33 epic nodes.[0m
|
||||
[2024-02-03 21:06] [92m[rgthree] Will use rgthree's optimized recursive execution.[0m
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Collecting requirements-parser
|
||||
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
|
||||
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0
|
||||
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB)
|
||||
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser
|
||||
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Command executed successfully!
|
||||
[2024-02-03 21:06] [36;20m[comfy_mtb] | INFO -> loaded [96m53[0m nodes successfuly[0m
|
||||
[2024-02-03 21:06] [36;20m[comfy_mtb] | INFO -> Some nodes (12) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.[0m
|
||||
[2024-02-03 21:06] /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux/node_wrappers/dwpose.py:26: UserWarning: DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly
|
||||
warnings.warn("DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly")
|
||||
[2024-02-03 21:06] ### Loading: ComfyUI-Manager (V2.7)
|
||||
[2024-02-03 21:06] ### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Collecting ultralytics!=8.0.177
|
||||
[2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-20 07:57] Collecting seaborn>=0.11.0
|
||||
[2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Collecting py-cpuinfo
|
||||
[2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-20 07:57] Collecting thop>=0.1.1
|
||||
[2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
|
||||
[2024-02-20 07:57] Collecting pandas>=1.1.4
|
||||
[2024-02-20 07:57] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-20 07:57] Collecting tzdata>=2022.7
|
||||
[2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
|
||||
[2024-02-20 07:57] Collecting pytz>=2020.1
|
||||
[2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
|
||||
[2024-02-20 07:57] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2024.1 ultralytics-8.1.16
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
|
||||
[2024-02-20 07:57] Requirement already satisfied: ultralytics!=8.0.177 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.16)
|
||||
[2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: py-cpuinfo in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pandas>=1.1.4 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: seaborn>=0.11.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: thop>=0.1.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tzdata>=2022.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pytz>=2020.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
|
||||
[2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
|
||||
[2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
|
||||
[2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
|
||||
[2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
|
||||
[2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
|
||||
[2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
|
||||
[2024-02-20 07:57] Requirement already satisfied: segment-anything in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 1)) (1.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scikit-image in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.22.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: piexif in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 3)) (1.1.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: opencv-python-headless in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 5)) (4.9.0.80)
|
||||
[2024-02-20 07:57] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.42)
|
||||
[2024-02-20 07:57] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.34.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tifffile>=2022.8.12 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2024.2.12)
|
||||
[2024-02-20 07:57] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: lazy_loader>=0.3 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.4)
|
||||
[2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
|
||||
[2024-02-20 07:57] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
|
||||
[2024-02-20 07:57] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
|
||||
[2024-02-20 07:57] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
|
||||
[2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.1)
|
||||
[2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
|
||||
[2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
|
||||
[2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
|
||||
[2024-02-20 07:57] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
|
||||
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
|
||||
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: onnx model directory created (/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
|
||||
[2024-02-20 07:57] [Impact Pack] Wildcards loading done.
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] [92m[rgthree] Loaded 34 magnificent nodes.[0m
|
||||
[2024-02-20 07:57] [92m[rgthree] Will use rgthree's optimized recursive execution.[0m
|
||||
[2024-02-20 07:57]
|
||||
[2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
|
||||
[2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
|
||||
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
|
||||
[2024-02-20 07:58] [VideoHelperSuite] - [0;33mWARNING[0m - Failed to import imageio_ffmpeg
|
||||
[2024-02-20 07:58] [AnimateDiffEvo] - [0;31mERROR[0m - No motion models found. Please download one and place in: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
|
||||
[2024-02-20 07:58] [34mFizzleDorf Custom Nodes: [92mLoaded[0m
|
||||
[2024-02-20 07:58] Collecting requirements-parser
|
||||
[2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
|
||||
[2024-02-20 07:58] Collecting types-setuptools>=57.0.0
|
||||
[2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
|
||||
[2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
|
||||
[2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] Command executed successfully!
|
||||
[2024-02-20 07:58] [36;20m[comfy_mtb] | INFO -> loaded [96m55[0m nodes successfuly[0m
|
||||
[2024-02-20 07:58] [36;20m[comfy_mtb] | INFO -> Some nodes (10) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mCreated default conf file at `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mOpenCV Python FFMPEG support is enabled[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite [93mWarning: [0m`ffmpeg_bin_path` is not set in `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.[0m
|
||||
[2024-02-20 07:58] [34mWAS Node Suite: [0mFinished.[0m [32mLoaded[0m [0m211[0m [32mnodes successfully.[0m
|
||||
[2024-02-20 07:58]
|
||||
[3m[93m"Creativity takes courage."[0m[3m - Henri Matisse[0m
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58]
|
||||
Import times for custom nodes:
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
|
||||
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
|
||||
[2024-02-03 21:06] 0.9 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
|
||||
[2024-02-03 21:06] 1.3 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
|
||||
[2024-02-03 21:06] 2.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
|
||||
[2024-02-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] Starting server
|
||||
[2024-02-03 21:06]
|
||||
[2024-02-03 21:06] To see the GUI go to: http://127.0.0.1:8188
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
|
||||
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
|
||||
[2024-02-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
|
||||
[2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
|
||||
[2024-02-20 07:58] 0.5 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
|
||||
[2024-02-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
|
||||
[2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
|
||||
[2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
|
||||
[2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] Starting server
|
||||
[2024-02-20 07:58]
|
||||
[2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# ComfyUI-Advanced-ControlNet
|
||||
Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks. The ControlNet nodes here fully support sliding context sampling, like the one used in the [ComfyUI-AnimateDiff-Evolved](https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved) nodes. Currently supports ControlNets, T2IAdapters, ControlLoRAs, ControlLLLite, and SparseCtrls.
|
||||
Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks. The ControlNet nodes here fully support sliding context sampling, like the one used in the [ComfyUI-AnimateDiff-Evolved](https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved) nodes. Currently supports ControlNets, T2IAdapters, ControlLoRAs, ControlLLLite, SparseCtrls, and SVD-ControlNets.
|
||||
|
||||
Custom weights allow replication of the "My prompt is more important" feature of Auto1111's sd-webui ControlNet extension.
|
||||
|
||||
@@ -12,6 +12,8 @@ ControlNet preprocessors are available through [comfyui_controlnet_aux](https://
|
||||
- ControlNet, T2IAdapter, and ControlLoRA support for sliding context windows.
|
||||
- ControlLLLite support (requires model_optional to be passed into and out of Apply Advanced ControlNet node)
|
||||
- SparseCtrl support
|
||||
- SVD-ControlNet support
|
||||
- Stable Video Diffusion ControlNets trained by **CiaraRowles**: [Depth](https://huggingface.co/CiaraRowles/temporal-controlnet-depth-svd-v1/tree/main/controlnet), [Lineart](https://huggingface.co/CiaraRowles/temporal-controlnet-lineart-svd-v1/tree/main/controlnet)
|
||||
|
||||
## Table of Contents:
|
||||
- [Scheduling Explanation](#scheduling-explanation)
|
||||
|
||||
+311
-23
@@ -12,6 +12,7 @@ from model_patcher import ModelPatcher
|
||||
|
||||
from .control_sparsectrl import SparseControlNet, SparseCtrlMotionWrapper, SparseMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper
|
||||
from .control_lllite import LLLiteModule, LLLitePatch
|
||||
from .control_svd import svd_unet_config_from_diffusers_unet, SVDControlNet, svd_unet_to_diffusers
|
||||
from .utils import (AdvancedControlBase, TimestepKeyframeGroup, LatentKeyframeGroup, ControlWeightType, ControlWeights, WeightTypeException,
|
||||
manual_cast_clean_groupnorm, disable_weight_init_clean_groupnorm, prepare_mask_batch, get_properly_arranged_t2i_weights, load_torch_file_with_dict_factory)
|
||||
from .logger import logger
|
||||
@@ -64,7 +65,7 @@ class ControlNetAdvanced(ControlNet, AdvancedControlBase):
|
||||
# prepare mask_cond_hint
|
||||
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number, dtype=dtype)
|
||||
|
||||
context = cond['c_crossattn']
|
||||
context = cond.get('crossattn_controlnet', cond['c_crossattn'])
|
||||
# uses 'y' in new ComfyUI update
|
||||
y = cond.get('y', None)
|
||||
if y is None: # TODO: remove this in the future since no longer used by newest ComfyUI
|
||||
@@ -168,6 +169,71 @@ class ControlLoraAdvanced(ControlLora, AdvancedControlBase):
|
||||
global_average_pooling=v.global_average_pooling, device=v.device)
|
||||
|
||||
|
||||
class SVDControlNetAdvanced(ControlNetAdvanced):
|
||||
def __init__(self, control_model: SVDControlNet, timestep_keyframes: TimestepKeyframeGroup, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None):
|
||||
super().__init__(control_model=control_model, timestep_keyframes=timestep_keyframes, global_average_pooling=global_average_pooling, device=device, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
|
||||
|
||||
def set_cond_hint(self, *args, **kwargs):
|
||||
to_return = super().set_cond_hint(*args, **kwargs)
|
||||
# cond hint for SVD-ControlNet needs to be scaled between (-1, 1) instead of (0, 1)
|
||||
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
|
||||
return to_return
|
||||
|
||||
def get_control_advanced(self, x_noisy, t, cond, batched_number):
|
||||
control_prev = None
|
||||
if self.previous_controlnet is not None:
|
||||
control_prev = self.previous_controlnet.get_control(x_noisy, t, cond, batched_number)
|
||||
|
||||
if self.timestep_range is not None:
|
||||
if t[0] > self.timestep_range[0] or t[0] < self.timestep_range[1]:
|
||||
if control_prev is not None:
|
||||
return control_prev
|
||||
else:
|
||||
return None
|
||||
|
||||
dtype = self.control_model.dtype
|
||||
if self.manual_cast_dtype is not None:
|
||||
dtype = self.manual_cast_dtype
|
||||
|
||||
output_dtype = x_noisy.dtype
|
||||
# make cond_hint appropriate dimensions
|
||||
# TODO: change this to not require cond_hint upscaling every step when self.sub_idxs are present
|
||||
if self.sub_idxs is not None or self.cond_hint is None or x_noisy.shape[2] * 8 != self.cond_hint.shape[2] or x_noisy.shape[3] * 8 != self.cond_hint.shape[3]:
|
||||
if self.cond_hint is not None:
|
||||
del self.cond_hint
|
||||
self.cond_hint = None
|
||||
# if self.cond_hint_original length greater or equal to real latent count, subdivide it before scaling
|
||||
if self.sub_idxs is not None and self.cond_hint_original.size(0) >= self.full_latent_length:
|
||||
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original[self.sub_idxs], x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
|
||||
else:
|
||||
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
|
||||
if x_noisy.shape[0] != self.cond_hint.shape[0]:
|
||||
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
|
||||
|
||||
# prepare mask_cond_hint
|
||||
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number, dtype=dtype)
|
||||
|
||||
context = cond.get('crossattn_controlnet', cond['c_crossattn'])
|
||||
# uses 'y' in new ComfyUI update
|
||||
y = cond.get('y', None)
|
||||
if y is not None:
|
||||
y = y.to(dtype)
|
||||
timestep = self.model_sampling_current.timestep(t)
|
||||
x_noisy = self.model_sampling_current.calculate_input(t, x_noisy)
|
||||
# concat c_concat if exists (should exist for SVD), doubling channels to 8
|
||||
if cond.get('c_concat', None) is not None:
|
||||
x_noisy = torch.cat([x_noisy] + [cond['c_concat']], dim=1)
|
||||
|
||||
control = self.control_model(x=x_noisy.to(dtype), hint=self.cond_hint, timesteps=timestep.float(), context=context.to(dtype), y=y, cond=cond)
|
||||
return self.control_merge(None, control, control_prev, output_dtype)
|
||||
|
||||
def copy(self):
|
||||
c = SVDControlNetAdvanced(self.control_model, self.timestep_keyframes, global_average_pooling=self.global_average_pooling, load_device=self.load_device, manual_cast_dtype=self.manual_cast_dtype)
|
||||
self.copy_to(c)
|
||||
self.copy_to_advanced(c)
|
||||
return c
|
||||
|
||||
|
||||
class SparseCtrlAdvanced(ControlNetAdvanced):
|
||||
def __init__(self, control_model, timestep_keyframes: TimestepKeyframeGroup, sparse_settings: SparseSettings=None, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None):
|
||||
super().__init__(control_model=control_model, timestep_keyframes=timestep_keyframes, global_average_pooling=global_average_pooling, device=device, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
|
||||
@@ -282,27 +348,19 @@ class SparseCtrlAdvanced(ControlNetAdvanced):
|
||||
return c
|
||||
|
||||
|
||||
class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
|
||||
# This ControlNet is more of an attention patch than a traditional controlnet
|
||||
def __init__(self, patch: LLLitePatch, timestep_keyframes: TimestepKeyframeGroup, device=None):
|
||||
class ReferenceAdvanced(ControlBase, AdvancedControlBase):
|
||||
def __init__(self, timestep_keyframes: TimestepKeyframeGroup, device=None):
|
||||
super().__init__(device)
|
||||
AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite(), require_model=True)
|
||||
self.patch = patch.clone_with_control(self)
|
||||
|
||||
# TODO: save attn patches here
|
||||
|
||||
def patch_model(self, model: ModelPatcher):
|
||||
model.set_model_attn1_patch(self.patch)
|
||||
model.set_model_attn2_patch(self.patch)
|
||||
|
||||
def set_cond_hint(self, *args, **kwargs):
|
||||
to_return = super().set_cond_hint(*args, **kwargs)
|
||||
# cond hint for LLLite needs to be scaled between (-1, 1) instead of (0, 1)
|
||||
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
|
||||
return to_return
|
||||
# TODO: do model patching here
|
||||
pass
|
||||
|
||||
def pre_run_advanced(self, *args, **kwargs):
|
||||
AdvancedControlBase.pre_run_advanced(self, *args, **kwargs)
|
||||
self.patch.set_control(self)
|
||||
#logger.warn(f"in pre_run_advanced: {id(self)}")
|
||||
# TODO: set control on patches
|
||||
|
||||
def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int):
|
||||
# normal ControlNet stuff
|
||||
@@ -332,24 +390,121 @@ class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
|
||||
# done preparing; model patches will take care of everything now.
|
||||
# return normal controlnet stuff
|
||||
return control_prev
|
||||
|
||||
def cleanup_advanced(self):
|
||||
super().cleanup_advanced()
|
||||
# TODO: cleanup patches here
|
||||
|
||||
def copy(self):
|
||||
c = ReferenceAdvanced(self.timestep_keyframes)
|
||||
self.copy_to(c)
|
||||
self.copy_to_advanced(c)
|
||||
return c
|
||||
|
||||
|
||||
class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
|
||||
# This ControlNet is more of an attention patch than a traditional controlnet
|
||||
def __init__(self, patch_attn1: LLLitePatch, patch_attn2: LLLitePatch, timestep_keyframes: TimestepKeyframeGroup, device=None):
|
||||
super().__init__(device)
|
||||
AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite(), require_model=True)
|
||||
self.patch_attn1 = patch_attn1.set_control(self)
|
||||
self.patch_attn2 = patch_attn2.set_control(self)
|
||||
self.latent_dims_div2 = None
|
||||
self.latent_dims_div4 = None
|
||||
|
||||
def patch_model(self, model: ModelPatcher):
|
||||
model.set_model_attn1_patch(self.patch_attn1)
|
||||
model.set_model_attn2_patch(self.patch_attn2)
|
||||
|
||||
def set_cond_hint(self, *args, **kwargs):
|
||||
to_return = super().set_cond_hint(*args, **kwargs)
|
||||
# cond hint for LLLite needs to be scaled between (-1, 1) instead of (0, 1)
|
||||
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
|
||||
return to_return
|
||||
|
||||
def pre_run_advanced(self, *args, **kwargs):
|
||||
AdvancedControlBase.pre_run_advanced(self, *args, **kwargs)
|
||||
#logger.error(f"in cn: {id(self.patch_attn1)},{id(self.patch_attn2)}")
|
||||
self.patch_attn1.set_control(self)
|
||||
self.patch_attn2.set_control(self)
|
||||
#logger.warn(f"in pre_run_advanced: {id(self)}")
|
||||
|
||||
def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int):
|
||||
# normal ControlNet stuff
|
||||
control_prev = None
|
||||
if self.previous_controlnet is not None:
|
||||
control_prev = self.previous_controlnet.get_control(x_noisy, t, cond, batched_number)
|
||||
|
||||
if self.timestep_range is not None:
|
||||
if t[0] > self.timestep_range[0] or t[0] < self.timestep_range[1]:
|
||||
return control_prev
|
||||
|
||||
dtype = x_noisy.dtype
|
||||
# prepare cond_hint
|
||||
if self.sub_idxs is not None or self.cond_hint is None or x_noisy.shape[2] * 8 != self.cond_hint.shape[2] or x_noisy.shape[3] * 8 != self.cond_hint.shape[3]:
|
||||
if self.cond_hint is not None:
|
||||
del self.cond_hint
|
||||
self.cond_hint = None
|
||||
# if self.cond_hint_original length greater or equal to real latent count, subdivide it before scaling
|
||||
if self.sub_idxs is not None and self.cond_hint_original.size(0) >= self.full_latent_length:
|
||||
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original[self.sub_idxs], x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
|
||||
else:
|
||||
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
|
||||
if x_noisy.shape[0] != self.cond_hint.shape[0]:
|
||||
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
|
||||
# some special logic here compared to other controlnets:
|
||||
# * The cond_emb in attn patches will divide latent dims by 2 or 4, integer
|
||||
# * Due to this loss, the cond_emb will become smaller than x input if latent dims are not divisble by 2 or 4
|
||||
divisible_by_2_h = x_noisy.shape[2]%2==0
|
||||
divisible_by_2_w = x_noisy.shape[3]%2==0
|
||||
if not (divisible_by_2_h and divisible_by_2_w):
|
||||
#logger.warn(f"{x_noisy.shape} not divisible by 2!")
|
||||
new_h = (x_noisy.shape[2]//2)*2
|
||||
new_w = (x_noisy.shape[3]//2)*2
|
||||
if not divisible_by_2_h:
|
||||
new_h += 2
|
||||
if not divisible_by_2_w:
|
||||
new_w += 2
|
||||
self.latent_dims_div2 = (new_h, new_w)
|
||||
divisible_by_4_h = x_noisy.shape[2]%4==0
|
||||
divisible_by_4_w = x_noisy.shape[3]%4==0
|
||||
if not (divisible_by_4_h and divisible_by_4_w):
|
||||
#logger.warn(f"{x_noisy.shape} not divisible by 4!")
|
||||
new_h = (x_noisy.shape[2]//4)*4
|
||||
new_w = (x_noisy.shape[3]//4)*4
|
||||
if not divisible_by_4_h:
|
||||
new_h += 4
|
||||
if not divisible_by_4_w:
|
||||
new_w += 4
|
||||
self.latent_dims_div4 = (new_h, new_w)
|
||||
# prepare mask
|
||||
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number)
|
||||
# done preparing; model patches will take care of everything now.
|
||||
# return normal controlnet stuff
|
||||
return control_prev
|
||||
|
||||
def cleanup_advanced(self):
|
||||
super().cleanup_advanced()
|
||||
self.patch.cleanup()
|
||||
self.patch_attn1.cleanup()
|
||||
self.patch_attn2.cleanup()
|
||||
self.latent_dims_div2 = None
|
||||
self.latent_dims_div4 = None
|
||||
|
||||
def copy(self):
|
||||
c = ControlLLLiteAdvanced(self.patch, self.timestep_keyframes)
|
||||
c = ControlLLLiteAdvanced(self.patch_attn1, self.patch_attn2, self.timestep_keyframes)
|
||||
self.copy_to(c)
|
||||
self.copy_to_advanced(c)
|
||||
return c
|
||||
|
||||
# deepcopy needs to properly keep track of objects to work between model.clone calls!
|
||||
def __deepcopy__(self, *args, **kwargs):
|
||||
return self
|
||||
# def __deepcopy__(self, *args, **kwargs):
|
||||
# self.cleanup_advanced()
|
||||
# return self
|
||||
|
||||
# def get_models(self):
|
||||
# # get_models is called once at the start of every KSampler run - use to reset already_patched status
|
||||
# out = super().get_models()
|
||||
# logger.error(f"in get_models! {id(self)}")
|
||||
# return out
|
||||
|
||||
|
||||
@@ -360,8 +515,9 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
|
||||
controlnet_type = ControlWeightType.DEFAULT
|
||||
has_controlnet_key = False
|
||||
has_motion_modules_key = False
|
||||
has_temporal_res_block_key = False
|
||||
for key in controlnet_data:
|
||||
# LLLLite check
|
||||
# LLLite check
|
||||
if "lllite" in key:
|
||||
controlnet_type = ControlWeightType.CONTROLLLLITE
|
||||
break
|
||||
@@ -370,14 +526,23 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
|
||||
has_motion_modules_key = True
|
||||
elif "controlnet" in key:
|
||||
has_controlnet_key = True
|
||||
# SVD-ControlNet check
|
||||
elif "temporal_res_block" in key:
|
||||
has_temporal_res_block_key = True
|
||||
if has_controlnet_key and has_motion_modules_key:
|
||||
controlnet_type = ControlWeightType.SPARSECTRL
|
||||
elif has_controlnet_key and has_temporal_res_block_key:
|
||||
controlnet_type = ControlWeightType.SVD_CONTROLNET
|
||||
|
||||
if controlnet_type != ControlWeightType.DEFAULT:
|
||||
if controlnet_type == ControlWeightType.CONTROLLLLITE:
|
||||
control = load_controllllite(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe)
|
||||
elif controlnet_type == ControlWeightType.SPARSECTRL:
|
||||
control = load_sparsectrl(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe, model=model)
|
||||
elif controlnet_type == ControlWeightType.SVD_CONTROLNET:
|
||||
control = load_svdcontrolnet(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe)
|
||||
#raise Exception(f"SVD-ControlNet is not supported yet!")
|
||||
#control = comfy_cn.load_controlnet(ckpt_path, model=model)
|
||||
# otherwise, load vanilla ControlNet
|
||||
else:
|
||||
try:
|
||||
@@ -602,6 +767,129 @@ def load_controllllite(ckpt_path: str, controlnet_data: dict[str, Tensor]=None,
|
||||
|
||||
#logger.info(f"loaded {ckpt_path} successfully, {len(modules)} modules")
|
||||
|
||||
patch = LLLitePatch(modules=modules)
|
||||
control = ControlLLLiteAdvanced(patch=patch, timestep_keyframes=timestep_keyframe)
|
||||
patch_attn1 = LLLitePatch(modules=modules, patch_type=LLLitePatch.ATTN1)
|
||||
patch_attn2 = LLLitePatch(modules=modules, patch_type=LLLitePatch.ATTN2)
|
||||
control = ControlLLLiteAdvanced(patch_attn1=patch_attn1, patch_attn2=patch_attn2, timestep_keyframes=timestep_keyframe)
|
||||
return control
|
||||
|
||||
|
||||
def load_svdcontrolnet(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, timestep_keyframe: TimestepKeyframeGroup=None, model=None):
|
||||
if controlnet_data is None:
|
||||
controlnet_data = comfy.utils.load_torch_file(ckpt_path, safe_load=True)
|
||||
|
||||
controlnet_config = None
|
||||
if "controlnet_cond_embedding.conv_in.weight" in controlnet_data: #diffusers format
|
||||
unet_dtype = comfy.model_management.unet_dtype()
|
||||
controlnet_config = svd_unet_config_from_diffusers_unet(controlnet_data, unet_dtype)
|
||||
diffusers_keys = svd_unet_to_diffusers(controlnet_config)
|
||||
diffusers_keys["controlnet_mid_block.weight"] = "middle_block_out.0.weight"
|
||||
diffusers_keys["controlnet_mid_block.bias"] = "middle_block_out.0.bias"
|
||||
|
||||
count = 0
|
||||
loop = True
|
||||
while loop:
|
||||
suffix = [".weight", ".bias"]
|
||||
for s in suffix:
|
||||
k_in = "controlnet_down_blocks.{}{}".format(count, s)
|
||||
k_out = "zero_convs.{}.0{}".format(count, s)
|
||||
if k_in not in controlnet_data:
|
||||
loop = False
|
||||
break
|
||||
diffusers_keys[k_in] = k_out
|
||||
count += 1
|
||||
|
||||
count = 0
|
||||
loop = True
|
||||
while loop:
|
||||
suffix = [".weight", ".bias"]
|
||||
for s in suffix:
|
||||
if count == 0:
|
||||
k_in = "controlnet_cond_embedding.conv_in{}".format(s)
|
||||
else:
|
||||
k_in = "controlnet_cond_embedding.blocks.{}{}".format(count - 1, s)
|
||||
k_out = "input_hint_block.{}{}".format(count * 2, s)
|
||||
if k_in not in controlnet_data:
|
||||
k_in = "controlnet_cond_embedding.conv_out{}".format(s)
|
||||
loop = False
|
||||
diffusers_keys[k_in] = k_out
|
||||
count += 1
|
||||
|
||||
new_sd = {}
|
||||
for k in diffusers_keys:
|
||||
if k in controlnet_data:
|
||||
new_sd[diffusers_keys[k]] = controlnet_data.pop(k)
|
||||
|
||||
leftover_keys = controlnet_data.keys()
|
||||
if len(leftover_keys) > 0:
|
||||
spatial_leftover_keys = []
|
||||
temporal_leftover_keys = []
|
||||
other_leftover_keys = []
|
||||
for key in leftover_keys:
|
||||
if "spatial" in key:
|
||||
spatial_leftover_keys.append(key)
|
||||
elif "temporal" in key:
|
||||
temporal_leftover_keys.append(key)
|
||||
else:
|
||||
other_leftover_keys.append(key)
|
||||
logger.warn(f"spatial_leftover_keys ({len(spatial_leftover_keys)}): {spatial_leftover_keys}")
|
||||
logger.warn(f"temporal_leftover_keys ({len(temporal_leftover_keys)}): {temporal_leftover_keys}")
|
||||
logger.warn(f"other_leftover_keys ({len(other_leftover_keys)}): {other_leftover_keys}")
|
||||
#print("leftover keys:", leftover_keys)
|
||||
controlnet_data = new_sd
|
||||
|
||||
pth_key = 'control_model.zero_convs.0.0.weight'
|
||||
pth = False
|
||||
key = 'zero_convs.0.0.weight'
|
||||
if pth_key in controlnet_data:
|
||||
pth = True
|
||||
key = pth_key
|
||||
prefix = "control_model."
|
||||
elif key in controlnet_data:
|
||||
prefix = ""
|
||||
else:
|
||||
raise ValueError("The provided model is not a valid SVD-ControlNet model! [ErrorCode: MUSTARD]")
|
||||
|
||||
if controlnet_config is None:
|
||||
unet_dtype = comfy.model_management.unet_dtype()
|
||||
controlnet_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, unet_dtype, True).unet_config
|
||||
load_device = comfy.model_management.get_torch_device()
|
||||
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
|
||||
if manual_cast_dtype is not None:
|
||||
controlnet_config["operations"] = comfy.ops.manual_cast
|
||||
controlnet_config.pop("out_channels")
|
||||
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
|
||||
control_model = SVDControlNet(**controlnet_config)
|
||||
|
||||
if pth:
|
||||
if 'difference' in controlnet_data:
|
||||
if model is not None:
|
||||
comfy.model_management.load_models_gpu([model])
|
||||
model_sd = model.model_state_dict()
|
||||
for x in controlnet_data:
|
||||
c_m = "control_model."
|
||||
if x.startswith(c_m):
|
||||
sd_key = "diffusion_model.{}".format(x[len(c_m):])
|
||||
if sd_key in model_sd:
|
||||
cd = controlnet_data[x]
|
||||
cd += model_sd[sd_key].type(cd.dtype).to(cd.device)
|
||||
else:
|
||||
print("WARNING: Loaded a diff controlnet without a model. It will very likely not work.")
|
||||
|
||||
class WeightsLoader(torch.nn.Module):
|
||||
pass
|
||||
w = WeightsLoader()
|
||||
w.control_model = control_model
|
||||
missing, unexpected = w.load_state_dict(controlnet_data, strict=False)
|
||||
else:
|
||||
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
|
||||
if len(missing) > 0 or len(unexpected) > 0:
|
||||
logger.info(f"SVD-ControlNet: {missing}, {unexpected}")
|
||||
|
||||
global_average_pooling = False
|
||||
filename = os.path.splitext(ckpt_path)[0]
|
||||
if filename.endswith("_shuffle") or filename.endswith("_shuffle_fp16"): #TODO: smarter way of enabling global_average_pooling
|
||||
global_average_pooling = True
|
||||
|
||||
control = SVDControlNetAdvanced(control_model, timestep_keyframes=timestep_keyframe, global_average_pooling=global_average_pooling, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
|
||||
return control
|
||||
|
||||
|
||||
+36
-8
@@ -11,7 +11,7 @@ import comfy.utils
|
||||
from comfy.controlnet import ControlBase
|
||||
|
||||
from .logger import logger
|
||||
from .utils import AdvancedControlBase, prepare_mask_batch
|
||||
from .utils import AdvancedControlBase, deepcopy_with_sharing, prepare_mask_batch
|
||||
|
||||
|
||||
def extra_options_to_module_prefix(extra_options):
|
||||
@@ -38,12 +38,16 @@ def extra_options_to_module_prefix(extra_options):
|
||||
|
||||
|
||||
class LLLitePatch:
|
||||
def __init__(self, modules: dict[str, 'LLLiteModule'], control: Union[AdvancedControlBase, ControlBase]=None):
|
||||
ATTN1 = "attn1"
|
||||
ATTN2 = "attn2"
|
||||
def __init__(self, modules: dict[str, 'LLLiteModule'], patch_type: str, control: Union[AdvancedControlBase, ControlBase]=None):
|
||||
self.modules = modules
|
||||
self.control = control
|
||||
self.patch_type = patch_type
|
||||
#logger.error(f"create LLLitePatch: {id(self)},{control}")
|
||||
|
||||
def __call__(self, q, k, v, extra_options):
|
||||
#logger.error(f"in __call__: {id(self)}")
|
||||
# determine if have anything to run
|
||||
if self.control.timestep_range is not None:
|
||||
# it turns out comparing single-value tensors to floats is extremely slow
|
||||
@@ -78,21 +82,37 @@ class LLLitePatch:
|
||||
self.modules[d] = self.modules[d].to(device)
|
||||
return self
|
||||
|
||||
def set_control(self, control: Union[AdvancedControlBase, ControlBase]):
|
||||
def set_control(self, control: Union[AdvancedControlBase, ControlBase]) -> 'LLLitePatch':
|
||||
self.control = control
|
||||
#logger.error(f"set control for LLLitePatch: {id(self)},{id(control)}")
|
||||
return self
|
||||
#logger.error(f"set control for LLLitePatch: {id(self)}, cn: {id(control)}")
|
||||
|
||||
def clone_with_control(self, control: AdvancedControlBase):
|
||||
#logger.error(f"clone-set control for LLLitePatch: {id(self)},{id(control)}")
|
||||
return LLLitePatch(self.modules, control)
|
||||
return LLLitePatch(self.modules, self.patch_type, control)
|
||||
|
||||
def cleanup(self):
|
||||
#del self.control
|
||||
#self.control = None
|
||||
#total_cleaned = 0
|
||||
for module in self.modules.values():
|
||||
module.cleanup()
|
||||
# total_cleaned += 1
|
||||
#logger.info(f"cleaned modules: {total_cleaned}, {id(self)}")
|
||||
#logger.error(f"cleanup LLLitePatch: {id(self)}")
|
||||
|
||||
# make sure deepcopy does not copy control, and deepcopied LLLitePatch should be assigned to control
|
||||
def __deepcopy__(self, memo):
|
||||
self.cleanup()
|
||||
to_return: LLLitePatch = deepcopy_with_sharing(self, shared_attribute_names = ['control'], memo=memo)
|
||||
#logger.warn(f"patch {id(self)} turned into {id(to_return)}")
|
||||
try:
|
||||
if self.patch_type == self.ATTN1:
|
||||
to_return.control.patch_attn1 = to_return
|
||||
elif self.patch_type == self.ATTN2:
|
||||
to_return.control.patch_attn2 = to_return
|
||||
except Exception:
|
||||
pass
|
||||
return to_return
|
||||
|
||||
|
||||
# TODO: use comfy.ops to support fp8 properly
|
||||
class LLLiteModule(torch.nn.Module):
|
||||
@@ -159,6 +179,7 @@ class LLLiteModule(torch.nn.Module):
|
||||
self.prev_sub_idxs = None
|
||||
|
||||
def cleanup(self):
|
||||
del self.cond_emb
|
||||
self.cond_emb = None
|
||||
self.cx_shape = None
|
||||
self.prev_batch = 0
|
||||
@@ -167,9 +188,15 @@ class LLLiteModule(torch.nn.Module):
|
||||
def forward(self, x: Tensor, control: Union[AdvancedControlBase, ControlBase]):
|
||||
mask = None
|
||||
mask_tk = None
|
||||
#logger.info(x.shape)
|
||||
if self.cond_emb is None or control.sub_idxs != self.prev_sub_idxs or x.shape[0] != self.prev_batch:
|
||||
# print(f"cond_emb is None, {self.name}")
|
||||
cx = self.conditioning1(control.cond_hint.to(x.device, dtype=x.dtype))
|
||||
cond_hint = control.cond_hint.to(x.device, dtype=x.dtype)
|
||||
if control.latent_dims_div2 is not None and x.shape[-1] != 1280:
|
||||
cond_hint = comfy.utils.common_upscale(cond_hint, control.latent_dims_div2[0] * 8, control.latent_dims_div2[1] * 8, 'nearest-exact', "center").to(x.device, dtype=x.dtype)
|
||||
elif control.latent_dims_div4 is not None and x.shape[-1] == 1280:
|
||||
cond_hint = comfy.utils.common_upscale(cond_hint, control.latent_dims_div4[0] * 8, control.latent_dims_div4[1] * 8, 'nearest-exact', "center").to(x.device, dtype=x.dtype)
|
||||
cx = self.conditioning1(cond_hint)
|
||||
self.cx_shape = cx.shape
|
||||
if not self.is_conv2d:
|
||||
# reshape / b,c,h,w -> b,h*w,c
|
||||
@@ -211,6 +238,7 @@ class LLLiteModule(torch.nn.Module):
|
||||
elif mask_tk is not None:
|
||||
mask = mask * mask_tk
|
||||
|
||||
#logger.info(f"cs: {cx.shape}, x: {x.shape}, is_conv2d: {self.is_conv2d}")
|
||||
cx = torch.cat([cx, self.down(x)], dim=1 if self.is_conv2d else 2)
|
||||
cx = self.mid(cx)
|
||||
cx = self.up(cx)
|
||||
|
||||
+3
-3
@@ -4,7 +4,7 @@ import torch
|
||||
|
||||
import numpy as np
|
||||
from PIL import Image, ImageOps
|
||||
from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe
|
||||
from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe, BIGMAX
|
||||
from .logger import logger
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ class LoadImagesFromDirectory:
|
||||
"directory": ("STRING", {"default": ""}),
|
||||
},
|
||||
"optional": {
|
||||
"image_load_cap": ("INT", {"default": 0, "min": 0, "step": 1}),
|
||||
"start_index": ("INT", {"default": 0, "min": 0, "step": 1}),
|
||||
"image_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
|
||||
"start_index": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@ from typing import Union
|
||||
import numpy as np
|
||||
from collections.abc import Iterable
|
||||
|
||||
from .utils import LatentKeyframe, LatentKeyframeGroup
|
||||
from .utils import LatentKeyframe, LatentKeyframeGroup, BIGMIN, BIGMAX
|
||||
from .utils import StrengthInterpolation as SI
|
||||
from .logger import logger
|
||||
|
||||
@@ -12,7 +12,7 @@ class LatentKeyframeNode:
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"batch_index": ("INT", {"default": 0, "min": -1000, "max": 1000, "step": 1}),
|
||||
"batch_index": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
|
||||
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
|
||||
},
|
||||
"optional": {
|
||||
@@ -163,8 +163,8 @@ class LatentKeyframeInterpolationNode:
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"batch_index_from": ("INT", {"default": 0, "min": -10000, "max": 10000, "step": 1}),
|
||||
"batch_index_to_excl": ("INT", {"default": 0, "min": -10000, "max": 10000, "step": 1}),
|
||||
"batch_index_from": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
|
||||
"batch_index_to_excl": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
|
||||
"strength_from": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
|
||||
"strength_to": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
|
||||
"interpolation": ([SI.LINEAR, SI.EASE_IN, SI.EASE_OUT, SI.EASE_IN_OUT], ),
|
||||
|
||||
+6
-2
@@ -3,6 +3,7 @@ from torch import Tensor
|
||||
import folder_paths
|
||||
from nodes import VAEEncode
|
||||
import comfy.utils
|
||||
from comfy.sd import VAE
|
||||
|
||||
from .utils import TimestepKeyframeGroup
|
||||
from .control_sparsectrl import SparseMethod, SparseIndexMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper
|
||||
@@ -148,12 +149,15 @@ class RgbSparseCtrlPreprocessor:
|
||||
|
||||
CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/SparseCtrl/preprocess"
|
||||
|
||||
def preprocess_images(self, vae, image: Tensor, latent_size: Tensor):
|
||||
def preprocess_images(self, vae: VAE, image: Tensor, latent_size: Tensor):
|
||||
# first, resize image to match latents
|
||||
image = image.movedim(-1,1)
|
||||
image = comfy.utils.common_upscale(image, latent_size["samples"].shape[3] * 8, latent_size["samples"].shape[2] * 8, 'nearest-exact', "center")
|
||||
image = image.movedim(1,-1)
|
||||
# then, vae encode
|
||||
image = VAEEncode.vae_encode_crop_pixels(image)
|
||||
try:
|
||||
image = vae.vae_encode_crop_pixels(image)
|
||||
except Exception:
|
||||
image = VAEEncode.vae_encode_crop_pixels(image)
|
||||
encoded = vae.encode(image[:,:,:,:3])
|
||||
return (PreprocSparseRGBWrapper(condhint=encoded),)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from copy import deepcopy
|
||||
from typing import Callable, Union
|
||||
import torch
|
||||
from torch import Tensor
|
||||
@@ -10,6 +11,9 @@ from comfy.model_patcher import ModelPatcher
|
||||
|
||||
from .logger import logger
|
||||
|
||||
BIGMIN = -(2**63-1)
|
||||
BIGMAX = (2**63-1)
|
||||
|
||||
def load_torch_file_with_dict_factory(controlnet_data: dict[str, Tensor], orig_load_torch_file: Callable):
|
||||
def load_torch_file_with_dict(*args, **kwargs):
|
||||
# immediately restore load_torch_file to original version
|
||||
@@ -34,6 +38,7 @@ class ControlWeightType:
|
||||
CONTROLNET = "controlnet"
|
||||
CONTROLLORA = "controllora"
|
||||
CONTROLLLLITE = "controllllite"
|
||||
SVD_CONTROLNET = "svd_controlnet"
|
||||
SPARSECTRL = "sparsectrl"
|
||||
|
||||
|
||||
@@ -259,6 +264,44 @@ def linear_conversion(x, x_min=0.0, x_max=1.0, new_min=0.0, new_max=1.0):
|
||||
return (((x - x_min)/(x_max - x_min)) * (new_max - new_min)) + new_min
|
||||
|
||||
|
||||
# from https://stackoverflow.com/a/24621200
|
||||
def deepcopy_with_sharing(obj, shared_attribute_names, memo=None):
|
||||
'''
|
||||
Deepcopy an object, except for a given list of attributes, which should
|
||||
be shared between the original object and its copy.
|
||||
|
||||
obj is some object
|
||||
shared_attribute_names: A list of strings identifying the attributes that
|
||||
should be shared between the original and its copy.
|
||||
memo is the dictionary passed into __deepcopy__. Ignore this argument if
|
||||
not calling from within __deepcopy__.
|
||||
'''
|
||||
assert isinstance(shared_attribute_names, (list, tuple))
|
||||
|
||||
shared_attributes = {k: getattr(obj, k) for k in shared_attribute_names}
|
||||
|
||||
if hasattr(obj, '__deepcopy__'):
|
||||
# Do hack to prevent infinite recursion in call to deepcopy
|
||||
deepcopy_method = obj.__deepcopy__
|
||||
obj.__deepcopy__ = None
|
||||
|
||||
for attr in shared_attribute_names:
|
||||
del obj.__dict__[attr]
|
||||
|
||||
clone = deepcopy(obj)
|
||||
|
||||
for attr, val in shared_attributes.items():
|
||||
setattr(obj, attr, val)
|
||||
setattr(clone, attr, val)
|
||||
|
||||
if hasattr(obj, '__deepcopy__'):
|
||||
# Undo hack
|
||||
obj.__deepcopy__ = deepcopy_method
|
||||
del clone.__deepcopy__
|
||||
|
||||
return clone
|
||||
|
||||
|
||||
class WeightTypeException(TypeError):
|
||||
"Raised when weight not compatible with AdvancedControlBase object"
|
||||
pass
|
||||
|
||||
@@ -46,7 +46,8 @@ NOTE: you can also use custom locations for models/motion loras by making use of
|
||||
- Infinite animation length support via sliding context windows across whole unet (Context Options) and/or within motion module (View Options)
|
||||
- Scheduling Context Options to change across different points in the sampling process
|
||||
- FreeInit and FreeNoise support (FreeInit is under iteration opts, FreeNoise is in SampleSettings' noise_type dropdown)
|
||||
- Mixable Motion LoRAs from [original AnimateDiff repository](https://github.com/guoyww/animatediff/) implemented. Caveat: only really work on v2-based motion models like ```mm_sd_v15_v2```, ```mm-p_0.5.pth```, and ```mm-p_0.75.pth```
|
||||
- Mixable Motion LoRAs from [original AnimateDiff repository](https://github.com/guoyww/animatediff/) implemented. Caveat: the original loras really only work on v2-based motion models like ```mm_sd_v15_v2```, ```mm-p_0.5.pth```, and ```mm-p_0.75.pth```.
|
||||
- UPDATE: New motion LoRAs without the v2 limitation can now be trained via the [AnimateDiff-MotionDirector repo](https://github.com/ExponentialML/AnimateDiff-MotionDirector). Shoutout to ExponentialML for implementing MotionDirector for AnimateDiff purposes!
|
||||
- Prompt travel using BatchPromptSchedule node from [ComfyUI_FizzNodes](https://github.com/FizzleDorf/ComfyUI_FizzNodes)
|
||||
- Scale and Effect multival inputs to control motion amount and motion model influence on generation.
|
||||
- Can be float, list of floats, or masks
|
||||
@@ -57,15 +58,17 @@ NOTE: you can also use custom locations for models/motion loras by making use of
|
||||
- NOTE: You will need to use ```autoselect``` or ```linear (HotshotXL/default)``` beta_schedule, the sweetspot for context_length or total frames (when not using context) is 8 frames, and you will need to use an SDXL checkpoint.
|
||||
- AnimateDiff-SDXL support, with corresponding model. Currently, a beta version is out, which you can find info about at [AnimateDiff](https://github.com/guoyww/AnimateDiff/).
|
||||
- NOTE: You will need to use ```autoselect``` or ```linear (AnimateDiff-SDXL)``` beta_schedule. Other than that, same rules of thumb apply to AnimateDiff-SDXL as AnimateDiff.
|
||||
- [AnimateLCM](https://github.com/G-U-N/AnimateLCM) support
|
||||
- NOTE: You will need to use ```autoselect``` or ```lcm``` or ```lcm[100_ots]``` beta_schedule. To use fully with LCM, be sure to use appropriate LCM lora, use the ```lcm``` sampler_name in KSampler nodes, and lower cfg to somewhere around 1.0 to 2.0. Don't forget to decrease steps (minimum = ~4 steps), since LCM converges faster (less steps). Increase step count to increase detail as desired.
|
||||
- AnimateDiff Keyframes to change Scale and Effect at different points in the sampling process.
|
||||
- fp8 support; requires newest ComfyUI and torch >= 2.1 (decreases VRAM usage, but changes outputs)
|
||||
- Mac M1/M2/M3 support
|
||||
- Usage of Context Options and Sample Settings outside of AnimateDiff via Gen2 Use Evolved Sampling node
|
||||
|
||||
## Upcoming Features
|
||||
- Maskable Motion LoRA
|
||||
- Maskable SD LoRA (and perhaps maskable SD Models as well)
|
||||
- [PIA](https://github.com/open-mmlab/PIA) support
|
||||
- Motion LoRA training (experimental)
|
||||
- Anything else AnimateDiff-related that comes out
|
||||
|
||||
|
||||
|
||||
+3
@@ -10,8 +10,10 @@ from .utils_motion import get_sorted_list_via_attr
|
||||
class ContextFuseMethod:
|
||||
FLAT = "flat"
|
||||
PYRAMID = "pyramid"
|
||||
RELATIVE = "relative"
|
||||
|
||||
LIST = [PYRAMID, FLAT]
|
||||
LIST_STATIC = [PYRAMID, RELATIVE, FLAT]
|
||||
|
||||
|
||||
class ContextType:
|
||||
@@ -331,6 +333,7 @@ def create_weights_pyramid(length: int, **kwargs) -> list[float]:
|
||||
FUSE_MAPPING = {
|
||||
ContextFuseMethod.FLAT: create_weights_flat,
|
||||
ContextFuseMethod.PYRAMID: create_weights_pyramid,
|
||||
ContextFuseMethod.RELATIVE: create_weights_pyramid,
|
||||
}
|
||||
|
||||
|
||||
|
||||
+8
-3
@@ -13,7 +13,7 @@ from comfy.model_base import BaseModel
|
||||
|
||||
from .ad_settings import AnimateDiffSettings
|
||||
from .context import ContextOptions, ContextOptions, ContextOptionsGroup
|
||||
from .motion_module_ad import AnimateDiffModel, has_mid_block, normalize_ad_state_dict
|
||||
from .motion_module_ad import AnimateDiffModel, AnimateDiffFormat, has_mid_block, normalize_ad_state_dict
|
||||
from .logger import logger
|
||||
from .utils_motion import ADKeyframe, ADKeyframeGroup, MotionCompatibilityError, get_combined_multival, normalize_min_max
|
||||
from .motion_lora import MotionLoraInfo, MotionLoraList
|
||||
@@ -365,7 +365,8 @@ def load_motion_module_gen1(model_name: str, model: ModelPatcher, motion_lora: M
|
||||
ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info)
|
||||
ad_wrapper.to(model.model_dtype())
|
||||
ad_wrapper.to(model.offload_device)
|
||||
load_result = ad_wrapper.load_state_dict(mm_state_dict)
|
||||
is_animatelcm = mm_info.mm_format==AnimateDiffFormat.ANIMATELCM
|
||||
load_result = ad_wrapper.load_state_dict(mm_state_dict, strict=not is_animatelcm)
|
||||
# TODO: report load_result of motion_module loading?
|
||||
# wrap motion_module into a ModelPatcher, to allow motion lora patches
|
||||
motion_model = MotionModelPatcher(model=ad_wrapper, load_device=model.load_device, offload_device=model.offload_device)
|
||||
@@ -389,7 +390,11 @@ def load_motion_module_gen2(model_name: str, motion_model_settings: AnimateDiffS
|
||||
ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info)
|
||||
ad_wrapper.to(comfy.model_management.unet_dtype())
|
||||
ad_wrapper.to(comfy.model_management.unet_offload_device())
|
||||
load_result = ad_wrapper.load_state_dict(mm_state_dict)
|
||||
is_animatelcm = mm_info.mm_format==AnimateDiffFormat.ANIMATELCM
|
||||
load_result = ad_wrapper.load_state_dict(mm_state_dict, strict=not is_animatelcm)
|
||||
# TODO: manually check load_results for AnimateLCM models
|
||||
if is_animatelcm:
|
||||
pass
|
||||
# TODO: report load_result of motion_module loading?
|
||||
# wrap motion_module into a ModelPatcher, to allow motion lora patches
|
||||
motion_model = MotionModelPatcher(model=ad_wrapper, load_device=comfy.model_management.get_torch_device(),
|
||||
|
||||
+75
-19
@@ -15,7 +15,7 @@ from comfy.utils import repeat_to_batch_size
|
||||
import comfy.ops
|
||||
import comfy.model_management
|
||||
|
||||
from .context import ContextOptions, get_context_weights, get_context_windows
|
||||
from .context import ContextFuseMethod, ContextOptions, get_context_weights, get_context_windows
|
||||
from .utils_motion import CrossAttentionMM, MotionCompatibilityError, extend_to_batch_size, prepare_mask_batch
|
||||
from .utils_model import BetaSchedules, ModelTypeSD
|
||||
from .logger import logger
|
||||
@@ -31,6 +31,7 @@ def zero_module(module):
|
||||
class AnimateDiffFormat:
|
||||
ANIMATEDIFF = "AnimateDiff"
|
||||
HOTSHOTXL = "HotshotXL"
|
||||
ANIMATELCM = "AnimateLCM"
|
||||
|
||||
|
||||
class AnimateDiffVersion:
|
||||
@@ -58,6 +59,14 @@ def is_hotshotxl(mm_state_dict: dict[str, Tensor]) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def is_animatelcm(mm_state_dict: dict[str, Tensor]) -> bool:
|
||||
# use lack of ANY pos_encoder keys to determine if animatelcm model
|
||||
for key in mm_state_dict.keys():
|
||||
if "pos_encoder" in key:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def get_down_block_max(mm_state_dict: dict[str, Tensor]) -> int:
|
||||
# keep track of biggest down_block count in module
|
||||
biggest_block = 0
|
||||
@@ -81,11 +90,14 @@ def has_mid_block(mm_state_dict: dict[str, Tensor]):
|
||||
return False
|
||||
|
||||
|
||||
def get_position_encoding_max_len(mm_state_dict: dict[str, Tensor], mm_name: str) -> int:
|
||||
def get_position_encoding_max_len(mm_state_dict: dict[str, Tensor], mm_name: str, mm_format: str) -> Union[int, None]:
|
||||
# use pos_encoder.pe entries to determine max length - [1, {max_length}, {320|640|1280}]
|
||||
for key in mm_state_dict.keys():
|
||||
if key.endswith("pos_encoder.pe"):
|
||||
return mm_state_dict[key].size(1) # get middle dim
|
||||
# AnimateLCM models should have no pos_encoder entries, and assumed to be 64
|
||||
if mm_format == AnimateDiffFormat.ANIMATELCM:
|
||||
return 64
|
||||
raise MotionCompatibilityError(f"No pos_encoder.pe found in mm_state_dict - {mm_name} is not a valid AnimateDiff motion module!")
|
||||
|
||||
|
||||
@@ -98,6 +110,11 @@ def find_hotshot_module_num(key: str) -> Union[int, None]:
|
||||
|
||||
|
||||
def normalize_ad_state_dict(mm_state_dict: dict[str, Tensor], mm_name: str) -> Tuple[dict[str, Tensor], AnimateDiffInfo]:
|
||||
# from pathlib import Path
|
||||
# with open(Path(__file__).parent.parent.parent / f"keys_{mm_name}.txt", "w") as afile:
|
||||
# for key, value in mm_state_dict.items():
|
||||
# afile.write(f"{key}:\t{value.shape}\n")
|
||||
|
||||
# remove all non-temporal keys (in case model has extra stuff in it)
|
||||
for key in list(mm_state_dict.keys()):
|
||||
if "temporal" not in key:
|
||||
@@ -115,11 +132,13 @@ def normalize_ad_state_dict(mm_state_dict: dict[str, Tensor], mm_name: str) -> T
|
||||
mm_format = AnimateDiffFormat.ANIMATEDIFF
|
||||
if is_hotshotxl(mm_state_dict):
|
||||
mm_format = AnimateDiffFormat.HOTSHOTXL
|
||||
if is_animatelcm(mm_state_dict):
|
||||
mm_format = AnimateDiffFormat.ANIMATELCM
|
||||
# determine the model's version
|
||||
mm_version = AnimateDiffVersion.V1
|
||||
if has_mid_block(mm_state_dict):
|
||||
mm_version = AnimateDiffVersion.V2
|
||||
elif sd_type==ModelTypeSD.SD1_5 and get_position_encoding_max_len(mm_state_dict, mm_name)==32:
|
||||
elif sd_type==ModelTypeSD.SD1_5 and get_position_encoding_max_len(mm_state_dict, mm_name, mm_format)==32:
|
||||
mm_version = AnimateDiffVersion.V3
|
||||
info = AnimateDiffInfo(sd_type=sd_type, mm_format=mm_format, mm_version=mm_version, mm_name=mm_name)
|
||||
# convert to AnimateDiff format, if needed
|
||||
@@ -157,7 +176,8 @@ class AnimateDiffModel(nn.Module):
|
||||
self.down_blocks: Iterable[MotionModule] = nn.ModuleList([])
|
||||
self.up_blocks: Iterable[MotionModule] = nn.ModuleList([])
|
||||
self.mid_block: Union[MotionModule, None] = None
|
||||
self.encoding_max_len = get_position_encoding_max_len(mm_state_dict, mm_info.mm_name)
|
||||
self.encoding_max_len = get_position_encoding_max_len(mm_state_dict, mm_info.mm_name, mm_info.mm_format)
|
||||
self.has_position_encoding = self.encoding_max_len is not None
|
||||
# determine ops to use (to support fp8 properly)
|
||||
if comfy.model_management.unet_manual_cast(comfy.model_management.unet_dtype(), comfy.model_management.get_torch_device()) is None:
|
||||
ops = comfy.ops.disable_weight_init
|
||||
@@ -170,20 +190,31 @@ class AnimateDiffModel(nn.Module):
|
||||
layer_channels = (320, 640, 1280, 1280)
|
||||
# fill out down/up blocks and middle block, if present
|
||||
for c in layer_channels:
|
||||
self.down_blocks.append(MotionModule(c, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.DOWN, ops=ops))
|
||||
self.down_blocks.append(MotionModule(c, temporal_position_encoding=self.has_position_encoding,
|
||||
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.DOWN, ops=ops))
|
||||
for c in reversed(layer_channels):
|
||||
self.up_blocks.append(MotionModule(c, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.UP, ops=ops))
|
||||
self.up_blocks.append(MotionModule(c, temporal_position_encoding=self.has_position_encoding,
|
||||
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.UP, ops=ops))
|
||||
if has_mid_block(mm_state_dict):
|
||||
self.mid_block = MotionModule(1280, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.MID, ops=ops)
|
||||
self.mid_block = MotionModule(1280, temporal_position_encoding=self.has_position_encoding,
|
||||
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.MID, ops=ops)
|
||||
self.AD_video_length: int = 24
|
||||
|
||||
def get_device_debug(self):
|
||||
return self.down_blocks[0].motion_modules[0].temporal_transformer.proj_in.weight.device
|
||||
|
||||
def is_length_valid_for_encoding_max_len(self, length: int):
|
||||
if self.encoding_max_len is None:
|
||||
return True
|
||||
return length <= self.encoding_max_len
|
||||
|
||||
def get_best_beta_schedule(self, log=False) -> str:
|
||||
to_return = None
|
||||
if self.mm_info.sd_type == ModelTypeSD.SD1_5:
|
||||
to_return = BetaSchedules.SQRT_LINEAR
|
||||
if self.mm_info.mm_format == AnimateDiffFormat.ANIMATELCM:
|
||||
to_return = BetaSchedules.LCM # while LCM_100 is the intended schedule, I find LCM to have much less flicker
|
||||
else:
|
||||
to_return = BetaSchedules.SQRT_LINEAR
|
||||
elif self.mm_info.sd_type == ModelTypeSD.SDXL:
|
||||
if self.mm_info.mm_format == AnimateDiffFormat.HOTSHOTXL:
|
||||
to_return = BetaSchedules.LINEAR
|
||||
@@ -352,22 +383,28 @@ class AnimateDiffModel(nn.Module):
|
||||
|
||||
|
||||
class MotionModule(nn.Module):
|
||||
def __init__(self, in_channels, temporal_position_encoding_max_len=24, block_type: str=BlockType.DOWN, ops=comfy.ops.disable_weight_init):
|
||||
def __init__(self,
|
||||
in_channels,
|
||||
temporal_position_encoding=True,
|
||||
temporal_position_encoding_max_len=24,
|
||||
block_type: str=BlockType.DOWN,
|
||||
ops=comfy.ops.disable_weight_init
|
||||
):
|
||||
super().__init__()
|
||||
if block_type == BlockType.MID:
|
||||
# mid blocks contain only a single VanillaTemporalModule
|
||||
self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList([get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops)])
|
||||
self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList([get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops)])
|
||||
else:
|
||||
# down blocks contain two VanillaTemporalModules
|
||||
self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList(
|
||||
[
|
||||
get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops),
|
||||
get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops)
|
||||
get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops),
|
||||
get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops)
|
||||
]
|
||||
)
|
||||
# up blocks contain one additional VanillaTemporalModule
|
||||
if block_type == BlockType.UP:
|
||||
self.motion_modules.append(get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops))
|
||||
self.motion_modules.append(get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops))
|
||||
|
||||
def set_video_length(self, video_length: int, full_length: int):
|
||||
for motion_module in self.motion_modules:
|
||||
@@ -398,8 +435,8 @@ class MotionModule(nn.Module):
|
||||
motion_module.reset_temp_vars()
|
||||
|
||||
|
||||
def get_motion_module(in_channels, temporal_position_encoding_max_len, ops=comfy.ops.disable_weight_init):
|
||||
return VanillaTemporalModule(in_channels=in_channels, temporal_position_encoding_max_len=temporal_position_encoding_max_len, ops=ops)
|
||||
def get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=comfy.ops.disable_weight_init):
|
||||
return VanillaTemporalModule(in_channels=in_channels, temporal_position_encoding=temporal_position_encoding, temporal_position_encoding_max_len=temporal_position_encoding_max_len, ops=ops)
|
||||
|
||||
|
||||
class VanillaTemporalModule(nn.Module):
|
||||
@@ -776,11 +813,9 @@ class TemporalTransformerBlock(nn.Module):
|
||||
hidden_states = rearrange(hidden_states, "(b f) d c -> b f d c", f=video_length)
|
||||
value_final = torch.zeros_like(hidden_states)
|
||||
count_final = torch.zeros_like(hidden_states)
|
||||
# bias_final = [0.0] * video_length
|
||||
batched_conds = hidden_states.size(1) // video_length
|
||||
for sub_idxs in views:
|
||||
weights = get_context_weights(len(sub_idxs), view_options.fuse_method) * batched_conds
|
||||
weights_tensor = torch.Tensor(weights).to(device=hidden_states.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
|
||||
|
||||
sub_hidden_states = rearrange(hidden_states[:, sub_idxs], "b f d c -> (b f) d c")
|
||||
for attention_block, norm in zip(self.attention_blocks, self.norms):
|
||||
norm_hidden_states = norm(sub_hidden_states).to(sub_hidden_states.dtype)
|
||||
@@ -797,14 +832,35 @@ class TemporalTransformerBlock(nn.Module):
|
||||
)
|
||||
sub_hidden_states = rearrange(sub_hidden_states, "(b f) d c -> b f d c", f=len(sub_idxs))
|
||||
|
||||
# if view_options.fuse_method == ContextFuseMethod.RELATIVE:
|
||||
# for pos, idx in enumerate(sub_idxs):
|
||||
# # bias is the influence of a specific index in relation to the whole context window
|
||||
# bias = 1 - abs(idx - (sub_idxs[0] + sub_idxs[-1]) / 2) / ((sub_idxs[-1] - sub_idxs[0] + 1e-2) / 2)
|
||||
# bias = max(1e-2, bias)
|
||||
# # take weighted averate relative to total bias of current idx
|
||||
# bias_total = bias_final[idx]
|
||||
# prev_weight = torch.tensor([bias_total / (bias_total + bias)],
|
||||
# dtype=value_final.dtype, device=value_final.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
|
||||
# #prev_weight = torch.cat([prev_weight]*value_final.shape[1], dim=1)
|
||||
# new_weight = torch.tensor([bias / (bias_total + bias)],
|
||||
# dtype=value_final.dtype, device=value_final.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
|
||||
# #new_weight = torch.cat([new_weight]*value_final.shape[1], dim=1)
|
||||
# test = value_final[:, idx:idx+1, :, :]
|
||||
# value_final[:, idx:idx+1, :, :] = value_final[:, idx:idx+1, :, :] * prev_weight + sub_hidden_states[:, pos:pos+1, : ,:] * new_weight
|
||||
# bias_final[idx] = bias_total + bias
|
||||
# else:
|
||||
weights = get_context_weights(len(sub_idxs), view_options.fuse_method) * batched_conds
|
||||
weights_tensor = torch.Tensor(weights).to(device=hidden_states.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
|
||||
value_final[:, sub_idxs] += sub_hidden_states * weights_tensor
|
||||
count_final[:, sub_idxs] += weights_tensor
|
||||
|
||||
# get weighted average of sub_hidden_states
|
||||
# get weighted average of sub_hidden_states, if fuse method requires it
|
||||
# if view_options.fuse_method != ContextFuseMethod.RELATIVE:
|
||||
hidden_states = value_final / count_final
|
||||
hidden_states = rearrange(hidden_states, "b f d c -> (b f) d c")
|
||||
del value_final
|
||||
del count_final
|
||||
# del bias_final
|
||||
|
||||
hidden_states = self.ff(self.ff_norm(hidden_states)) + hidden_states
|
||||
|
||||
|
||||
+28
-45
@@ -1,65 +1,28 @@
|
||||
from pathlib import Path
|
||||
import torch
|
||||
|
||||
import comfy.sample as comfy_sample
|
||||
from comfy.model_patcher import ModelPatcher
|
||||
|
||||
from .logger import logger
|
||||
from .utils_model import BetaSchedules, get_available_motion_loras, get_available_motion_models, get_motion_lora_path
|
||||
from .motion_lora import MotionLoraInfo, MotionLoraList
|
||||
from .model_injection import InjectionParams, ModelPatcherAndInjector, AnimateDiffSettings, load_motion_module_gen1
|
||||
from .sample_settings import SampleSettings, SeedNoiseGeneration
|
||||
from .sampling import motion_sample_factory
|
||||
|
||||
from .nodes_gen1 import (AnimateDiffLoaderGen1, LegacyAnimateDiffLoaderWithContext, AnimateDiffModelSettings,
|
||||
AnimateDiffModelSettingsSimple, AnimateDiffModelSettingsAdvanced, AnimateDiffModelSettingsAdvancedAttnStrengths)
|
||||
from .nodes_gen2 import UseEvolvedSamplingNode, ApplyAnimateDiffModelNode, ApplyAnimateDiffModelBasicNode, LoadAnimateDiffModelNode, ADKeyframeNode
|
||||
from .nodes_multival import MultivalDynamicNode, MultivalFloatNode, MultivalScaledMaskNode
|
||||
from .nodes_sample import FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode
|
||||
from .nodes_multival import MultivalDynamicNode, MultivalScaledMaskNode
|
||||
from .nodes_sample import (FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode,
|
||||
CustomCFGNode, CustomCFGKeyframeNode)
|
||||
from .nodes_sigma_schedule import (SigmaScheduleNode, RawSigmaScheduleNode, WeightedAverageSigmaScheduleNode, InterpolatedWeightedAverageSigmaScheduleNode, SplitAndCombineSigmaScheduleNode)
|
||||
from .nodes_context import (LegacyLoopedUniformContextOptionsNode, LoopedUniformContextOptionsNode, LoopedUniformViewOptionsNode, StandardUniformContextOptionsNode, StandardStaticContextOptionsNode, BatchedContextOptionsNode,
|
||||
StandardStaticViewOptionsNode, StandardUniformViewOptionsNode, ViewAsContextOptionsNode)
|
||||
from .nodes_ad_settings import AnimateDiffSettingsNode, ManualAdjustPENode, SweetspotStretchPENode, FullStretchPENode
|
||||
from .nodes_extras import AnimateDiffUnload, EmptyLatentImageLarge, CheckpointLoaderSimpleWithNoiseSelect
|
||||
from .nodes_deprecated import AnimateDiffLoader_Deprecated, AnimateDiffLoaderAdvanced_Deprecated, AnimateDiffCombine_Deprecated
|
||||
from .nodes_lora import AnimateDiffLoraLoader, MaskedLoraLoader
|
||||
|
||||
from .logger import logger
|
||||
|
||||
# override comfy_sample.sample with animatediff-support version
|
||||
comfy_sample.sample = motion_sample_factory(comfy_sample.sample)
|
||||
comfy_sample.sample_custom = motion_sample_factory(comfy_sample.sample_custom, is_custom=True)
|
||||
|
||||
|
||||
class AnimateDiffLoraLoader:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"lora_name": (get_available_motion_loras(),),
|
||||
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}),
|
||||
},
|
||||
"optional": {
|
||||
"prev_motion_lora": ("MOTION_LORA",),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("MOTION_LORA",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓"
|
||||
FUNCTION = "load_motion_lora"
|
||||
|
||||
def load_motion_lora(self, lora_name: str, strength: float, prev_motion_lora: MotionLoraList=None):
|
||||
if prev_motion_lora is None:
|
||||
prev_motion_lora = MotionLoraList()
|
||||
else:
|
||||
prev_motion_lora = prev_motion_lora.clone()
|
||||
# check if motion lora with name exists
|
||||
lora_path = get_motion_lora_path(lora_name)
|
||||
if not Path(lora_path).is_file():
|
||||
raise FileNotFoundError(f"Motion lora with name '{lora_name}' not found.")
|
||||
# create motion lora info to be loaded in AnimateDiff Loader
|
||||
lora_info = MotionLoraInfo(name=lora_name, strength=strength)
|
||||
prev_motion_lora.add_lora(lora_info)
|
||||
|
||||
return (prev_motion_lora,)
|
||||
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
# Unencapsulated
|
||||
"ADE_AnimateDiffLoRALoader": AnimateDiffLoraLoader,
|
||||
@@ -91,6 +54,14 @@ NODE_CLASS_MAPPINGS = {
|
||||
"ADE_AdjustPESweetspotStretch": SweetspotStretchPENode,
|
||||
"ADE_AdjustPEFullStretch": FullStretchPENode,
|
||||
"ADE_AdjustPEManual": ManualAdjustPENode,
|
||||
# Sample Settings
|
||||
"ADE_CustomCFG": CustomCFGNode,
|
||||
"ADE_CustomCFGKeyframe": CustomCFGKeyframeNode,
|
||||
"ADE_SigmaSchedule": SigmaScheduleNode,
|
||||
"ADE_RawSigmaSchedule": RawSigmaScheduleNode,
|
||||
"ADE_SigmaScheduleWeightedAverage": WeightedAverageSigmaScheduleNode,
|
||||
"ADE_SigmaScheduleWeightedAverageInterp": InterpolatedWeightedAverageSigmaScheduleNode,
|
||||
"ADE_SigmaScheduleSplitAndCombine": SplitAndCombineSigmaScheduleNode,
|
||||
# Extras Nodes
|
||||
"ADE_AnimateDiffUnload": AnimateDiffUnload,
|
||||
"ADE_EmptyLatentImageLarge": EmptyLatentImageLarge,
|
||||
@@ -107,6 +78,8 @@ NODE_CLASS_MAPPINGS = {
|
||||
"ADE_ApplyAnimateDiffModelSimple": ApplyAnimateDiffModelBasicNode,
|
||||
"ADE_ApplyAnimateDiffModel": ApplyAnimateDiffModelNode,
|
||||
"ADE_LoadAnimateDiffModel": LoadAnimateDiffModelNode,
|
||||
# MaskedLoraLoader
|
||||
#"ADE_MaskedLoadLora": MaskedLoraLoader,
|
||||
# Deprecated Nodes
|
||||
"AnimateDiffLoaderV1": AnimateDiffLoader_Deprecated,
|
||||
"ADE_AnimateDiffLoaderV1Advanced": AnimateDiffLoaderAdvanced_Deprecated,
|
||||
@@ -143,6 +116,14 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"ADE_AdjustPESweetspotStretch": "Adjust PE [Sweetspot Stretch] 🎭🅐🅓",
|
||||
"ADE_AdjustPEFullStretch": "Adjust PE [Full Stretch] 🎭🅐🅓",
|
||||
"ADE_AdjustPEManual": "Adjust PE [Manual] 🎭🅐🅓",
|
||||
# Sample Settings
|
||||
"ADE_CustomCFG": "Custom CFG 🎭🅐🅓",
|
||||
"ADE_CustomCFGKeyframe": "Custom CFG Keyframe 🎭🅐🅓",
|
||||
"ADE_SigmaSchedule": "Create Sigma Schedule 🎭🅐🅓",
|
||||
"ADE_RawSigmaSchedule": "Create Raw Sigma Schedule 🎭🅐🅓",
|
||||
"ADE_SigmaScheduleWeightedAverage": "Sigma Schedule Weighted Mean 🎭🅐🅓",
|
||||
"ADE_SigmaScheduleWeightedAverageInterp": "Sigma Schedule Interpolated Mean 🎭🅐🅓",
|
||||
"ADE_SigmaScheduleSplitAndCombine": "Sigma Schedule Split Combine 🎭🅐🅓",
|
||||
# Extras Nodes
|
||||
"ADE_AnimateDiffUnload": "AnimateDiff Unload 🎭🅐🅓",
|
||||
"ADE_EmptyLatentImageLarge": "Empty Latent Image (Big Batch) 🎭🅐🅓",
|
||||
@@ -159,8 +140,10 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"ADE_ApplyAnimateDiffModelSimple": "Apply AnimateDiff Model 🎭🅐🅓②",
|
||||
"ADE_ApplyAnimateDiffModel": "Apply AnimateDiff Model (Adv.) 🎭🅐🅓②",
|
||||
"ADE_LoadAnimateDiffModel": "Load AnimateDiff Model 🎭🅐🅓②",
|
||||
# MaskedLoraLoader
|
||||
#"ADE_MaskedLoadLora": "Load LoRA (Masked) 🎭🅐🅓",
|
||||
# Deprecated Nodes
|
||||
"AnimateDiffLoaderV1": "AnimateDiff Loader [DEPRECATED] 🎭🅐🅓",
|
||||
"ADE_AnimateDiffLoaderV1Advanced": "AnimateDiff Loader (Advanced) [DEPRECATED] 🎭🅐🅓",
|
||||
"ADE_AnimateDiffCombine": "DO NOT USE, USE VideoCombine from ComfyUI-VideoHelperSuite instead! AnimateDiff Combine [DEPRECATED, DO NOT USE] 🎭🅐🅓",
|
||||
"ADE_AnimateDiffCombine": "AnimateDiff Combine [DEPRECATED, Use Video Combine (VHS) Instead!] 🎭🅐🅓",
|
||||
}
|
||||
|
||||
+1
-1
@@ -145,7 +145,7 @@ class StandardStaticContextOptionsNode:
|
||||
"context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}),
|
||||
},
|
||||
"optional": {
|
||||
"fuse_method": (ContextFuseMethod.LIST,),
|
||||
"fuse_method": (ContextFuseMethod.LIST_STATIC,),
|
||||
"use_on_equal_length": ("BOOLEAN", {"default": False},),
|
||||
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
|
||||
"guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}),
|
||||
|
||||
+6
-4
@@ -12,7 +12,7 @@ from PIL.PngImagePlugin import PngInfo
|
||||
import folder_paths
|
||||
from comfy.model_patcher import ModelPatcher
|
||||
|
||||
from .context import ContextSchedules, ContextOptions
|
||||
from .context import ContextOptionsGroup, ContextOptions, ContextSchedules
|
||||
from .logger import logger
|
||||
from .utils_model import Folders, BetaSchedules, get_available_motion_models
|
||||
from .model_injection import ModelPatcherAndInjector, InjectionParams, MotionModelGroup, load_motion_module_gen1
|
||||
@@ -109,16 +109,18 @@ class AnimateDiffLoaderAdvanced_Deprecated:
|
||||
model_name=model_name,
|
||||
apply_v2_properly=False,
|
||||
)
|
||||
# set context settings
|
||||
params.set_context(
|
||||
context_group = ContextOptionsGroup()
|
||||
context_group.add(
|
||||
ContextOptions(
|
||||
context_length=context_length,
|
||||
context_stride=context_stride,
|
||||
context_overlap=context_overlap,
|
||||
context_schedule=context_schedule,
|
||||
closed_loop=closed_loop,
|
||||
)
|
||||
)
|
||||
)
|
||||
# set context settings
|
||||
params.set_context(context_options=context_group)
|
||||
# inject for use in sampling code
|
||||
model = ModelPatcherAndInjector(model)
|
||||
model.motion_models = MotionModelGroup(motion_model)
|
||||
|
||||
+2
-2
@@ -6,13 +6,13 @@ from comfy.model_patcher import ModelPatcher
|
||||
from comfy.sd import load_checkpoint_guess_config
|
||||
|
||||
from .logger import logger
|
||||
from .utils_model import IsChangedHelper, BetaSchedules
|
||||
from .utils_model import BetaSchedules
|
||||
from .model_injection import get_vanilla_model_patcher
|
||||
|
||||
|
||||
class AnimateDiffUnload:
|
||||
def __init__(self) -> None:
|
||||
self.change = IsChangedHelper()
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
|
||||
+14
-7
@@ -81,13 +81,20 @@ class AnimateDiffLoaderGen1:
|
||||
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
|
||||
model.motion_injection_params = params
|
||||
|
||||
# save model sampling from BetaSchedule as object patch
|
||||
# if autoselect, get suggested beta_schedule from motion model
|
||||
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
|
||||
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
|
||||
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
|
||||
if new_model_sampling is not None:
|
||||
model.add_object_patch("model_sampling", new_model_sampling)
|
||||
if model.sample_settings.custom_cfg is not None:
|
||||
logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
|
||||
|
||||
if model.sample_settings.sigma_schedule is not None:
|
||||
logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
|
||||
model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().model_sampling)
|
||||
else:
|
||||
# save model sampling from BetaSchedule as object patch
|
||||
# if autoselect, get suggested beta_schedule from motion model
|
||||
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
|
||||
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
|
||||
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
|
||||
if new_model_sampling is not None:
|
||||
model.add_object_patch("model_sampling", new_model_sampling)
|
||||
|
||||
del motion_model
|
||||
return (model,)
|
||||
|
||||
+14
-7
@@ -59,13 +59,20 @@ class UseEvolvedSamplingNode:
|
||||
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
|
||||
model.motion_injection_params = params
|
||||
|
||||
# save model_sampling from BetaSchedule as object patch
|
||||
# if autoselect, get suggested beta_schedule from motion model
|
||||
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
|
||||
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
|
||||
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
|
||||
if new_model_sampling is not None:
|
||||
model.add_object_patch("model_sampling", new_model_sampling)
|
||||
if model.sample_settings.custom_cfg is not None:
|
||||
logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
|
||||
|
||||
if model.sample_settings.sigma_schedule is not None:
|
||||
logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
|
||||
model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().model_sampling)
|
||||
else:
|
||||
# save model_sampling from BetaSchedule as object patch
|
||||
# if autoselect, get suggested beta_schedule from motion model
|
||||
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
|
||||
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
|
||||
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
|
||||
if new_model_sampling is not None:
|
||||
model.add_object_patch("model_sampling", new_model_sampling)
|
||||
|
||||
del m_models
|
||||
return (model,)
|
||||
|
||||
+44
-37
@@ -4,7 +4,7 @@ from typing import Union
|
||||
import torch
|
||||
from torch import Tensor
|
||||
|
||||
from .utils_motion import linear_conversion, normalize_min_max
|
||||
from .utils_motion import linear_conversion, normalize_min_max, extend_to_batch_size
|
||||
|
||||
|
||||
class ScaleType:
|
||||
@@ -41,24 +41,64 @@ class MultivalDynamicNode:
|
||||
if len(float_val) < mask_optional.shape[0]:
|
||||
# copies last entry enough times to match mask shape
|
||||
float_val = float_val + float_val[-1]*(mask_optional.shape[0]-len(float_val))
|
||||
if mask_optional.shape[0] < len(float_val):
|
||||
mask_optional = extend_to_batch_size(mask_optional, len(float_val))
|
||||
float_val = float_val[:mask_optional.shape[0]]
|
||||
float_val: Tensor = torch.tensor(float_val).unsqueeze(-1).unsqueeze(-1)
|
||||
# now that inputs are normalized, figure out what value to actually return
|
||||
if mask_optional is not None:
|
||||
mask_optional = mask_optional.clone()
|
||||
mask_optional = mask_optional * float_val
|
||||
if float_is_iterable:
|
||||
mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
|
||||
else:
|
||||
mask_optional = mask_optional * float_val
|
||||
return (mask_optional,)
|
||||
else:
|
||||
if not float_is_iterable:
|
||||
return (float_val,)
|
||||
# create a dummy mask of b,h,w=float_len,1,1 (sigle pixel)
|
||||
# purpose is for float input to work with mask code, without special cases
|
||||
float_len = len(float_val) if float_is_iterable else 1
|
||||
float_len = float_val.shape[0] if float_is_iterable else 1
|
||||
shape = (float_len,1,1)
|
||||
mask_optional = torch.ones(shape)
|
||||
mask_optional = mask_optional * float_val
|
||||
mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
|
||||
return (mask_optional,)
|
||||
|
||||
|
||||
class MultivalScaledMaskNode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"min_float_val": ("FLOAT", {"default": 0.0, "min": 0.0, "step": 0.001}),
|
||||
"max_float_val": ("FLOAT", {"default": 1.0, "min": 0.0, "step": 0.001}),
|
||||
"mask": ("MASK",),
|
||||
},
|
||||
"optional": {
|
||||
"scaling": (ScaleType.LIST,),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("MULTIVAL",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/multival"
|
||||
FUNCTION = "create_multival"
|
||||
|
||||
def create_multival(self, min_float_val: float, max_float_val: float, mask: Tensor, scaling: str=ScaleType.ABSOLUTE):
|
||||
# TODO: allow min_float_val and max_float_val to be list[float]
|
||||
if isinstance(min_float_val, Iterable):
|
||||
raise ValueError(f"min_float_val must be type float (no lists allowed here), not {type(min_float_val).__name__}.")
|
||||
if isinstance(max_float_val, Iterable):
|
||||
raise ValueError(f"max_float_val must be type float (no lists allowed here), not {type(max_float_val).__name__}.")
|
||||
|
||||
if scaling == ScaleType.ABSOLUTE:
|
||||
mask = linear_conversion(mask.clone(), new_min=min_float_val, new_max=max_float_val)
|
||||
elif scaling == ScaleType.RELATIVE:
|
||||
mask = normalize_min_max(mask.clone(), new_min=min_float_val, new_max=max_float_val)
|
||||
else:
|
||||
raise ValueError(f"scaling '{scaling}' not recognized.")
|
||||
return MultivalDynamicNode.create_multival(self, mask_optional=mask)
|
||||
|
||||
|
||||
class MultivalDynamicFloatInputNode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
@@ -94,36 +134,3 @@ class MultivalFloatNode:
|
||||
|
||||
def create_multival(self, float_val: Union[float, list[float]]=None):
|
||||
return MultivalDynamicNode.create_multival(self, float_val=float_val)
|
||||
|
||||
|
||||
class MultivalScaledMaskNode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"min_float_val": ("FLOAT", {"default": 0.0, "min": 0.0, "step": 0.001}),
|
||||
"max_float_val": ("FLOAT", {"default": 1.0, "min": 0.0, "step": 0.001}),
|
||||
"mask": ("MASK",),
|
||||
},
|
||||
"optional": {
|
||||
"scaling": (ScaleType.LIST,),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("MULTIVAL",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/multival"
|
||||
FUNCTION = "create_multival"
|
||||
|
||||
def create_multival(self, min_float_val: float, max_float_val: float, mask: Tensor, scaling: str=ScaleType.ABSOLUTE):
|
||||
if isinstance(min_float_val, Iterable):
|
||||
raise ValueError(f"min_float_val must be type float (no lists allowed here), not {type(min_float_val).__name__}.")
|
||||
if isinstance(max_float_val, Iterable):
|
||||
raise ValueError(f"max_float_val must be type float (no lists allowed here), not {type(max_float_val).__name__}.")
|
||||
|
||||
if scaling == ScaleType.ABSOLUTE:
|
||||
mask = linear_conversion(mask.clone(), new_min=min_float_val, new_max=max_float_val)
|
||||
elif scaling == ScaleType.RELATIVE:
|
||||
mask = normalize_min_max(mask.clone(), new_min=min_float_val, new_max=max_float_val)
|
||||
else:
|
||||
raise ValueError(f"scaling '{scaling}' not recognized.")
|
||||
return MultivalDynamicNode.create_multival(self, mask_optional=mask)
|
||||
|
||||
+65
-10
@@ -1,8 +1,11 @@
|
||||
from typing import Union
|
||||
from torch import Tensor
|
||||
|
||||
from .freeinit import FreeInitFilter
|
||||
from .sample_settings import FreeInitOptions, IterationOptions, NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType, SeedNoiseGeneration, SampleSettings
|
||||
from .utils_model import BIGMIN, BIGMAX
|
||||
from .sample_settings import (FreeInitOptions, IterationOptions,
|
||||
NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType,
|
||||
SeedNoiseGeneration, SampleSettings, CustomCFGKeyframeGroup, CustomCFGKeyframe)
|
||||
from .utils_model import BIGMIN, BIGMAX, SigmaSchedule
|
||||
|
||||
|
||||
class SampleSettingsNode:
|
||||
@@ -20,18 +23,22 @@ class SampleSettingsNode:
|
||||
"iteration_opts": ("ITERATION_OPTS",),
|
||||
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
|
||||
"adapt_denoise_steps": ("BOOLEAN", {"default": False},),
|
||||
"custom_cfg": ("CUSTOM_CFG",),
|
||||
"sigma_schedule": ("SIGMA_SCHEDULE",),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("SAMPLE_SETTINGS",)
|
||||
RETURN_NAMES = ("settings",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓"
|
||||
FUNCTION = "create_settings"
|
||||
|
||||
def create_settings(self, batch_offset: int, noise_type: str, seed_gen: str, seed_offset: int, noise_layers: NoiseLayerGroup=None,
|
||||
iteration_opts: IterationOptions=None, seed_override: int=None, adapt_denoise_steps=False):
|
||||
iteration_opts: IterationOptions=None, seed_override: int=None, adapt_denoise_steps=False,
|
||||
custom_cfg: CustomCFGKeyframeGroup=None, sigma_schedule: SigmaSchedule=None):
|
||||
sampling_settings = SampleSettings(batch_offset=batch_offset, noise_type=noise_type, seed_gen=seed_gen, seed_offset=seed_offset, noise_layers=noise_layers,
|
||||
iteration_opts=iteration_opts, seed_override=seed_override, adapt_denoise_steps=adapt_denoise_steps)
|
||||
iteration_opts=iteration_opts, seed_override=seed_override, adapt_denoise_steps=adapt_denoise_steps,
|
||||
custom_cfg=custom_cfg, sigma_schedule=sigma_schedule)
|
||||
return (sampling_settings,)
|
||||
|
||||
|
||||
@@ -51,7 +58,7 @@ class NoiseLayerReplaceNode:
|
||||
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("NOISE_LAYERS",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
|
||||
FUNCTION = "create_layers"
|
||||
@@ -86,7 +93,7 @@ class NoiseLayerAddNode:
|
||||
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("NOISE_LAYERS",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
|
||||
FUNCTION = "create_layers"
|
||||
@@ -124,7 +131,7 @@ class NoiseLayerAddWeightedNode:
|
||||
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("NOISE_LAYERS",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
|
||||
FUNCTION = "create_layers"
|
||||
@@ -156,7 +163,7 @@ class IterationOptionsNode:
|
||||
"iter_seed_offset": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("ITERATION_OPTS",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts"
|
||||
FUNCTION = "create_iter_opts"
|
||||
@@ -185,7 +192,7 @@ class FreeInitOptionsNode:
|
||||
"iter_seed_offset": ("INT", {"default": 1, "min": BIGMIN, "max": BIGMAX}),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("ITERATION_OPTS",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts"
|
||||
FUNCTION = "create_iter_opts"
|
||||
@@ -198,3 +205,51 @@ class FreeInitOptionsNode:
|
||||
filter=filter, d_s=d_s, d_t=d_t, n=n_butterworth, init_type=init_type,
|
||||
iter_batch_offset=iter_batch_offset, iter_seed_offset=iter_seed_offset)
|
||||
return (iter_opts,)
|
||||
|
||||
|
||||
class CustomCFGNode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"cfg_multival": ("MULTIVAL",),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("CUSTOM_CFG",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/sample settings"
|
||||
FUNCTION = "create_custom_cfg"
|
||||
|
||||
def create_custom_cfg(self, cfg_multival: Union[float, Tensor]):
|
||||
keyframe = CustomCFGKeyframe(cfg_multival=cfg_multival)
|
||||
cfg_custom = CustomCFGKeyframeGroup()
|
||||
cfg_custom.add(keyframe)
|
||||
return (cfg_custom,)
|
||||
|
||||
|
||||
class CustomCFGKeyframeNode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"cfg_multival": ("MULTIVAL",),
|
||||
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
|
||||
"guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}),
|
||||
},
|
||||
"optional": {
|
||||
"prev_custom_cfg": ("CUSTOM_CFG",),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("CUSTOM_CFG",)
|
||||
CATEGORY = "Animate Diff 🎭🅐🅓/sample settings"
|
||||
FUNCTION = "create_custom_cfg"
|
||||
|
||||
def create_custom_cfg(self, cfg_multival: Union[float, Tensor], start_percent: float=0.0, guarantee_steps: int=1,
|
||||
prev_custom_cfg: CustomCFGKeyframeGroup=None):
|
||||
if not prev_custom_cfg:
|
||||
prev_custom_cfg = CustomCFGKeyframeGroup()
|
||||
prev_custom_cfg = prev_custom_cfg.clone()
|
||||
keyframe = CustomCFGKeyframe(cfg_multival=cfg_multival, start_percent=start_percent, guarantee_steps=guarantee_steps)
|
||||
prev_custom_cfg.add(keyframe)
|
||||
return (prev_custom_cfg,)
|
||||
|
||||
+120
-2
@@ -1,13 +1,17 @@
|
||||
from collections.abc import Iterable
|
||||
from typing import Union
|
||||
import torch
|
||||
from torch import Tensor
|
||||
|
||||
import comfy.sample
|
||||
import comfy.samplers
|
||||
from comfy.model_patcher import ModelPatcher
|
||||
from comfy.model_base import BaseModel
|
||||
|
||||
from . import freeinit
|
||||
from .context import ContextOptions, ContextOptionsGroup
|
||||
from .utils_model import SigmaSchedule
|
||||
from .utils_motion import extend_to_batch_size, get_sorted_list_via_attr, prepare_mask_batch
|
||||
from .logger import logger
|
||||
|
||||
|
||||
@@ -48,7 +52,8 @@ class NoiseNormalize:
|
||||
|
||||
class SampleSettings:
|
||||
def __init__(self, batch_offset: int=0, noise_type: str=None, seed_gen: str=None, seed_offset: int=0, noise_layers: 'NoiseLayerGroup'=None,
|
||||
iteration_opts=None, seed_override:int=None, negative_cond_flipflop=False, adapt_denoise_steps: bool=False):
|
||||
iteration_opts=None, seed_override:int=None, negative_cond_flipflop=False, adapt_denoise_steps: bool=False,
|
||||
custom_cfg: 'CustomCFGKeyframeGroup'=None, sigma_schedule: SigmaSchedule=None):
|
||||
self.batch_offset = batch_offset
|
||||
self.noise_type = noise_type if noise_type is not None else NoiseLayerType.DEFAULT
|
||||
self.seed_gen = seed_gen if seed_gen is not None else SeedNoiseGeneration.COMFY
|
||||
@@ -58,6 +63,8 @@ class SampleSettings:
|
||||
self.seed_override = seed_override
|
||||
self.negative_cond_flipflop = negative_cond_flipflop
|
||||
self.adapt_denoise_steps = adapt_denoise_steps
|
||||
self.custom_cfg = custom_cfg.clone() if custom_cfg else custom_cfg
|
||||
self.sigma_schedule = sigma_schedule
|
||||
|
||||
def prepare_noise(self, seed: int, latents: Tensor, noise: Tensor, extra_seed_offset=0, extra_args:dict={}, force_create_noise=True):
|
||||
if self.seed_override is not None:
|
||||
@@ -82,10 +89,18 @@ class SampleSettings:
|
||||
# noise prepared now
|
||||
return noise
|
||||
|
||||
def pre_run(self, model: ModelPatcher):
|
||||
if self.custom_cfg is not None:
|
||||
self.custom_cfg.reset()
|
||||
|
||||
def cleanup(self):
|
||||
if self.custom_cfg is not None:
|
||||
self.custom_cfg.reset()
|
||||
|
||||
def clone(self):
|
||||
return SampleSettings(batch_offset=self.batch_offset, noise_type=self.noise_type, seed_gen=self.seed_gen, seed_offset=self.seed_offset,
|
||||
noise_layers=self.noise_layers.clone(), iteration_opts=self.iteration_opts, seed_override=self.seed_override,
|
||||
negative_cond_flipflop=self.negative_cond_flipflop, adapt_denoise_steps=self.adapt_denoise_steps)
|
||||
negative_cond_flipflop=self.negative_cond_flipflop, adapt_denoise_steps=self.adapt_denoise_steps, custom_cfg=self.custom_cfg, sigma_schedule=self.sigma_schedule)
|
||||
|
||||
|
||||
class NoiseLayer:
|
||||
@@ -435,3 +450,106 @@ class FreeInitOptions(IterationOptions):
|
||||
return cached_latents, noised_latents
|
||||
else:
|
||||
raise ValueError(f"FreeInit init_type '{self.init_type}' is not recognized.")
|
||||
|
||||
|
||||
class CustomCFGKeyframe:
|
||||
def __init__(self, cfg_multival: Union[float, Tensor], start_percent=0.0, guarantee_steps=1):
|
||||
self.cfg_multival = cfg_multival
|
||||
# scheduling
|
||||
self.start_percent = float(start_percent)
|
||||
self.start_t = 999999999.9
|
||||
self.guarantee_steps = guarantee_steps
|
||||
|
||||
def clone(self):
|
||||
c = CustomCFGKeyframe(cfg_multival=self.cfg_multival,
|
||||
start_percent=self.start_percent, guarantee_steps=self.guarantee_steps)
|
||||
c.start_t = self.start_t
|
||||
return c
|
||||
|
||||
|
||||
class CustomCFGKeyframeGroup:
|
||||
def __init__(self):
|
||||
self.keyframes: list[CustomCFGKeyframe] = []
|
||||
self._current_keyframe: CustomCFGKeyframe = None
|
||||
self._current_used_steps: int = 0
|
||||
self._current_index: int = 0
|
||||
|
||||
def reset(self):
|
||||
self._current_keyframe = None
|
||||
self._current_used_steps = 0
|
||||
self._current_index = 0
|
||||
self._set_first_as_current()
|
||||
|
||||
def add(self, keyframe: CustomCFGKeyframe):
|
||||
# add to end of list, then sort
|
||||
self.keyframes.append(keyframe)
|
||||
self.keyframes = get_sorted_list_via_attr(self.keyframes, "start_percent")
|
||||
self._set_first_as_current()
|
||||
|
||||
def _set_first_as_current(self):
|
||||
if len(self.keyframes) > 0:
|
||||
self._current_keyframe = self.keyframes[0]
|
||||
else:
|
||||
self._current_keyframe = None
|
||||
|
||||
def has_index(self, index: int) -> int:
|
||||
return index >=0 and index < len(self.keyframes)
|
||||
|
||||
def is_empty(self) -> bool:
|
||||
return len(self.keyframes) == 0
|
||||
|
||||
def clone(self):
|
||||
cloned = CustomCFGKeyframeGroup()
|
||||
for keyframe in self.keyframes:
|
||||
cloned.keyframes.append(keyframe)
|
||||
cloned._set_first_as_current()
|
||||
return cloned
|
||||
|
||||
def initialize_timesteps(self, model: BaseModel):
|
||||
for keyframe in self.keyframes:
|
||||
keyframe.start_t = model.model_sampling.percent_to_sigma(keyframe.start_percent)
|
||||
|
||||
def prepare_current_keyframe(self, t: Tensor):
|
||||
curr_t: float = t[0]
|
||||
prev_index = self._current_index
|
||||
# if met guaranteed steps, look for next keyframe in case need to switch
|
||||
if self._current_used_steps >= self._current_keyframe.guarantee_steps:
|
||||
# if has next index, loop through and see if need t oswitch
|
||||
if self.has_index(self._current_index+1):
|
||||
for i in range(self._current_index+1, len(self.keyframes)):
|
||||
eval_c = self.keyframes[i]
|
||||
# check if start_t is greater or equal to curr_t
|
||||
# NOTE: t is in terms of sigmas, not percent, so bigger number = earlier step in sampling
|
||||
if eval_c.start_t >= curr_t:
|
||||
self._current_index = i
|
||||
self._current_keyframe = eval_c
|
||||
self._current_used_steps = 0
|
||||
# if guarantee_steps greater than zero, stop searching for other keyframes
|
||||
if self._current_keyframe.guarantee_steps > 0:
|
||||
break
|
||||
# if eval_c is outside the percent range, stop looking further
|
||||
else: break
|
||||
# update steps current context is used
|
||||
self._current_used_steps += 1
|
||||
|
||||
def patch_model(self, model: ModelPatcher) -> ModelPatcher:
|
||||
def evolved_custom_cfg(args):
|
||||
cond: Tensor = args["cond"]
|
||||
uncond: Tensor = args["uncond"]
|
||||
# cond scale is based purely off of CustomCFG - cond_scale input in sampler is ignored!
|
||||
cond_scale = self.cfg_multival
|
||||
if isinstance(cond_scale, Tensor):
|
||||
cond_scale = prepare_mask_batch(cond_scale.to(cond.dtype).to(cond.device), cond.shape)
|
||||
cond_scale = extend_to_batch_size(cond_scale, cond.shape[0])
|
||||
return uncond + (cond - uncond) * cond_scale
|
||||
|
||||
model = model.clone()
|
||||
model.set_model_sampler_cfg_function(evolved_custom_cfg)
|
||||
return model
|
||||
|
||||
# properties shadow those of CustomCFGKeyframe
|
||||
@property
|
||||
def cfg_multival(self):
|
||||
if self._current_keyframe != None:
|
||||
return self._current_keyframe.cfg_multival
|
||||
return None
|
||||
|
||||
+57
-21
@@ -16,7 +16,7 @@ from comfy.controlnet import ControlBase
|
||||
import comfy.ops
|
||||
|
||||
from .context import ContextFuseMethod, ContextSchedules, get_context_weights, get_context_windows
|
||||
from .sample_settings import IterationOptions, SeedNoiseGeneration, prepare_mask_ad
|
||||
from .sample_settings import IterationOptions, SampleSettings, SeedNoiseGeneration, prepare_mask_ad
|
||||
from .utils_model import ModelTypeSD, wrap_function_to_inject_xformers_bug_info
|
||||
from .model_injection import InjectionParams, ModelPatcherAndInjector, MotionModelGroup, MotionModelPatcher
|
||||
from .motion_module_ad import AnimateDiffFormat, AnimateDiffInfo, AnimateDiffVersion, VanillaTemporalModule
|
||||
@@ -30,6 +30,7 @@ class AnimateDiffHelper_GlobalState:
|
||||
def __init__(self):
|
||||
self.motion_models: MotionModelGroup = None
|
||||
self.params: InjectionParams = None
|
||||
self.sample_settings: SampleSettings = None
|
||||
self.reset()
|
||||
|
||||
def initialize(self, model):
|
||||
@@ -40,6 +41,8 @@ class AnimateDiffHelper_GlobalState:
|
||||
self.motion_models.initialize_timesteps(model)
|
||||
if self.params.context_options is not None:
|
||||
self.params.context_options.initialize_timesteps(model)
|
||||
if self.sample_settings.custom_cfg is not None:
|
||||
self.sample_settings.custom_cfg.initialize_timesteps(model)
|
||||
|
||||
def reset(self):
|
||||
self.initialized = False
|
||||
@@ -53,6 +56,9 @@ class AnimateDiffHelper_GlobalState:
|
||||
if self.params is not None:
|
||||
del self.params
|
||||
self.params = None
|
||||
if self.sample_settings is not None:
|
||||
del self.sample_settings
|
||||
self.sample_settings = None
|
||||
|
||||
def update_with_inject_params(self, params: InjectionParams):
|
||||
self.params = params
|
||||
@@ -147,8 +153,9 @@ def get_additional_models_factory(orig_get_additional_models: Callable, motion_m
|
||||
|
||||
def apply_params_to_motion_models(motion_models: MotionModelGroup, params: InjectionParams):
|
||||
params = params.clone()
|
||||
if params.context_options.context_schedule == ContextSchedules.VIEW_AS_CONTEXT:
|
||||
params.context_options._current_context.context_length = params.full_length
|
||||
for context in params.context_options.contexts:
|
||||
if context.context_schedule == ContextSchedules.VIEW_AS_CONTEXT:
|
||||
context.context_length = params.full_length
|
||||
# TODO: check (and message) should be different based on use_on_equal_length setting
|
||||
if params.context_options.context_length:
|
||||
pass
|
||||
@@ -167,7 +174,7 @@ def apply_params_to_motion_models(motion_models: MotionModelGroup, params: Injec
|
||||
# if no context_length, treat video length as intended AD frame window
|
||||
if not params.context_options.context_length:
|
||||
for motion_model in motion_models.models:
|
||||
if params.full_length > motion_model.model.encoding_max_len:
|
||||
if not motion_model.model.is_length_valid_for_encoding_max_len(params.full_length):
|
||||
raise ValueError(f"Without a context window, AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames, but received {params.full_length} latents.")
|
||||
motion_models.set_video_length(params.full_length, params.full_length)
|
||||
# otherwise, treat context_length as intended AD frame window
|
||||
@@ -175,7 +182,7 @@ def apply_params_to_motion_models(motion_models: MotionModelGroup, params: Injec
|
||||
for motion_model in motion_models.models:
|
||||
view_options = params.context_options.view_options
|
||||
context_length = view_options.context_length if view_options else params.context_options.context_length
|
||||
if context_length > motion_model.model.encoding_max_len:
|
||||
if not motion_model.model.is_length_valid_for_encoding_max_len(context_length):
|
||||
raise ValueError(f"AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames for a context window, but received context length of {params.context_options.context_length}.")
|
||||
motion_models.set_video_length(params.context_options.context_length, params.full_length)
|
||||
# inject model
|
||||
@@ -202,10 +209,10 @@ class FunctionInjectionHolder:
|
||||
if params.unlimited_area_hack:
|
||||
model.model.memory_required = unlimited_memory_required
|
||||
if model.motion_models is not None:
|
||||
# only apply groupnorm hack if not [v3 or (AnimateDiff SD1.5 and v2 and should apply v2 properly)]
|
||||
# only apply groupnorm hack if not [v3 or ([not Hotshot] and SD1.5 and v2 and apply_v2_properly)]
|
||||
info: AnimateDiffInfo = model.motion_models[0].model.mm_info
|
||||
if not (info.mm_version == AnimateDiffVersion.V3 or (info.mm_format == AnimateDiffFormat.ANIMATEDIFF and info.sd_type == ModelTypeSD.SD1_5 and
|
||||
info.mm_version == AnimateDiffVersion.V2 and params.apply_v2_properly)):
|
||||
if not (info.mm_version == AnimateDiffVersion.V3 or
|
||||
(info.mm_format not in [AnimateDiffFormat.HOTSHOTXL] and info.sd_type == ModelTypeSD.SD1_5 and info.mm_version == AnimateDiffVersion.V2 and params.apply_v2_properly)):
|
||||
torch.nn.GroupNorm.forward = groupnorm_mm_factory(params)
|
||||
comfy.ops.manual_cast.GroupNorm.forward_comfy_cast_weights = groupnorm_mm_factory(params, manual_cast=True)
|
||||
# if mps device (Apple Silicon), disable batched conds to avoid black images with groupnorm hack
|
||||
@@ -245,6 +252,8 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
|
||||
cached_noise = None
|
||||
function_injections = FunctionInjectionHolder()
|
||||
try:
|
||||
if model.sample_settings.custom_cfg is not None:
|
||||
model = model.sample_settings.custom_cfg.patch_model(model)
|
||||
# clone params from model
|
||||
params = model.motion_injection_params.clone()
|
||||
# get amount of latents passed in, and store in params
|
||||
@@ -279,6 +288,7 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
|
||||
ADGS.current_step = ADGS.start_step + step + 1
|
||||
kwargs["callback"] = ad_callback
|
||||
ADGS.motion_models = model.motion_models
|
||||
ADGS.sample_settings = model.sample_settings
|
||||
|
||||
# apply adapt_denoise_steps
|
||||
args = list(args)
|
||||
@@ -331,6 +341,8 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
|
||||
|
||||
if model.motion_models is not None:
|
||||
model.motion_models.pre_run(model)
|
||||
if model.sample_settings is not None:
|
||||
model.sample_settings.pre_run(model)
|
||||
latents = wrap_function_to_inject_xformers_bug_info(orig_comfy_sample)(model, noise, *args, **kwargs)
|
||||
return latents
|
||||
finally:
|
||||
@@ -352,8 +364,11 @@ def evolved_sampling_function(model, x, timestep, uncond, cond, cond_scale, mode
|
||||
ADGS.motion_models.prepare_current_keyframe(t=timestep)
|
||||
if ADGS.params.context_options is not None:
|
||||
ADGS.params.context_options.prepare_current_context(t=timestep)
|
||||
if ADGS.sample_settings.custom_cfg is not None:
|
||||
ADGS.sample_settings.custom_cfg.prepare_current_keyframe(t=timestep)
|
||||
|
||||
if math.isclose(cond_scale, 1.0) and model_options.get("disable_cfg1_optimization", False) == False:
|
||||
# never use cfg1 optimization if using custom_cfg (since can have timesteps and such)
|
||||
if ADGS.sample_settings.custom_cfg is None and math.isclose(cond_scale, 1.0) and model_options.get("disable_cfg1_optimization", False) == False:
|
||||
uncond_ = None
|
||||
else:
|
||||
uncond_ = uncond
|
||||
@@ -454,6 +469,7 @@ def sliding_calc_cond_uncond_batch(model, cond, uncond, x_in: Tensor, timestep,
|
||||
cond_final = torch.zeros_like(x_in)
|
||||
uncond_final = torch.zeros_like(x_in)
|
||||
out_count_final = torch.zeros((x_in.shape[0], 1, 1, 1), device=x_in.device)
|
||||
bias_final = [0.0] * x_in.shape[0]
|
||||
|
||||
# perform calc_cond_uncond_batch per context window
|
||||
for ctx_idxs in context_windows:
|
||||
@@ -477,16 +493,36 @@ def sliding_calc_cond_uncond_batch(model, cond, uncond, x_in: Tensor, timestep,
|
||||
|
||||
sub_cond_out, sub_uncond_out = comfy.samplers.calc_cond_uncond_batch(model, sub_cond, sub_uncond, sub_x, sub_timestep, model_options)
|
||||
|
||||
# add conds and counts based on weights of fuse method
|
||||
weights = get_context_weights(len(ctx_idxs), ADGS.params.context_options.fuse_method) * batched_conds
|
||||
weights_tensor = torch.Tensor(weights).to(device=x_in.device).unsqueeze(-1).unsqueeze(-1).unsqueeze(-1)
|
||||
cond_final[full_idxs] += sub_cond_out * weights_tensor
|
||||
uncond_final[full_idxs] += sub_uncond_out * weights_tensor
|
||||
out_count_final[full_idxs] += weights_tensor
|
||||
if ADGS.params.context_options.fuse_method == ContextFuseMethod.RELATIVE:
|
||||
full_length = ADGS.params.full_length
|
||||
for pos, idx in enumerate(ctx_idxs):
|
||||
# bias is the influence of a specific index in relation to the whole context window
|
||||
bias = 1 - abs(idx - (ctx_idxs[0] + ctx_idxs[-1]) / 2) / ((ctx_idxs[-1] - ctx_idxs[0] + 1e-2) / 2)
|
||||
bias = max(1e-2, bias)
|
||||
# take weighted average relative to total bias of current idx
|
||||
# and account for batched_conds
|
||||
for n in range(batched_conds):
|
||||
bias_total = bias_final[(full_length*n)+idx]
|
||||
prev_weight = (bias_total / (bias_total + bias))
|
||||
new_weight = (bias / (bias_total + bias))
|
||||
cond_final[(full_length*n)+idx] = cond_final[(full_length*n)+idx] * prev_weight + sub_cond_out[(full_length*n)+pos] * new_weight
|
||||
uncond_final[(full_length*n)+idx] = uncond_final[(full_length*n)+idx] * prev_weight + sub_uncond_out[(full_length*n)+pos] * new_weight
|
||||
bias_final[(full_length*n)+idx] = bias_total + bias
|
||||
else:
|
||||
# add conds and counts based on weights of fuse method
|
||||
weights = get_context_weights(len(ctx_idxs), ADGS.params.context_options.fuse_method) * batched_conds
|
||||
weights_tensor = torch.Tensor(weights).to(device=x_in.device).unsqueeze(-1).unsqueeze(-1).unsqueeze(-1)
|
||||
cond_final[full_idxs] += sub_cond_out * weights_tensor
|
||||
uncond_final[full_idxs] += sub_uncond_out * weights_tensor
|
||||
out_count_final[full_idxs] += weights_tensor
|
||||
|
||||
|
||||
# normalize cond and uncond via division by context usage counts
|
||||
cond_final /= out_count_final
|
||||
uncond_final /= out_count_final
|
||||
del out_count_final
|
||||
return cond_final, uncond_final
|
||||
if ADGS.params.context_options.fuse_method == ContextFuseMethod.RELATIVE:
|
||||
# already normalized, so return as is
|
||||
del out_count_final
|
||||
return cond_final, uncond_final
|
||||
else:
|
||||
# normalize cond and uncond via division by context usage counts
|
||||
cond_final /= out_count_final
|
||||
uncond_final /= out_count_final
|
||||
del out_count_final
|
||||
return cond_final, uncond_final
|
||||
|
||||
+175
-31
@@ -3,72 +3,169 @@ from pathlib import Path
|
||||
from typing import Callable, Union
|
||||
from collections.abc import Iterable
|
||||
from time import time
|
||||
import copy
|
||||
|
||||
import torch
|
||||
import numpy as np
|
||||
|
||||
import folder_paths
|
||||
from comfy.model_base import SD21UNCLIP, SDXL, BaseModel, SDXLRefiner, SVD_img2vid, model_sampling
|
||||
from comfy.model_base import SD21UNCLIP, SDXL, BaseModel, SDXLRefiner, SVD_img2vid, model_sampling, ModelType
|
||||
from comfy.model_management import xformers_enabled
|
||||
from comfy.model_patcher import ModelPatcher
|
||||
|
||||
import comfy.model_sampling
|
||||
import comfy_extras.nodes_model_advanced
|
||||
|
||||
class IsChangedHelper:
|
||||
def __init__(self):
|
||||
self.val = 0
|
||||
|
||||
def no_change(self):
|
||||
return self.val
|
||||
|
||||
def change(self):
|
||||
self.val = (self.val + 1) % 100
|
||||
|
||||
BIGMIN = -(2**53-1)
|
||||
BIGMAX = (2**53-1)
|
||||
|
||||
|
||||
class ModelSamplingConfig:
|
||||
def __init__(self, beta_schedule: str):
|
||||
def __init__(self, beta_schedule: str, linear_start: float=None, linear_end: float=None):
|
||||
self.sampling_settings = {"beta_schedule": beta_schedule}
|
||||
if linear_start is not None:
|
||||
self.sampling_settings["linear_start"] = linear_start
|
||||
if linear_end is not None:
|
||||
self.sampling_settings["linear_end"] = linear_end
|
||||
self.beta_schedule = beta_schedule # keeping this for backwards compatibility
|
||||
|
||||
|
||||
class ModelSamplingType:
|
||||
EPS = "eps"
|
||||
V_PREDICTION = "v_prediction"
|
||||
LCM = "lcm"
|
||||
|
||||
_NON_LCM_LIST = [EPS, V_PREDICTION]
|
||||
_FULL_LIST = [EPS, V_PREDICTION, LCM]
|
||||
|
||||
MAP = {
|
||||
EPS: ModelType.EPS,
|
||||
V_PREDICTION: ModelType.V_PREDICTION,
|
||||
LCM: comfy_extras.nodes_model_advanced.LCM,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_alias(cls, alias: str):
|
||||
return cls.MAP[alias]
|
||||
|
||||
|
||||
def factory_model_sampling_discrete_distilled(original_timesteps=50):
|
||||
class ModelSamplingDiscreteDistilledEvolved(comfy_extras.nodes_model_advanced.ModelSamplingDiscreteDistilled):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.original_timesteps = original_timesteps # normal LCM has 50
|
||||
super().__init__(*args, **kwargs)
|
||||
return ModelSamplingDiscreteDistilledEvolved
|
||||
|
||||
|
||||
# based on code in comfy_extras/nodes_model_advanced.py
|
||||
def evolved_model_sampling(model_config: ModelSamplingConfig, model_type: ModelType, alias: str, original_timesteps: int=None):
|
||||
# if LCM, need to handle manually
|
||||
if BetaSchedules.is_lcm(alias) or original_timesteps is not None:
|
||||
sampling_type = comfy_extras.nodes_model_advanced.LCM
|
||||
if original_timesteps is not None:
|
||||
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=original_timesteps)
|
||||
elif alias == BetaSchedules.LCM_100:
|
||||
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=100)
|
||||
elif alias == BetaSchedules.LCM_25:
|
||||
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=25)
|
||||
else:
|
||||
sampling_base = comfy_extras.nodes_model_advanced.ModelSamplingDiscreteDistilled
|
||||
class ModelSamplingAdvancedEvolved(sampling_base, sampling_type):
|
||||
pass
|
||||
# NOTE: if I want to support zsnr, this is where I would add that code
|
||||
return ModelSamplingAdvancedEvolved(model_config)
|
||||
# otherwise, use vanilla model_sampling function
|
||||
return model_sampling(model_config, model_type)
|
||||
|
||||
|
||||
class BetaSchedules:
|
||||
AUTOSELECT = "autoselect"
|
||||
SQRT_LINEAR = "sqrt_linear (AnimateDiff)"
|
||||
LINEAR_ADXL = "linear (AnimateDiff-SDXL)"
|
||||
LINEAR = "linear (HotshotXL/default)"
|
||||
AVG_LINEAR_SQRT_LINEAR = "avg(sqrt_linear,linear)"
|
||||
LCM_AVG_LINEAR_SQRT_LINEAR = "lcm avg(sqrt_linear,linear)"
|
||||
LCM = "lcm"
|
||||
LCM_100 = "lcm[100_ots]"
|
||||
LCM_25 = "lcm[25_ots]"
|
||||
LCM_SQRT_LINEAR = "lcm >> sqrt_linear"
|
||||
USE_EXISTING = "use existing"
|
||||
SQRT = "sqrt"
|
||||
COSINE = "cosine"
|
||||
SQUAREDCOS_CAP_V2 = "squaredcos_cap_v2"
|
||||
RAW_LINEAR = "linear"
|
||||
RAW_SQRT_LINEAR = "sqrt_linear"
|
||||
|
||||
ALIAS_LIST = [AUTOSELECT, SQRT_LINEAR, LINEAR_ADXL, LINEAR,
|
||||
USE_EXISTING, SQRT, COSINE, SQUAREDCOS_CAP_V2]
|
||||
RAW_BETA_SCHEDULE_LIST = [RAW_LINEAR, RAW_SQRT_LINEAR, SQRT, COSINE, SQUAREDCOS_CAP_V2]
|
||||
|
||||
ALIAS_LCM_LIST = [LCM, LCM_100, LCM_25, LCM_SQRT_LINEAR]
|
||||
|
||||
ALIAS_ACTIVE_LIST = [SQRT_LINEAR, LINEAR_ADXL, LINEAR, AVG_LINEAR_SQRT_LINEAR, LCM_AVG_LINEAR_SQRT_LINEAR, LCM, LCM_100, LCM_SQRT_LINEAR, # LCM_25 is purposely omitted
|
||||
SQRT, COSINE, SQUAREDCOS_CAP_V2]
|
||||
|
||||
ALIAS_LIST = [AUTOSELECT, USE_EXISTING] + ALIAS_ACTIVE_LIST
|
||||
|
||||
|
||||
|
||||
ALIAS_MAP = {
|
||||
SQRT_LINEAR: "sqrt_linear",
|
||||
LINEAR_ADXL: "linear", # also linear, but has different linear_end (0.020)
|
||||
LINEAR: "linear",
|
||||
LCM_100: "linear", # distilled, 100 original timesteps
|
||||
LCM_25: "linear", # distilled, 25 original timesteps
|
||||
LCM: "linear", # distilled
|
||||
LCM_SQRT_LINEAR: "sqrt_linear", # distilled, sqrt_linear
|
||||
SQRT: "sqrt",
|
||||
COSINE: "cosine",
|
||||
SQUAREDCOS_CAP_V2: "squaredcos_cap_v2",
|
||||
RAW_LINEAR: "linear",
|
||||
RAW_SQRT_LINEAR: "sqrt_linear"
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def is_lcm(cls, alias: str):
|
||||
return alias in cls.ALIAS_LCM_LIST
|
||||
|
||||
@classmethod
|
||||
def to_name(cls, alias: str):
|
||||
return cls.ALIAS_MAP[alias]
|
||||
|
||||
@classmethod
|
||||
def to_config(cls, alias: str) -> ModelSamplingConfig:
|
||||
return ModelSamplingConfig(cls.to_name(alias))
|
||||
|
||||
@classmethod
|
||||
def to_model_sampling(cls, alias: str, model: ModelPatcher):
|
||||
if alias == cls.USE_EXISTING:
|
||||
return None
|
||||
ms_obj = model_sampling(cls.to_config(alias), model_type=model.model.model_type)
|
||||
linear_start = None
|
||||
linear_end = None
|
||||
if alias == cls.LINEAR_ADXL:
|
||||
# uses linear_end=0.020
|
||||
ms_obj._register_schedule(given_betas=None, beta_schedule=cls.to_name(alias), timesteps=1000, linear_start=0.00085, linear_end=0.020, cosine_s=8e-3)
|
||||
linear_end = 0.020
|
||||
return ModelSamplingConfig(cls.to_name(alias), linear_start=linear_start, linear_end=linear_end)
|
||||
|
||||
@classmethod
|
||||
def _to_model_sampling(cls, alias: str, model_type: ModelType, config_override: ModelSamplingConfig=None, original_timesteps: int=None):
|
||||
if alias == cls.USE_EXISTING:
|
||||
return None
|
||||
elif config_override != None:
|
||||
return evolved_model_sampling(config_override, model_type=model_type, alias=alias, original_timesteps=original_timesteps)
|
||||
elif alias == cls.AVG_LINEAR_SQRT_LINEAR:
|
||||
ms_linear = evolved_model_sampling(cls.to_config(cls.LINEAR), model_type=model_type, alias=cls.LINEAR)
|
||||
ms_sqrt_linear = evolved_model_sampling(cls.to_config(cls.SQRT_LINEAR), model_type=model_type, alias=cls.SQRT_LINEAR)
|
||||
avg_sigmas = (ms_linear.sigmas + ms_sqrt_linear.sigmas) / 2
|
||||
ms_linear.set_sigmas(avg_sigmas)
|
||||
return ms_linear
|
||||
elif alias == cls.LCM_AVG_LINEAR_SQRT_LINEAR:
|
||||
ms_linear = evolved_model_sampling(cls.to_config(cls.LCM), model_type=model_type, alias=cls.LCM)
|
||||
ms_sqrt_linear = evolved_model_sampling(cls.to_config(cls.LCM_SQRT_LINEAR), model_type=model_type, alias=cls.LCM_SQRT_LINEAR)
|
||||
avg_sigmas = (ms_linear.sigmas + ms_sqrt_linear.sigmas) / 2
|
||||
ms_linear.set_sigmas(avg_sigmas)
|
||||
return ms_linear
|
||||
# average out the sigmas
|
||||
ms_obj = evolved_model_sampling(cls.to_config(alias), model_type=model_type, alias=alias, original_timesteps=original_timesteps)
|
||||
return ms_obj
|
||||
|
||||
@classmethod
|
||||
def to_model_sampling(cls, alias: str, model: ModelPatcher):
|
||||
return cls._to_model_sampling(alias=alias, model_type=model.model.model_type)
|
||||
|
||||
@staticmethod
|
||||
def get_alias_list_with_first_element(first_element: str):
|
||||
new_list = BetaSchedules.ALIAS_LIST.copy()
|
||||
@@ -77,16 +174,65 @@ class BetaSchedules:
|
||||
return new_list
|
||||
|
||||
|
||||
class BetaScheduleCache:
|
||||
def __init__(self, model: ModelPatcher):
|
||||
self.model_sampling = model.model.model_sampling
|
||||
class SigmaSchedule:
|
||||
def __init__(self, model_sampling: comfy.model_sampling.ModelSamplingDiscrete, model_type: ModelType):
|
||||
self.model_sampling = model_sampling
|
||||
#self.config = config
|
||||
self.model_type = model_type
|
||||
self.original_timesteps = getattr(self.model_sampling, "original_timesteps", None)
|
||||
|
||||
def is_lcm(self):
|
||||
return self.original_timesteps is not None
|
||||
|
||||
def use_cached_beta_schedule_and_clean(self, model: ModelPatcher):
|
||||
model.model.model_sampling = self.model_sampling
|
||||
self.clean()
|
||||
def total_sigmas(self):
|
||||
return len(self.model_sampling.sigmas)
|
||||
|
||||
def clone(self) -> 'SigmaSchedule':
|
||||
new_model_sampling = copy.deepcopy(self.model_sampling)
|
||||
#new_config = copy.deepcopy(self.config)
|
||||
return SigmaSchedule(model_sampling=new_model_sampling, model_type=self.model_type)
|
||||
|
||||
def clean(self):
|
||||
self.model_sampling = None
|
||||
# def clone(self):
|
||||
# pass
|
||||
|
||||
@staticmethod
|
||||
def apply_zsnr(new_model_sampling: comfy.model_sampling.ModelSamplingDiscrete):
|
||||
new_model_sampling.set_sigmas(comfy_extras.nodes_model_advanced.rescale_zero_terminal_snr_sigmas(new_model_sampling.sigmas))
|
||||
|
||||
# def get_lcmified(self, original_timesteps=50, zsnr=False) -> 'SigmaSchedule':
|
||||
# new_model_sampling = evolved_model_sampling(model_config=self.config, model_type=self.model_type, alias=None, original_timesteps=original_timesteps)
|
||||
# if zsnr:
|
||||
# new_model_sampling.set_sigmas(comfy_extras.nodes_model_advanced.rescale_zero_terminal_snr_sigmas(new_model_sampling.sigmas))
|
||||
# return SigmaSchedule(model_sampling=new_model_sampling, config=self.config, model_type=self.model_type, is_lcm=True)
|
||||
|
||||
|
||||
class InterpolationMethod:
|
||||
LINEAR = "linear"
|
||||
EASE_IN = "ease_in"
|
||||
EASE_OUT = "ease_out"
|
||||
EASE_IN_OUT = "ease_in_out"
|
||||
|
||||
_LIST = [LINEAR, EASE_IN, EASE_OUT, EASE_IN_OUT]
|
||||
|
||||
@classmethod
|
||||
def get_weights(cls, num_from: float, num_to: float, length: int, method: str, reverse=False):
|
||||
diff = num_to - num_from
|
||||
if method == cls.LINEAR:
|
||||
weights = torch.linspace(num_from, num_to, length)
|
||||
elif method == cls.EASE_IN:
|
||||
index = torch.linspace(0, 1, length)
|
||||
weights = diff * np.power(index, 2) + num_from
|
||||
elif method == cls.EASE_OUT:
|
||||
index = torch.linspace(0, 1, length)
|
||||
weights = diff * (1 - np.power(1 - index, 2)) + num_from
|
||||
elif method == cls.EASE_IN_OUT:
|
||||
index = torch.linspace(0, 1, length)
|
||||
weights = diff * ((1 - np.cos(index * np.pi)) / 2) + num_from
|
||||
else:
|
||||
raise ValueError(f"Unrecognized interpolation method '{method}'.")
|
||||
if reverse:
|
||||
weights = weights.flip(dims=(0,))
|
||||
return weights
|
||||
|
||||
|
||||
class Folders:
|
||||
@@ -167,8 +313,6 @@ def calculate_model_hash(model: ModelPatcher):
|
||||
m.update(buf.cpu().numpy().view(np.uint8))
|
||||
return m.hexdigest()
|
||||
|
||||
BIGMIN = -(2**63-1)
|
||||
BIGMAX = (2**63-1)
|
||||
|
||||
class ModelTypeSD:
|
||||
SD1_5 = "SD1.5"
|
||||
|
||||
@@ -285,6 +285,7 @@ app.registerExtension({
|
||||
words[v] = {
|
||||
text: v,
|
||||
info: () => new EmbeddingInfoDialog(emb).show("embeddings", emb),
|
||||
use_replacer: false,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -303,6 +304,7 @@ app.registerExtension({
|
||||
words[v] = {
|
||||
text: v,
|
||||
info: () => new LoraInfoDialog(lora).show("loras", lora),
|
||||
use_replacer: false,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -576,7 +576,8 @@ export class TextAreaAutoComplete {
|
||||
onclick: () => {
|
||||
this.el.focus();
|
||||
let value = wordInfo.value ?? wordInfo.text;
|
||||
if (TextAreaAutoComplete.replacer) {
|
||||
const use_replacer = wordInfo.use_replacer ?? true;
|
||||
if (TextAreaAutoComplete.replacer && use_replacer) {
|
||||
value = TextAreaAutoComplete.replacer(value);
|
||||
}
|
||||
this.helper.insertAtCursor(value + this.separator, -before.length, wordInfo.caretOffset);
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
import { app } from "../../../scripts/app.js";
|
||||
|
||||
// Adds mapping of touch events to mouse events for mobile. This isnt great but it is somewhat usable
|
||||
|
||||
app.registerExtension({
|
||||
name: "pysssss.TouchEvents",
|
||||
setup() {
|
||||
let touchStart = null;
|
||||
let touchType = 0;
|
||||
|
||||
function fireEvent(originalEvent, type) {
|
||||
const fakeEvent = document.createEvent("MouseEvent");
|
||||
const touch = originalEvent.changedTouches[0];
|
||||
fakeEvent.initMouseEvent(
|
||||
type,
|
||||
true,
|
||||
true,
|
||||
window,
|
||||
1,
|
||||
touch.screenX,
|
||||
touch.screenY,
|
||||
touch.clientX,
|
||||
touch.clientY,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
0,
|
||||
null
|
||||
);
|
||||
|
||||
touch.target.dispatchEvent(fakeEvent);
|
||||
if (fakeEvent.defaultPrevented) {
|
||||
originalEvent.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener(
|
||||
"touchstart",
|
||||
(e) => {
|
||||
// Support tap as click if it completes within a delay
|
||||
if (touchStart) {
|
||||
clearTimeout(touchStart);
|
||||
}
|
||||
touchStart = setTimeout(() => {
|
||||
touchStart = null;
|
||||
}, 100);
|
||||
|
||||
// Left or right button down
|
||||
touchType = e.touches.length === 1 ? 0 : 2;
|
||||
|
||||
fireEvent(e, "mousedown");
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
document.addEventListener("touchmove", (e) => fireEvent(e, "mousemove"), true);
|
||||
|
||||
document.addEventListener(
|
||||
"touchend",
|
||||
(e) => {
|
||||
const isClick = touchStart;
|
||||
if (isClick) {
|
||||
// We are within the touch start delay so fire this as a click
|
||||
clearTimeout(touchStart);
|
||||
fireEvent(e, "click");
|
||||
}
|
||||
fireEvent(e, "mouseup");
|
||||
touchType = 0;
|
||||
},
|
||||
true
|
||||
);
|
||||
},
|
||||
});
|
||||
@@ -25,8 +25,6 @@ s_param = '-s' if "python_embeded" in sys.executable else ''
|
||||
def get_cuda_home_path():
|
||||
if "CUDA_HOME" in os.environ:
|
||||
return os.environ["CUDA_HOME"]
|
||||
if platform.system() == "Windows":
|
||||
return str(Path(__file__).parent / "nvrtc_dlls") #https://github.com/cupy/cupy/issues/7776
|
||||
import torch
|
||||
torch_lib_path = Path(torch.__file__).parent / "lib"
|
||||
torch_lib_path = str(torch_lib_path.resolve())
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+3
-4
@@ -41,8 +41,7 @@ class AMT_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +56,7 @@ class AMT_VFI:
|
||||
clear_cache_after_n_frames: typing.SupportsInt = 1,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
model_path = load_file_from_direct_url(MODEL_TYPE, f"https://huggingface.co/lalala125/AMT/resolve/main/{ckpt_name}")
|
||||
ckpt_config = CKPT_CONFIGS[ckpt_name]
|
||||
@@ -81,7 +80,7 @@ class AMT_VFI:
|
||||
|
||||
args = [interpolation_model]
|
||||
out = generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
out = padder.unpad(out)
|
||||
out = postprocess_frames(out)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -20,8 +20,7 @@ class CAIN_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +35,7 @@ class CAIN_VFI:
|
||||
clear_cache_after_n_frames: typing.SupportsInt = 1,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .cain_arch import CAIN
|
||||
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
|
||||
@@ -60,6 +59,6 @@ class CAIN_VFI:
|
||||
args = [interpolation_model]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
+3
-4
@@ -50,8 +50,7 @@ class EISAI_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +65,7 @@ class EISAI_VFI:
|
||||
clear_cache_after_n_frames = 10,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
interpolation_model = EISAI(MODEL_FILE_NAMES)
|
||||
interpolation_model.eval().to(get_torch_device())
|
||||
@@ -80,6 +79,6 @@ class EISAI_VFI:
|
||||
args = [interpolation_model, scale]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -52,8 +52,7 @@ class FILM_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,14 +67,14 @@ class FILM_VFI:
|
||||
clear_cache_after_n_frames = 10,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
interpolation_states = optional_interpolation_states
|
||||
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
|
||||
model = torch.jit.load(model_path, map_location='cpu')
|
||||
model.eval()
|
||||
model = model.to(DEVICE)
|
||||
dtype = torch.float16 if cache_in_fp16 else torch.float32
|
||||
dtype = torch.float32
|
||||
|
||||
frames = preprocess_frames(frames)
|
||||
number_of_frames_processed_since_last_cleared_cuda_cache = 0
|
||||
|
||||
+3
-4
@@ -37,8 +37,7 @@ class FLAVR_VFI:
|
||||
"duplicate_first_last_frames": ("BOOLEAN", {"default": False})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +54,7 @@ class FLAVR_VFI:
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
duplicate_first_last_frames: bool = False,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
if multiplier != 2:
|
||||
warnings.warn("Currently, FLAVR only supports 2x interpolation. The process will continue but please set multiplier=2 afterward")
|
||||
@@ -105,7 +104,7 @@ class FLAVR_VFI:
|
||||
print("Done cache clearing")
|
||||
gc.collect()
|
||||
|
||||
dtype = torch.float16 if cache_in_fp16 else torch.float32
|
||||
dtype = torch.float32
|
||||
output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
|
||||
out = torch.cat(output_frames, dim=0)
|
||||
out = padder.unpad(out)
|
||||
|
||||
+3
-4
@@ -87,8 +87,7 @@ class GMFSS_Fortuna_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +102,7 @@ class GMFSS_Fortuna_VFI:
|
||||
clear_cache_after_n_frames = 10,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
"""
|
||||
Perform video frame interpolation using a given checkpoint model.
|
||||
@@ -139,6 +138,6 @@ class GMFSS_Fortuna_VFI:
|
||||
args = [interpolation_model, scale]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -20,8 +20,7 @@ class IFRNet_VFI:
|
||||
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}),
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +36,7 @@ class IFRNet_VFI:
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
scale_factor: typing.SupportsFloat = 1.0,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .IFRNet_S_arch import IRFNet_S
|
||||
from .IFRNet_L_arch import IRFNet_L
|
||||
@@ -53,6 +52,6 @@ class IFRNet_VFI:
|
||||
args = [interpolation_model, scale_factor]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -21,8 +21,7 @@ class IFUnet_VFI:
|
||||
"ensemble": ("BOOLEAN", {"default":True})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +38,7 @@ class IFUnet_VFI:
|
||||
scale_factor: typing.SupportsFloat = 1.0,
|
||||
ensemble: bool = True,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .IFUNet_arch import IFUNetModel
|
||||
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
|
||||
@@ -54,7 +53,7 @@ class IFUnet_VFI:
|
||||
args = [interpolation_model, scale_factor, ensemble]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
|
||||
+3
-4
@@ -22,8 +22,7 @@ class M2M_VFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +37,7 @@ class M2M_VFI:
|
||||
clear_cache_after_n_frames: typing.SupportsInt = 1,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .M2M_arch import M2M_PWC
|
||||
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
|
||||
@@ -56,6 +55,6 @@ class M2M_VFI:
|
||||
args = [interpolation_model]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
-2
@@ -217,8 +217,6 @@ def cuda_kernel(strFunction: str, strKernel: str, objVariables: typing.Dict, **r
|
||||
def get_cuda_home_path():
|
||||
if "CUDA_HOME" in os.environ:
|
||||
return os.environ["CUDA_HOME"]
|
||||
if platform.system() == "Windows":
|
||||
return str(Path(__file__).parent.parent.parent.parent / "nvrtc_dlls") #https://github.com/cupy/cupy/issues/7776
|
||||
import torch
|
||||
torch_lib_path = Path(torch.__file__).parent / "lib"
|
||||
torch_lib_path = str(torch_lib_path.resolve())
|
||||
|
||||
+6
-7
@@ -6,6 +6,7 @@ import typing
|
||||
from comfy.model_management import get_torch_device
|
||||
import re
|
||||
from functools import cmp_to_key
|
||||
from packaging import version
|
||||
|
||||
MODEL_TYPE = pathlib.Path(__file__).parent.name
|
||||
CKPT_NAME_VER_DICT = {
|
||||
@@ -19,14 +20,13 @@ CKPT_NAME_VER_DICT = {
|
||||
"rife47.pth": "4.7",
|
||||
"rife48.pth": "4.7",
|
||||
"rife49.pth": "4.7",
|
||||
"sudo_rife4_269.662_testV1_scale1.pth": "4.0"
|
||||
#Arch 4.10 doesn't work due to state dict mismatch
|
||||
#TODO: Investigating and fix it
|
||||
#"rife410.pth": "4.10",
|
||||
#"rife411.pth": "4.10",
|
||||
#"rife412.pth": "4.10"
|
||||
}
|
||||
ver_re = re.compile(r'\d+')
|
||||
ver_cmp_key = cmp_to_key(lambda a,b: int(ver_re.search(a)[0]) > int(ver_re.search(b)[0]))
|
||||
|
||||
class RIFE_VFI:
|
||||
@classmethod
|
||||
@@ -34,7 +34,7 @@ class RIFE_VFI:
|
||||
return {
|
||||
"required": {
|
||||
"ckpt_name": (
|
||||
sorted(list(CKPT_NAME_VER_DICT.keys()), key=ver_cmp_key),
|
||||
sorted(list(CKPT_NAME_VER_DICT.keys()), key=lambda ckpt_name: version.parse(CKPT_NAME_VER_DICT[ckpt_name])),
|
||||
{"default": "rife47.pth"}
|
||||
),
|
||||
"frames": ("IMAGE", ),
|
||||
@@ -45,8 +45,7 @@ class RIFE_VFI:
|
||||
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +63,7 @@ class RIFE_VFI:
|
||||
ensemble = False,
|
||||
scale_factor = 1.0,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
"""
|
||||
Perform video frame interpolation using a given checkpoint model.
|
||||
@@ -103,6 +102,6 @@ class RIFE_VFI:
|
||||
args = [interpolation_model, scale_list, fast_mode, ensemble]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -21,8 +21,7 @@ class SepconvVFI:
|
||||
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +36,7 @@ class SepconvVFI:
|
||||
clear_cache_after_n_frames = 10,
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .sepconv_enhanced import Network
|
||||
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
|
||||
@@ -52,6 +51,6 @@ class SepconvVFI:
|
||||
args = [interpolation_model]
|
||||
out = postprocess_frames(
|
||||
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
|
||||
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float16 if cache_in_fp16 else torch.float32)
|
||||
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
|
||||
)
|
||||
return (out,)
|
||||
|
||||
+3
-4
@@ -22,8 +22,7 @@ class STMFNet_VFI:
|
||||
"duplicate_first_last_frames": ("BOOLEAN", {"default": False})
|
||||
},
|
||||
"optional": {
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
|
||||
"cache_in_fp16": ("BOOLEAN", {"default": True})
|
||||
"optional_interpolation_states": ("INTERPOLATION_STATES", )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +39,7 @@ class STMFNet_VFI:
|
||||
multiplier: typing.SupportsInt = 2,
|
||||
duplicate_first_last_frames: bool = False,
|
||||
optional_interpolation_states: InterpolationStateList = None,
|
||||
cache_in_fp16: bool = True
|
||||
**kwargs
|
||||
):
|
||||
from .stmfnet_arch import STMFNet_Model
|
||||
if multiplier != 2:
|
||||
@@ -91,7 +90,7 @@ class STMFNet_VFI:
|
||||
print("Comfy-VFI: Done cache clearing")
|
||||
gc.collect()
|
||||
|
||||
dtype = torch.float16 if cache_in_fp16 else torch.float32
|
||||
dtype = torch.float32
|
||||
output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
|
||||
out = torch.cat(output_frames, dim=0)
|
||||
# clear cache for courtesy
|
||||
|
||||
@@ -144,15 +144,18 @@ def generic_frame_loop(
|
||||
return [*first_half, *second_half]
|
||||
|
||||
assert_batch_size(frames) # Too lazy to include model name lol
|
||||
output_frames = [] # List to store processed frames in the correct order
|
||||
output_frames = torch.zeros(multiplier*frames.shape[0], *frames.shape[1:], dtype=dtype, device="cpu")
|
||||
out_len = 0
|
||||
|
||||
number_of_frames_processed_since_last_cleared_cuda_cache = 0
|
||||
|
||||
for frame_itr in range(len(frames) - 1): # Skip the final frame since there are no frames after it
|
||||
#Ensure that input frames are in fp32 - the same dtype as model
|
||||
frame0 = frames[frame_itr:frame_itr+1].float()
|
||||
frame1 = frames[frame_itr+1:frame_itr+2].float()
|
||||
output_frames.append(frame0.to(dtype=dtype)) # Start with first frame
|
||||
frame0 = frames[frame_itr:frame_itr+1]
|
||||
output_frames[out_len] = frame0 # Start with first frame
|
||||
out_len += 1
|
||||
# Ensure that input frames are in fp32 - the same dtype as model
|
||||
frame0 = frame0.to(dtype=torch.float32)
|
||||
frame1 = frames[frame_itr+1:frame_itr+2].to(dtype=torch.float32)
|
||||
|
||||
if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr):
|
||||
continue
|
||||
@@ -175,8 +178,10 @@ def generic_frame_loop(
|
||||
middle_frames = non_timestep_inference(frame0.to(DEVICE), frame1.to(DEVICE), multiplier - 1)
|
||||
middle_frame_batches.extend(torch.cat(middle_frames, dim=0).detach().cpu().to(dtype=dtype))
|
||||
|
||||
# Extend output array by batch
|
||||
output_frames.extend(middle_frame_batches)
|
||||
# Copy middle frames to output
|
||||
for middle_frame in middle_frame_batches:
|
||||
output_frames[out_len] = middle_frame
|
||||
out_len += 1
|
||||
|
||||
number_of_frames_processed_since_last_cleared_cuda_cache += 1
|
||||
# Try to avoid a memory overflow by clearing cuda cache regularly
|
||||
@@ -189,14 +194,14 @@ def generic_frame_loop(
|
||||
gc.collect()
|
||||
|
||||
print(f"Comfy-VFI done! {len(output_frames)} frames generated at resolution: {output_frames[0].shape}")
|
||||
output_frames.append(frames[-1:].to(dtype=dtype)) # Append final frame
|
||||
output_frames = [frame.cpu() for frame in output_frames] #Ensure all frames are in cpu
|
||||
out = torch.cat(output_frames, dim=0)
|
||||
# Append final frame
|
||||
output_frames[out_len] = frames[-1:]
|
||||
out_len += 1
|
||||
# clear cache for courtesy
|
||||
print("Comfy-VFI: Final clearing cache...", end = ' ')
|
||||
soft_empty_cache()
|
||||
print("Done cache clearing")
|
||||
return out
|
||||
return output_frames[:out_len]
|
||||
|
||||
""" def generic_4frame_loop(
|
||||
frames,
|
||||
|
||||
@@ -7,6 +7,8 @@ This custom node helps to conveniently enhance images through Detector, Detailer
|
||||
|
||||
|
||||
## NOTICE
|
||||
* V4.77: Compatibility patch applied. Requires ComfyUI version (Oct. 8th) or later.
|
||||
* V4.73.3: ControlNetApply (SEGS) supports AnimateDiff
|
||||
* V4.20.1: Due to the feature update in `RegionalSampler`, the parameter order has changed, causing malfunctions in previously created `RegionalSamplers`. Please adjust the parameters accordingly.
|
||||
* V4.12: `MASKS` is changed to `MASK`.
|
||||
* V4.7.2 isn't compatible with old version of `ControlNet Auxiliary Preprocessor`. If you will use `MediaPipe FaceMesh to SEGS` update to latest version(Sep. 17th).
|
||||
@@ -41,8 +43,9 @@ This custom node helps to conveniently enhance images through Detector, Detailer
|
||||
|
||||
* ControlNet
|
||||
* ControlNetApply (SEGS) - To apply ControlNet in SEGS, you need to use the Preprocessor Provider node from the Inspire Pack to utilize this node.
|
||||
* `SEGSPreprocessor` and `Image` can be selectively applied. If an `Image` is given, `SEGSPreprocessor` will be ignored.
|
||||
* If set to `Image`, you can preview the cropped cnet image through `SEGSPreview (CNET Image)`. Images generated by `SEGSPreprocessor` should be verified through the `cnet_pil` output of each Detailer.
|
||||
* `segs_preprocessor` and `control_image` can be selectively applied. If an `control_image` is given, `segs_preprocessor` will be ignored.
|
||||
* If set to `control_image`, you can preview the cropped cnet image through `SEGSPreview (CNET Image)`. Images generated by `segs_preprocessor` should be verified through the `cnet_images` output of each Detailer.
|
||||
* The `segs_preprocessor` operates by applying preprocessing on-the-fly based on the cropped image during the detailing process, while `control_image` will be cropped and used as input to `ControlNetApply (SEGS)`.
|
||||
* ControlNetClear (SEGS) - Clear applied ControlNet in SEGS
|
||||
|
||||
* Bitwise(SEGS & SEGS) - Performs a 'bitwise and' operation between two SEGS.
|
||||
@@ -89,6 +92,7 @@ This custom node helps to conveniently enhance images through Detector, Detailer
|
||||
* SEGS Filter (label) - This node filters SEGS based on the label of the detected areas.
|
||||
* SEGS Filter (ordered) - This node sorts SEGS based on size and position and retrieves SEGs within a certain range.
|
||||
* SEGS Filter (range) - This node retrieves only SEGs from SEGS that have a size and position within a certain range.
|
||||
* SEGS Assign (label) - Assign labels sequentially to SEGS. This node is useful when used with `[LAB]` of FaceDetailer.
|
||||
* SEGSConcat - Concatenate segs1 and segs2. If source shape of segs1 and segs2 are different from segs2 will be ignored.
|
||||
* Picker (SEGS) - Among the input SEGS, you can select a specific SEG through a dialog. If no SEG is selected, it outputs an empty SEGS. Increasing the batch_size of SEGSDetailer can be used for the purpose of selecting from the candidates.
|
||||
* Set Default Image For SEGS - Set a default image for SEGS. SEGS with images set this way do not need to have a fallback image set. When override is set to false, the original image is preserved.
|
||||
@@ -122,8 +126,9 @@ This custom node helps to conveniently enhance images through Detector, Detailer
|
||||
* You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension.
|
||||
|
||||
* PK_HOOK
|
||||
* DenoiseScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the denoise to target_denoise as the step progresses.
|
||||
* CfgScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the cfg to target_cfg as the step progresses.
|
||||
* DenoiseScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the denoise to target_denoise as the iterative-step progresses.
|
||||
* CfgScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the cfg to target_cfg as the iterative-step progresses.
|
||||
* StepsScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the sampling-steps to target_steps as the iterative-step progresses.
|
||||
* NoiseInjectionHookProvider - During each iteration of IterativeUpscale, noise is injected into the latent space while varying the strength according to a schedule.
|
||||
* You need to install the [BlenderNeko/ComfyUI_Noise](https://github.com/BlenderNeko/ComfyUI_Noise) node extension.
|
||||
* The seed serves as the initial value required for generating noise, and it increments by 1 with each iteration as the process unfolds.
|
||||
@@ -155,7 +160,8 @@ This takes latent as input and outputs latent as the result.
|
||||
* You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension.
|
||||
|
||||
* TwoAdvancedSamplersForMask - TwoSamplersForMask is similar to TwoAdvancedSamplersForMask, but they differ in their operation. TwoSamplersForMask performs sampling in the mask area only after all the samples in the base area are finished. On the other hand, TwoAdvancedSamplersForMask performs sampling in both the base area and the mask area sequentially at each step.
|
||||
* KSamplerAdvancedProvider - This is a wrapper that enables KSampler to be used in TwoAdvancedSamplersForMask.
|
||||
* KSamplerAdvancedProvider - This is a wrapper that enables KSampler to be used in TwoAdvancedSamplersForMask, RegionalSampler.
|
||||
* sigma_factor: By multiplying the denoise schedule by the sigma_factor, you can adjust the amount of denoising based on the configured denoise.
|
||||
|
||||
* TwoSamplersForMaskUpscalerProvider - This is an Upscaler that extends TwoSamplersForMask to be used in Iterative Upscale.
|
||||
* TwoSamplersForMaskUpscalerProviderPipe - pipe version of TwoSamplersForMaskUpscalerProvider.
|
||||
|
||||
@@ -176,6 +176,7 @@ NODE_CLASS_MAPPINGS = {
|
||||
|
||||
"PixelKSampleHookCombine": PixelKSampleHookCombine,
|
||||
"DenoiseScheduleHookProvider": DenoiseScheduleHookProvider,
|
||||
"StepsScheduleHookProvider": StepsScheduleHookProvider,
|
||||
"CfgScheduleHookProvider": CfgScheduleHookProvider,
|
||||
"NoiseInjectionHookProvider": NoiseInjectionHookProvider,
|
||||
"UnsamplerHookProvider": UnsamplerHookProvider,
|
||||
@@ -285,6 +286,7 @@ NODE_CLASS_MAPPINGS = {
|
||||
"ImpactCombineConditionings": CombineConditionings,
|
||||
"ImpactConcatConditionings": ConcatConditionings,
|
||||
|
||||
"ImpactSEGSLabelAssign": SEGSLabelAssign,
|
||||
"ImpactSEGSLabelFilter": SEGSLabelFilter,
|
||||
"ImpactSEGSRangeFilter": SEGSRangeFilter,
|
||||
"ImpactSEGSOrderedFilter": SEGSOrderedFilter,
|
||||
@@ -384,6 +386,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
|
||||
"ImpactKSamplerBasicPipe": "KSampler (pipe)",
|
||||
"ImpactKSamplerAdvancedBasicPipe": "KSampler (Advanced/pipe)",
|
||||
"ImpactSEGSLabelAssign": "SEGS Assign (label)",
|
||||
"ImpactSEGSLabelFilter": "SEGS Filter (label)",
|
||||
"ImpactSEGSRangeFilter": "SEGS Filter (range)",
|
||||
"ImpactSEGSOrderedFilter": "SEGS Filter (ordered)",
|
||||
|
||||
+2
-2
@@ -65,7 +65,7 @@ class SEGSDetailerForAnimateDiff:
|
||||
else:
|
||||
cropped_image_frames = torch.concat((cropped_image_frames, cropped_image), dim=0)
|
||||
|
||||
cropped_image_frames = cropped_image_frames.numpy()
|
||||
cropped_image_frames = cropped_image_frames.cpu().numpy()
|
||||
enhanced_image_tensor, cnet_images = core.enhance_detail_for_animatediff(cropped_image_frames, model, clip, vae, guide_size, guide_size_for, max_size,
|
||||
seg.bbox, seed, steps, cfg, sampler_name, scheduler,
|
||||
positive, negative, denoise, seg.cropped_mask,
|
||||
@@ -79,7 +79,7 @@ class SEGSDetailerForAnimateDiff:
|
||||
if enhanced_image_tensor is None:
|
||||
new_cropped_image = cropped_image_frames
|
||||
else:
|
||||
new_cropped_image = enhanced_image_tensor.numpy()
|
||||
new_cropped_image = enhanced_image_tensor.cpu().numpy()
|
||||
|
||||
new_seg = SEG(new_cropped_image, seg.cropped_mask, seg.confidence, seg.crop_region, seg.bbox, seg.label, None)
|
||||
new_segs.append(new_seg)
|
||||
|
||||
@@ -2,7 +2,7 @@ import configparser
|
||||
import os
|
||||
|
||||
|
||||
version_code = [4, 73, 3]
|
||||
version_code = [4, 78]
|
||||
version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||
|
||||
dependency_version = 20
|
||||
|
||||
@@ -370,7 +370,7 @@ def enhance_detail_for_animatediff(image_frames, model, clip, vae, guide_size, g
|
||||
|
||||
cnet_images = None
|
||||
if control_net_wrapper is not None:
|
||||
positive, negative, cnet_images = control_net_wrapper.apply(positive, negative, torch.from_numpy(image_frames), noise_mask)
|
||||
positive, negative, cnet_images = control_net_wrapper.apply(positive, negative, torch.from_numpy(image_frames), noise_mask, use_acn=True)
|
||||
|
||||
if len(upscaled_mask) != len(image_frames) and len(upscaled_mask) > 1:
|
||||
print(f"[Impact Pack] WARN: DetailerForAnimateDiff - The number of the mask frames({len(upscaled_mask)}) and the image frames({len(image_frames)}) are different. Combine the mask frames and apply.")
|
||||
@@ -1505,26 +1505,36 @@ class ControlNetWrapper:
|
||||
else:
|
||||
self.control_image = None
|
||||
|
||||
def apply(self, positive, negative, image, mask=None):
|
||||
cnet_tensors = []
|
||||
prev_cnet_tensors = []
|
||||
def apply(self, positive, negative, image, mask=None, use_acn=False):
|
||||
cnet_image_list = []
|
||||
prev_cnet_images = []
|
||||
|
||||
if self.prev_control_net is not None:
|
||||
positive, negative, prev_cnet_tensors = self.prev_control_net.apply(positive, negative, image, mask)
|
||||
positive, negative, prev_cnet_images = self.prev_control_net.apply(positive, negative, image, mask, use_acn=use_acn)
|
||||
|
||||
if self.control_image is not None:
|
||||
cnet_tensor = self.control_image
|
||||
cnet_image = self.control_image
|
||||
elif self.preprocessor is not None:
|
||||
cnet_tensor = self.preprocessor.apply(image, mask)
|
||||
cnet_image = self.preprocessor.apply(image, mask)
|
||||
else:
|
||||
cnet_tensor = image
|
||||
cnet_image = image
|
||||
|
||||
cnet_tensors.extend(prev_cnet_tensors)
|
||||
cnet_tensors.append(cnet_tensor)
|
||||
cnet_image_list.extend(prev_cnet_images)
|
||||
cnet_image_list.append(cnet_image)
|
||||
|
||||
positive = nodes.ControlNetApply().apply_controlnet(positive, self.control_net, cnet_tensor, self.strength)[0]
|
||||
if use_acn:
|
||||
if "ACN_AdvancedControlNetApply" in nodes.NODE_CLASS_MAPPINGS:
|
||||
acn = nodes.NODE_CLASS_MAPPINGS['ACN_AdvancedControlNetApply']()
|
||||
positive, negative, _ = acn.apply_controlnet(positive=positive, negative=negative, control_net=self.control_net, image=cnet_image,
|
||||
strength=self.strength, start_percent=0.0, end_percent=1.0)
|
||||
else:
|
||||
utils.try_install_custom_node('https://github.com/BlenderNeko/ComfyUI_TiledKSampler',
|
||||
"To use 'ControlNetWrapper' for AnimateDiff, 'ComfyUI-Advanced-ControlNet' extension is required.")
|
||||
raise Exception("'ACN_AdvancedControlNetApply' node isn't installed.")
|
||||
else:
|
||||
positive = nodes.ControlNetApply().apply_controlnet(positive, self.control_net, cnet_image, self.strength)[0]
|
||||
|
||||
return positive, negative, cnet_tensors
|
||||
return positive, negative, cnet_image_list
|
||||
|
||||
|
||||
class ControlNetAdvancedWrapper:
|
||||
@@ -1543,26 +1553,36 @@ class ControlNetAdvancedWrapper:
|
||||
else:
|
||||
self.control_image = None
|
||||
|
||||
def apply(self, positive, negative, image, mask=None):
|
||||
cnet_tensors = []
|
||||
prev_cnet_tensors = []
|
||||
def apply(self, positive, negative, image, mask=None, use_acn=False):
|
||||
cnet_image_list = []
|
||||
prev_cnet_images = []
|
||||
|
||||
if self.prev_control_net is not None:
|
||||
positive, negative, prev_cnet_tensors = self.prev_control_net.apply(positive, negative, image, mask)
|
||||
positive, negative, prev_cnet_images = self.prev_control_net.apply(positive, negative, image, mask)
|
||||
|
||||
if self.control_image is not None:
|
||||
cnet_tensor = self.control_image
|
||||
cnet_image = self.control_image
|
||||
elif self.preprocessor is not None:
|
||||
cnet_tensor = self.preprocessor.apply(image, mask)
|
||||
cnet_image = self.preprocessor.apply(image, mask)
|
||||
else:
|
||||
cnet_tensor = image
|
||||
cnet_image = image
|
||||
|
||||
cnet_tensors.extend(prev_cnet_tensors)
|
||||
cnet_tensors.append(cnet_tensor)
|
||||
cnet_image_list.extend(prev_cnet_images)
|
||||
cnet_image_list.append(cnet_image)
|
||||
|
||||
conditioning = nodes.ControlNetApplyAdvanced().apply_controlnet(positive, negative, self.control_net, cnet_tensor, self.strength, self.start_percent, self.end_percent)
|
||||
if use_acn:
|
||||
if "ACN_AdvancedControlNetApply" in nodes.NODE_CLASS_MAPPINGS:
|
||||
acn = nodes.NODE_CLASS_MAPPINGS['ACN_AdvancedControlNetApply']()
|
||||
positive, negative, _ = acn.apply_controlnet(positive=positive, negative=negative, control_net=self.control_net, image=cnet_image,
|
||||
strength=self.strength, start_percent=self.start_percent, end_percent=self.end_percent)
|
||||
else:
|
||||
utils.try_install_custom_node('https://github.com/BlenderNeko/ComfyUI_TiledKSampler',
|
||||
"To use 'ControlNetAdvancedWrapper' for AnimateDiff, 'ComfyUI-Advanced-ControlNet' extension is required.")
|
||||
raise Exception("'ACN_AdvancedControlNetApply' node isn't installed.")
|
||||
else:
|
||||
positive, negative = nodes.ControlNetApplyAdvanced().apply_controlnet(positive, negative, self.control_net, cnet_image, self.strength, self.start_percent, self.end_percent)
|
||||
|
||||
return conditioning[0], conditioning[1], cnet_tensors
|
||||
return positive, negative, cnet_image_list
|
||||
|
||||
|
||||
# REQUIREMENTS: BlenderNeko/ComfyUI_TiledKSampler
|
||||
|
||||
@@ -109,11 +109,14 @@ class SimpleCfgScheduleHook(PixelKSampleHook):
|
||||
super().__init__()
|
||||
self.target_cfg = target_cfg
|
||||
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent,
|
||||
denoise):
|
||||
progress = self.cur_step / self.total_step
|
||||
gap = self.target_cfg - cfg
|
||||
current_cfg = cfg + gap * progress
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
|
||||
if self.total_step > 1:
|
||||
progress = self.cur_step / (self.total_step - 1)
|
||||
gap = self.target_cfg - cfg
|
||||
current_cfg = int(cfg + gap * progress)
|
||||
else:
|
||||
current_cfg = self.target_cfg
|
||||
|
||||
return model, seed, steps, current_cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise
|
||||
|
||||
|
||||
@@ -122,14 +125,33 @@ class SimpleDenoiseScheduleHook(PixelKSampleHook):
|
||||
super().__init__()
|
||||
self.target_denoise = target_denoise
|
||||
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent,
|
||||
denoise):
|
||||
progress = self.cur_step / self.total_step
|
||||
gap = self.target_denoise - denoise
|
||||
current_denoise = denoise + gap * progress
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
|
||||
if self.total_step > 1:
|
||||
progress = self.cur_step / (self.total_step - 1)
|
||||
gap = self.target_denoise - denoise
|
||||
current_denoise = denoise + gap * progress
|
||||
else:
|
||||
current_denoise = self.target_denoise
|
||||
|
||||
return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, current_denoise
|
||||
|
||||
|
||||
class SimpleStepsScheduleHook(PixelKSampleHook):
|
||||
def __init__(self, target_steps):
|
||||
super().__init__()
|
||||
self.target_steps = target_steps
|
||||
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
|
||||
if self.total_step > 1:
|
||||
progress = self.cur_step / (self.total_step - 1)
|
||||
gap = self.target_steps - steps
|
||||
current_steps = int(steps + gap * progress)
|
||||
else:
|
||||
current_steps = self.target_steps
|
||||
|
||||
return model, seed, current_steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise
|
||||
|
||||
|
||||
class DetailerHook(PixelKSampleHook):
|
||||
def cycle_latent(self, latent):
|
||||
return latent
|
||||
@@ -147,9 +169,14 @@ class SimpleDetailerDenoiseSchedulerHook(DetailerHook):
|
||||
self.target_denoise = target_denoise
|
||||
|
||||
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise):
|
||||
progress = self.cur_step / self.total_step
|
||||
gap = self.target_denoise - denoise
|
||||
current_denoise = denoise + gap * progress
|
||||
if self.total_step > 1:
|
||||
progress = self.cur_step / (self.total_step - 1)
|
||||
gap = self.target_denoise - denoise
|
||||
current_denoise = denoise + gap * progress
|
||||
else:
|
||||
# ignore hook if total cycle <= 1
|
||||
current_denoise = denoise
|
||||
|
||||
return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, current_denoise
|
||||
|
||||
|
||||
|
||||
+32
-6
@@ -237,8 +237,10 @@ class DetailerForEach:
|
||||
else:
|
||||
cropped_mask = None
|
||||
|
||||
if wildcard_chooser is not None:
|
||||
if wildcard_chooser is not None and wmode != "LAB":
|
||||
seg_seed, wildcard_item = wildcard_chooser.get(seg)
|
||||
elif wildcard_chooser is not None and wmode == "LAB":
|
||||
seg_seed, wildcard_item = None, wildcard_chooser.get(seg)
|
||||
else:
|
||||
seg_seed, wildcard_item = None, None
|
||||
|
||||
@@ -272,7 +274,7 @@ class DetailerForEach:
|
||||
# Convert enhanced_pil_alpha to RGBA mode
|
||||
enhanced_image_alpha = tensor_convert_rgba(enhanced_image)
|
||||
new_seg_image = enhanced_image.numpy() # alpha should not be applied to seg_image
|
||||
|
||||
|
||||
# Apply the mask
|
||||
mask = tensor_resize(mask, *tensor_get_size(enhanced_image))
|
||||
tensor_putalpha(enhanced_image_alpha, mask)
|
||||
@@ -780,6 +782,30 @@ class DenoiseScheduleHookProvider:
|
||||
return (hook, )
|
||||
|
||||
|
||||
class StepsScheduleHookProvider:
|
||||
schedules = ["simple"]
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"schedule_for_iteration": (s.schedules,),
|
||||
"target_steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
|
||||
},
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("PK_HOOK",)
|
||||
FUNCTION = "doit"
|
||||
|
||||
CATEGORY = "ImpactPack/Upscale"
|
||||
|
||||
def doit(self, schedule_for_iteration, target_steps):
|
||||
hook = None
|
||||
if schedule_for_iteration == "simple":
|
||||
hook = hooks.SimpleStepsScheduleHook(target_steps)
|
||||
|
||||
return (hook, )
|
||||
|
||||
|
||||
class DetailerHookCombine:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
@@ -1104,7 +1130,7 @@ class IterativeLatentUpscale:
|
||||
new_h = h*upscale_factor
|
||||
core.update_node_status(unique_id, f"Final step | x{upscale_factor:.2f}", 1.0)
|
||||
print(f"IterativeLatentUpscale[Final]: {new_w:.1f}x{new_h:.1f} (scale:{upscale_factor:.2f}) ")
|
||||
step_info = steps, steps
|
||||
step_info = steps-1, steps
|
||||
current_latent = upscaler.upscale_shape(step_info, current_latent, new_w, new_h, temp_prefix)
|
||||
|
||||
core.update_node_status(unique_id, "", None)
|
||||
@@ -1451,7 +1477,7 @@ class SegsBitwiseAndMask:
|
||||
|
||||
def doit(self, segs, mask):
|
||||
return (core.segs_bitwise_and_mask(segs, mask), )
|
||||
|
||||
|
||||
|
||||
class SegsBitwiseAndMaskForEach:
|
||||
@classmethod
|
||||
@@ -1626,7 +1652,7 @@ class SubtractMask:
|
||||
"mask2": ("MASK", ),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RETURN_TYPES = ("MASK",)
|
||||
FUNCTION = "doit"
|
||||
|
||||
@@ -1757,7 +1783,7 @@ class ImageReceiver:
|
||||
return hash(image_data)
|
||||
else:
|
||||
return hash(image)
|
||||
|
||||
|
||||
|
||||
from server import PromptServer
|
||||
|
||||
|
||||
+13
-12
@@ -119,18 +119,18 @@ def separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler
|
||||
|
||||
|
||||
def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise,
|
||||
refiner_ratio=None, refiner_model=None, refiner_clip=None, refiner_positive=None, refiner_negative=None):
|
||||
refiner_ratio=None, refiner_model=None, refiner_clip=None, refiner_positive=None, refiner_negative=None, sigma_factor=1.0):
|
||||
|
||||
if refiner_ratio is None or refiner_model is None or refiner_clip is None or refiner_positive is None or refiner_negative is None:
|
||||
refined_latent = nodes.KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise)[0]
|
||||
refined_latent = nodes.KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise * sigma_factor)[0]
|
||||
else:
|
||||
advanced_steps = math.floor(steps / denoise)
|
||||
start_at_step = advanced_steps - steps
|
||||
end_at_step = start_at_step + math.floor(steps * (1.0 - refiner_ratio))
|
||||
|
||||
print(f"pre: {start_at_step} .. {end_at_step} / {advanced_steps}")
|
||||
# print(f"pre: {start_at_step} .. {end_at_step} / {advanced_steps}")
|
||||
temp_latent = separated_sample(model, True, seed, advanced_steps, cfg, sampler_name, scheduler,
|
||||
positive, negative, latent_image, start_at_step, end_at_step, True)
|
||||
positive, negative, latent_image, start_at_step, end_at_step, True, sigma_ratio=sigma_factor)
|
||||
|
||||
if 'noise_mask' in latent_image:
|
||||
# noise_latent = \
|
||||
@@ -141,9 +141,9 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
|
||||
latent_compositor = nodes.NODE_CLASS_MAPPINGS['LatentCompositeMasked']()
|
||||
temp_latent = latent_compositor.composite(latent_image, temp_latent, 0, 0, False, latent_image['noise_mask'])[0]
|
||||
|
||||
print(f"post: {end_at_step} .. {advanced_steps + 1} / {advanced_steps}")
|
||||
# print(f"post: {end_at_step} .. {advanced_steps + 1} / {advanced_steps}")
|
||||
refined_latent = separated_sample(refiner_model, False, seed, advanced_steps, cfg, sampler_name, scheduler,
|
||||
refiner_positive, refiner_negative, temp_latent, end_at_step, advanced_steps + 1, False)
|
||||
refiner_positive, refiner_negative, temp_latent, end_at_step, advanced_steps + 1, False, sigma_ratio=sigma_factor)
|
||||
|
||||
return refined_latent
|
||||
|
||||
@@ -151,18 +151,19 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
|
||||
class KSamplerAdvancedWrapper:
|
||||
params = None
|
||||
|
||||
def __init__(self, model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=None):
|
||||
self.params = model, cfg, sampler_name, scheduler, positive, negative
|
||||
def __init__(self, model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=None, sigma_factor=1.0):
|
||||
self.params = model, cfg, sampler_name, scheduler, positive, negative, sigma_factor
|
||||
self.sampler_opt = sampler_opt
|
||||
|
||||
def clone_with_conditionings(self, positive, negative):
|
||||
model, cfg, sampler_name, scheduler, _, _ = self.params
|
||||
model, cfg, sampler_name, scheduler, _, _, _ = self.params
|
||||
return KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, self.sampler_opt)
|
||||
|
||||
def sample_advanced(self, add_noise, seed, steps, latent_image, start_at_step, end_at_step, return_with_leftover_noise, hook=None,
|
||||
recovery_mode="ratio additional", recovery_sampler="AUTO", recovery_sigma_ratio=1.0):
|
||||
|
||||
model, cfg, sampler_name, scheduler, positive, negative = self.params
|
||||
model, cfg, sampler_name, scheduler, positive, negative, sigma_factor = self.params
|
||||
# steps, start_at_step, end_at_step = self.compensate_denoise(steps, start_at_step, end_at_step)
|
||||
|
||||
if hook is not None:
|
||||
model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent = hook.pre_ksample_advanced(model, add_noise, seed, steps, cfg, sampler_name, scheduler,
|
||||
@@ -183,7 +184,7 @@ class KSamplerAdvancedWrapper:
|
||||
if sigma_ratio > 0:
|
||||
latent_image = separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler,
|
||||
positive, negative, latent_image, start_at_step, end_at_step,
|
||||
return_with_leftover_noise, sigma_ratio=sigma_ratio, sampler_opt=self.sampler_opt)
|
||||
return_with_leftover_noise, sigma_ratio=sigma_ratio * sigma_factor, sampler_opt=self.sampler_opt)
|
||||
except ValueError as e:
|
||||
if str(e) == 'sigma_min and sigma_max must not be 0':
|
||||
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
|
||||
@@ -207,7 +208,7 @@ class KSamplerAdvancedWrapper:
|
||||
try:
|
||||
latent_image = separated_sample(model, add_noise, seed, steps, cfg, recovery_sampler, scheduler,
|
||||
positive, negative, latent_image, start_at_step-compensate, end_at_step,
|
||||
return_with_leftover_noise, sigma_ratio=recovery_sigma_ratio, sampler_opt=self.sampler_opt)
|
||||
return_with_leftover_noise, sigma_ratio=recovery_sigma_ratio * sigma_factor, sampler_opt=self.sampler_opt)
|
||||
except ValueError as e:
|
||||
if str(e) == 'sigma_min and sigma_max must not be 0':
|
||||
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import folder_paths
|
||||
from impact.core import *
|
||||
import os
|
||||
|
||||
import mmcv
|
||||
from mmdet.apis import (inference_detector, init_detector)
|
||||
|
||||
@@ -415,6 +415,44 @@ class SEGSLabelFilter:
|
||||
return SEGSLabelFilter.filter(segs, labels)
|
||||
|
||||
|
||||
class SEGSLabelAssign:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"segs": ("SEGS", ),
|
||||
"labels": ("STRING", {"multiline": True, "placeholder": "List the label to be assigned in order of segs, separated by commas"}),
|
||||
},
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("SEGS",)
|
||||
RETURN_NAMES = ("SEGS",)
|
||||
FUNCTION = "doit"
|
||||
|
||||
CATEGORY = "ImpactPack/Util"
|
||||
|
||||
@staticmethod
|
||||
def assign(segs, labels):
|
||||
labels = [label.strip() for label in labels]
|
||||
|
||||
if len(labels) != len(segs[1]):
|
||||
print(f'Warning (SEGSLabelAssign): length of labels ({len(labels)}) != length of segs ({len(segs[1])})')
|
||||
|
||||
labeled_segs = []
|
||||
|
||||
idx = 0
|
||||
for x in segs[1]:
|
||||
if len(labels) > idx:
|
||||
x = x._replace(label=labels[idx])
|
||||
labeled_segs.append(x)
|
||||
idx += 1
|
||||
|
||||
return ((segs[0], labeled_segs), )
|
||||
|
||||
def doit(self, segs, labels):
|
||||
labels = labels.split(',')
|
||||
return SEGSLabelAssign.assign(segs, labels)
|
||||
|
||||
|
||||
class SEGSOrderedFilter:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
|
||||
+4
-3
@@ -67,6 +67,7 @@ class KSamplerAdvancedProvider:
|
||||
"cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}),
|
||||
"sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
|
||||
"scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
|
||||
"sigma_factor": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}),
|
||||
"basic_pipe": ("BASIC_PIPE", )
|
||||
},
|
||||
"optional": {
|
||||
@@ -79,9 +80,9 @@ class KSamplerAdvancedProvider:
|
||||
|
||||
CATEGORY = "ImpactPack/Sampler"
|
||||
|
||||
def doit(self, cfg, sampler_name, scheduler, basic_pipe, sampler_opt=None):
|
||||
def doit(self, cfg, sampler_name, scheduler, basic_pipe, sigma_factor=1.0, sampler_opt=None):
|
||||
model, _, _, positive, negative = basic_pipe
|
||||
sampler = KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=sampler_opt)
|
||||
sampler = KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=sampler_opt, sigma_factor=sigma_factor)
|
||||
return (sampler, )
|
||||
|
||||
|
||||
@@ -251,7 +252,7 @@ class ConcatConditionings:
|
||||
RETURN_TYPES = ("CONDITIONING", )
|
||||
FUNCTION = "doit"
|
||||
|
||||
CATEGORY = "ImpactPack/__for_testing"
|
||||
CATEGORY = "ImpactPack/Util"
|
||||
|
||||
def doit(self, **kwargs):
|
||||
conditioning_to = list(kwargs.values())[0]
|
||||
|
||||
@@ -495,9 +495,16 @@ def to_latent_image(pixels, vae):
|
||||
y = pixels.shape[2]
|
||||
if pixels.shape[1] != x or pixels.shape[2] != y:
|
||||
pixels = pixels[:, :x, :y, :]
|
||||
pixels = nodes.VAEEncode.vae_encode_crop_pixels(pixels)
|
||||
t = vae.encode(pixels[:, :, :, :3])
|
||||
return {"samples": t}
|
||||
|
||||
vae_encode = nodes.VAEEncode()
|
||||
if hasattr(nodes.VAEEncode, "vae_encode_crop_pixels"):
|
||||
# backward compatibility
|
||||
print(f"[Impact Pack] ComfyUI is outdated.")
|
||||
pixels = nodes.VAEEncode.vae_encode_crop_pixels(pixels)
|
||||
t = vae.encode(pixels[:, :, :, :3])
|
||||
return {"samples": t}
|
||||
|
||||
return vae_encode.encode(vae, pixels)[0]
|
||||
|
||||
|
||||
def empty_pil_tensor(w=64, h=64):
|
||||
|
||||
@@ -393,6 +393,47 @@ class CreateFadeMaskAdvanced:
|
||||
if invert:
|
||||
return (1.0 - torch.cat(out, dim=0),)
|
||||
return (torch.cat(out, dim=0),)
|
||||
|
||||
class ScaleBatchPromptSchedule:
|
||||
|
||||
RETURN_TYPES = ("STRING",)
|
||||
FUNCTION = "scaleschedule"
|
||||
CATEGORY = "KJNodes"
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"input_str": ("STRING", {"forceInput": True,"default": "0:(0.0),\n7:(1.0),\n15:(0.0)\n"}),
|
||||
"old_frame_count": ("INT", {"forceInput": True,"default": 1,"min": 1, "max": 4096, "step": 1}),
|
||||
"new_frame_count": ("INT", {"forceInput": True,"default": 1,"min": 1, "max": 4096, "step": 1}),
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
def scaleschedule(self, old_frame_count, input_str, new_frame_count):
|
||||
print("input_str:", input_str)
|
||||
pattern = r'"(\d+)"\s*:\s*"(.*?)"(?:,|\Z)'
|
||||
frame_strings = dict(re.findall(pattern, input_str))
|
||||
|
||||
# Calculate the scaling factor
|
||||
scaling_factor = (new_frame_count - 1) / (old_frame_count - 1)
|
||||
|
||||
# Initialize a dictionary to store the new frame numbers and strings
|
||||
new_frame_strings = {}
|
||||
|
||||
# Iterate over the frame numbers and strings
|
||||
for old_frame, string in frame_strings.items():
|
||||
# Calculate the new frame number
|
||||
new_frame = int(round(int(old_frame) * scaling_factor))
|
||||
|
||||
# Store the new frame number and corresponding string
|
||||
new_frame_strings[new_frame] = string
|
||||
|
||||
# Format the output string
|
||||
output_str = ', '.join([f'"{k}":"{v}"' for k, v in sorted(new_frame_strings.items())])
|
||||
print(output_str)
|
||||
return (output_str,)
|
||||
|
||||
class CrossFadeImages:
|
||||
|
||||
@@ -1128,24 +1169,38 @@ class VRAM_Debug:
|
||||
freemem_after = comfy.model_management.get_free_memory()
|
||||
print(freemem_after)
|
||||
return (model, freemem_before, freemem_after)
|
||||
|
||||
|
||||
class AnyType(str):
|
||||
"""A special class that is always equal in not equal comparisons. Credit to pythongosssss"""
|
||||
|
||||
def __ne__(self, __value: object) -> bool:
|
||||
return False
|
||||
any = AnyType("*")
|
||||
|
||||
class SomethingToString:
|
||||
@classmethod
|
||||
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"input": ("*", {"forceinput": True, "default": ""}),
|
||||
"input": (any, {}),
|
||||
},
|
||||
"optional": {
|
||||
"prefix": ("STRING", {"default": ""}),
|
||||
"suffix": ("STRING", {"default": ""}),
|
||||
}
|
||||
}
|
||||
RETURN_TYPES = ("STRING",)
|
||||
FUNCTION = "stringify"
|
||||
CATEGORY = "KJNodes"
|
||||
|
||||
def stringify(self, input):
|
||||
def stringify(self, input, prefix="", suffix=""):
|
||||
if isinstance(input, (int, float, bool)):
|
||||
stringified = str(input)
|
||||
print(stringified)
|
||||
if prefix: # Check if prefix is not empty
|
||||
stringified = prefix + stringified # Add the prefix
|
||||
if suffix: # Check if suffix is not empty
|
||||
stringified = stringified + suffix # Add the suffix
|
||||
else:
|
||||
return
|
||||
return (stringified,)
|
||||
@@ -2140,7 +2195,7 @@ class BatchCLIPSeg:
|
||||
model.to(device) # Ensure the model is on the correct device
|
||||
images = images.to(device)
|
||||
processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
|
||||
|
||||
pbar = comfy.utils.ProgressBar(images.shape[0])
|
||||
for image in images:
|
||||
image = (image* 255).type(torch.uint8)
|
||||
prompt = text
|
||||
@@ -2165,7 +2220,7 @@ class BatchCLIPSeg:
|
||||
|
||||
# Remove the extra dimensions
|
||||
resized_tensor = resized_tensor[0, 0, :, :]
|
||||
|
||||
pbar.update(1)
|
||||
out.append(resized_tensor)
|
||||
|
||||
results = torch.stack(out).cpu()
|
||||
@@ -2319,12 +2374,7 @@ class OffsetMask:
|
||||
|
||||
return mask,
|
||||
|
||||
class AnyType(str):
|
||||
"""A special class that is always equal in not equal comparisons. Credit to pythongosssss"""
|
||||
|
||||
def __ne__(self, __value: object) -> bool:
|
||||
return False
|
||||
any = AnyType("*")
|
||||
class WidgetToString:
|
||||
@classmethod
|
||||
def IS_CHANGED(cls, **kwargs):
|
||||
@@ -3266,13 +3316,14 @@ class OffsetMaskByNormalizedAmplitude:
|
||||
|
||||
return offsetmask,
|
||||
|
||||
|
||||
class ImageTransformByNormalizedAmplitude:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"normalized_amp": ("NORMALIZED_AMPLITUDE",),
|
||||
"zoom_scale": ("FLOAT", { "default": 0.0, "min": -1.0, "max": 1.0, "step": 0.001, "display": "number" }),
|
||||
"x_offset": ("INT", { "default": 0, "min": (1 -MAX_RESOLUTION), "max": MAX_RESOLUTION, "step": 1, "display": "number" }),
|
||||
"y_offset": ("INT", { "default": 0, "min": (1 -MAX_RESOLUTION), "max": MAX_RESOLUTION, "step": 1, "display": "number" }),
|
||||
"cumulative": ("BOOLEAN", { "default": False }),
|
||||
"image": ("IMAGE",),
|
||||
}}
|
||||
@@ -3281,7 +3332,7 @@ class ImageTransformByNormalizedAmplitude:
|
||||
FUNCTION = "amptransform"
|
||||
CATEGORY = "KJNodes"
|
||||
|
||||
def amptransform(self, image, normalized_amp, zoom_scale, cumulative):
|
||||
def amptransform(self, image, normalized_amp, zoom_scale, cumulative, x_offset, y_offset):
|
||||
# Ensure normalized_amp is an array and within the range [0, 1]
|
||||
normalized_amp = np.clip(normalized_amp, 0.0, 1.0)
|
||||
transformed_images = []
|
||||
@@ -3325,6 +3376,17 @@ class ImageTransformByNormalizedAmplitude:
|
||||
# Convert the tensor back to BxHxWxC format
|
||||
tensor_img = tensor_img.permute(1, 2, 0)
|
||||
|
||||
# Offset the image based on the amplitude
|
||||
offset_amp = amp * 10 # Calculate the offset magnitude based on the amplitude
|
||||
shift_x = min(x_offset * offset_amp, img.shape[1] - 1) # Calculate the shift in x direction
|
||||
shift_y = min(y_offset * offset_amp, img.shape[0] - 1) # Calculate the shift in y direction
|
||||
|
||||
# Apply the offset to the image tensor
|
||||
if shift_x != 0:
|
||||
tensor_img = torch.roll(tensor_img, shifts=int(shift_x), dims=1)
|
||||
if shift_y != 0:
|
||||
tensor_img = torch.roll(tensor_img, shifts=int(shift_y), dims=0)
|
||||
|
||||
# Add to the list
|
||||
transformed_images.append(tensor_img)
|
||||
|
||||
@@ -3460,7 +3522,7 @@ class GLIGENTextBoxApplyBatch:
|
||||
interpolated_coords = interpolate_coordinates_with_curves(coordinates_dict, batch_size)
|
||||
if interpolation == 'straight':
|
||||
interpolated_coords = interpolate_coordinates(coordinates_dict, batch_size)
|
||||
|
||||
|
||||
plot_image_tensor = plot_to_tensor(coordinates_dict, interpolated_coords, 512, 512, height)
|
||||
for t in conditioning_to:
|
||||
n = [t[0], t[1].copy()]
|
||||
@@ -3471,6 +3533,7 @@ class GLIGENTextBoxApplyBatch:
|
||||
x_position, y_position = interpolated_coords[i]
|
||||
position_param = (cond_pooled, height // 8, width // 8, y_position // 8, x_position // 8)
|
||||
position_params_batch[i].append(position_param) # Append position_param to the correct sublist
|
||||
print("x ",x_position, "y ", y_position)
|
||||
prev = []
|
||||
if "gligen" in n[1]:
|
||||
prev = n[1]['gligen'][2]
|
||||
@@ -3484,6 +3547,101 @@ class GLIGENTextBoxApplyBatch:
|
||||
|
||||
return (c, plot_image_tensor,)
|
||||
|
||||
class ImageUpscaleWithModelBatched:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": { "upscale_model": ("UPSCALE_MODEL",),
|
||||
"images": ("IMAGE",),
|
||||
"per_batch": ("INT", {"default": 16, "min": 1, "max": 4096, "step": 1}),
|
||||
}}
|
||||
RETURN_TYPES = ("IMAGE",)
|
||||
FUNCTION = "upscale"
|
||||
|
||||
CATEGORY = "KJNodes"
|
||||
|
||||
def upscale(self, upscale_model, images, per_batch):
|
||||
|
||||
device = comfy.model_management.get_torch_device()
|
||||
upscale_model.to(device)
|
||||
in_img = images.movedim(-1,-3).to(device)
|
||||
|
||||
steps = in_img.shape[0]
|
||||
pbar = comfy.utils.ProgressBar(steps)
|
||||
t = []
|
||||
|
||||
for start_idx in range(0, in_img.shape[0], per_batch):
|
||||
sub_images = upscale_model(in_img[start_idx:start_idx+per_batch])
|
||||
t.append(sub_images.cpu())
|
||||
# Calculate the number of images processed in this batch
|
||||
batch_count = sub_images.shape[0]
|
||||
# Update the progress bar by the number of images processed in this batch
|
||||
pbar.update(batch_count)
|
||||
upscale_model.cpu()
|
||||
|
||||
t = torch.cat(t, dim=0).permute(0, 2, 3, 1).cpu()
|
||||
|
||||
return (t,)
|
||||
|
||||
|
||||
import torchvision
|
||||
from torch import nn
|
||||
from safetensors import safe_open
|
||||
|
||||
class EfficientNetEncoder(nn.Module):
|
||||
def __init__(self, c_latent=16):
|
||||
super().__init__()
|
||||
self.backbone = torchvision.models.efficientnet_v2_s(weights='DEFAULT').features.eval()
|
||||
self.mapper = nn.Sequential(
|
||||
nn.Conv2d(1280, c_latent, kernel_size=1, bias=False),
|
||||
nn.BatchNorm2d(c_latent, affine=False), # then normalize them to have mean 0 and std 1
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
return self.mapper(self.backbone(x))
|
||||
|
||||
class EffnetEncode:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {"required": {
|
||||
"image": ("IMAGE",),
|
||||
}}
|
||||
RETURN_TYPES = ("LATENT",)
|
||||
FUNCTION = "encode"
|
||||
|
||||
CATEGORY = "KJNodes"
|
||||
|
||||
def encode(self, image):
|
||||
device = comfy.model_management.get_torch_device()
|
||||
|
||||
image = image.permute(0, 3, 1, 2).to(device)
|
||||
effnet_preprocess = torchvision.transforms.Compose([
|
||||
torchvision.transforms.Normalize(
|
||||
mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)
|
||||
)
|
||||
])
|
||||
image = effnet_preprocess(image)
|
||||
effnet = EfficientNetEncoder()
|
||||
|
||||
effnet_checkpoint = os.path.join(folder_paths.models_dir,"vae", "Stable-cascade","effnet_encoder.safetensors")
|
||||
if not os.path.exists(effnet_checkpoint):
|
||||
try:
|
||||
from huggingface_hub import snapshot_download
|
||||
download_to = os.path.join(folder_paths.models_dir,'vae', "Stable-cascade")
|
||||
snapshot_download(repo_id="stabilityai/stable-cascade", allow_patterns=["effnet_encoder.safetensors"],
|
||||
local_dir=download_to, local_dir_use_symlinks=False)
|
||||
except:
|
||||
raise Exception("Model not found and download failed. (https://huggingface.co/stabilityai/stable-cascade, effnet_encoder.safetensors)")
|
||||
|
||||
effnet_state_dict = {}
|
||||
with safe_open(effnet_checkpoint, framework="pt", device="cpu") as f:
|
||||
for key in f.keys():
|
||||
effnet_state_dict[key] = f.get_tensor(key)
|
||||
|
||||
effnet.load_state_dict(effnet_state_dict if 'state_dict' not in effnet_checkpoint else effnet_checkpoint['state_dict'])
|
||||
effnet.eval().requires_grad_(False).to(device)
|
||||
t = effnet(image).cpu()
|
||||
return ({"samples":t}, )
|
||||
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"INTConstant": INTConstant,
|
||||
@@ -3548,7 +3706,10 @@ NODE_CLASS_MAPPINGS = {
|
||||
"GetLatentsFromBatchIndexed": GetLatentsFromBatchIndexed,
|
||||
"StringConstant": StringConstant,
|
||||
"GLIGENTextBoxApplyBatch": GLIGENTextBoxApplyBatch,
|
||||
"CondPassThrough": CondPassThrough
|
||||
"CondPassThrough": CondPassThrough,
|
||||
"ImageUpscaleWithModelBatched": ImageUpscaleWithModelBatched,
|
||||
"ScaleBatchPromptSchedule": ScaleBatchPromptSchedule,
|
||||
"EffnetEncode": EffnetEncode
|
||||
}
|
||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"INTConstant": "INT Constant",
|
||||
@@ -3612,5 +3773,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"GetLatentsFromBatchIndexed": "GetLatentsFromBatchIndexed",
|
||||
"StringConstant": "StringConstant",
|
||||
"GLIGENTextBoxApplyBatch": "GLIGENTextBoxApplyBatch",
|
||||
"CondPassThrough": "CondPassThrough"
|
||||
"CondPassThrough": "CondPassThrough",
|
||||
"ImageUpscaleWithModelBatched": "ImageUpscaleWithModelBatched",
|
||||
"ScaleBatchPromptSchedule": "ScaleBatchPromptSchedule",
|
||||
"EffnetEncode": "EffnetEncode"
|
||||
}
|
||||
@@ -29,7 +29,7 @@ except:
|
||||
print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.")
|
||||
|
||||
|
||||
version = [2, 7]
|
||||
version = [2, 7, 2]
|
||||
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
|
||||
print(f"### Loading: ComfyUI-Manager ({version_str})")
|
||||
|
||||
@@ -307,16 +307,19 @@ def print_comfyui_version():
|
||||
global comfy_ui_commit_datetime
|
||||
global comfy_ui_hash
|
||||
|
||||
is_detached = False
|
||||
try:
|
||||
repo = git.Repo(os.path.dirname(folder_paths.__file__))
|
||||
|
||||
comfy_ui_revision = len(list(repo.iter_commits('HEAD')))
|
||||
current_branch = repo.active_branch.name
|
||||
comfy_ui_hash = repo.head.commit.hexsha
|
||||
|
||||
comfy_ui_hash = repo.head.commit.hexsha
|
||||
cm_global.variables['comfyui.revision'] = comfy_ui_revision
|
||||
|
||||
comfy_ui_commit_datetime = repo.head.commit.committed_datetime
|
||||
cm_global.variables['comfyui.commit_datetime'] = comfy_ui_commit_datetime
|
||||
|
||||
is_detached = repo.head.is_detached
|
||||
current_branch = repo.active_branch.name
|
||||
|
||||
try:
|
||||
if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date():
|
||||
@@ -343,7 +346,10 @@ def print_comfyui_version():
|
||||
else:
|
||||
print(f"### ComfyUI Revision: {comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{comfy_ui_commit_datetime.date()}'")
|
||||
except:
|
||||
print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)")
|
||||
if is_detached:
|
||||
print(f"### ComfyUI Revision: {comfy_ui_revision} [{comfy_ui_hash[:8]}] *DETACHED | Released on '{comfy_ui_commit_datetime.date()}'")
|
||||
else:
|
||||
print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)")
|
||||
|
||||
|
||||
print_comfyui_version()
|
||||
|
||||
@@ -199,6 +199,11 @@
|
||||
"id":"https://github.com/abyz22/image_control",
|
||||
"tags":"BMAB",
|
||||
"description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension."
|
||||
},
|
||||
{
|
||||
"id":"https://github.com/blepping/ComfyUI-sonar",
|
||||
"tags":"sonar",
|
||||
"description": "This extension provides some alternative functionalities of the [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) extension."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -446,7 +446,7 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step."
|
||||
},
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
"title": "SD-Advanced-Noise",
|
||||
@@ -456,7 +456,7 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space."
|
||||
},
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
"title": "SD-Latent-Upscaler",
|
||||
@@ -467,7 +467,7 @@
|
||||
"pip": ["huggingface-hub"],
|
||||
"install_type": "git-clone",
|
||||
"description": "Upscaling stable diffusion latents using a small neural network."
|
||||
},
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
"title": "ComfyUI_DiT [WIP]",
|
||||
@@ -478,7 +478,7 @@
|
||||
"pip": ["huggingface-hub"],
|
||||
"install_type": "git-clone",
|
||||
"description": "Testbed for [a/DiT(Scalable Diffusion Models with Transformers)](https://github.com/facebookresearch/DiT). [w/None of this code is stable, expect breaking changes if for some reason you want to use this.]"
|
||||
},
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
"title": "ComfyUI_ColorMod",
|
||||
@@ -488,7 +488,7 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This extension currently has two sets of nodes - one set for editing the contrast/color of images and another set for saving images as 16 bit PNG files."
|
||||
},
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
"title": "Extra Models for ComfyUI",
|
||||
@@ -904,6 +904,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI reference implementation for IPAdapter models. The code is mostly taken from the original IPAdapter repository and laksjdjf's implementation, all credit goes to them. I just made the extension closer to ComfyUI philosophy."
|
||||
},
|
||||
{
|
||||
"author": "cubiq",
|
||||
"title": "ComfyUI InstantID (Native Support)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID",
|
||||
"files": [
|
||||
"https://github.com/cubiq/ComfyUI_InstantID"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Native [a/InstantID](https://github.com/InstantID/InstantID) support for ComfyUI.\nThis extension differs from the many already available as it doesn't use diffusers but instead implements InstantID natively and it fully integrates with ComfyUI.\nPlease note this still could be considered beta stage, looking forward to your feedback."
|
||||
},
|
||||
{
|
||||
"author": "shockz0rz",
|
||||
"title": "InterpolateEverything",
|
||||
@@ -1497,6 +1507,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A few nodes to mix sigmas and a custom scheduler that uses phi, then one using eval() to be able to schedule with custom formulas."
|
||||
},
|
||||
{
|
||||
"author": "Extraltodeus",
|
||||
"title": "ComfyUI-AutomaticCFG",
|
||||
"reference": "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG",
|
||||
"files": [
|
||||
"https://github.com/Extraltodeus/ComfyUI-AutomaticCFG"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "My own version 'from scratch' of a self-rescaling CFG. It isn't much but it's honest work.\nTLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8. Low scale like 4 also gives really nice results since your CFG is not the CFG anymore. Also in general even with relatively low settings it seems to improve the quality."
|
||||
},
|
||||
{
|
||||
"author": "JPS",
|
||||
"title": "JPS Custom Nodes for ComfyUI",
|
||||
@@ -2297,6 +2317,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "Kijai",
|
||||
"title": "Animatediff MotionLoRA Trainer",
|
||||
"reference": "https://github.com/kijai/ComfyUI-ADMotionDirector",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-ADMotionDirector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a trainer for AnimateDiff MotionLoRAs, based on the implementation of MotionDirector by ExponentialML."
|
||||
},
|
||||
{
|
||||
"author": "hhhzzyang",
|
||||
"title": "Comfyui-Lama",
|
||||
@@ -3010,6 +3040,36 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Easily use Stable Video Diffusion inside ComfyUI!"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-ComfyRun",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-ComfyRun"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-MagicAnimate",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-MagicAnimate",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-MagicAnimate"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Easily use Magic Animate within ComfyUI!\n[w/WARN: This extension requires 15GB disk space.]"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-ComfyWorkflows",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
|
||||
},
|
||||
{
|
||||
"author": "Danand",
|
||||
"title": "ComfyUI-ComfyCouple",
|
||||
@@ -3130,6 +3190,36 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "QWen-VL-Plus & QWen-VL-Max in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-SVD-ZHO (WIP)",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "My Workflows + Auxiliary nodes for Stable Video Diffusion (SVD)"
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI SegMoE",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/SegMoE: Segmind Mixture of Diffusion Experts](https://github.com/segmind/segmoe) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI YoloWorld-EfficientSAM",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/YOLO-World + EfficientSAM](https://huggingface.co/spaces/SkalskiP/YOLO-World) & [a/YOLO-World](https://github.com/AILab-CVC/YOLO-World) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "kenjiqq",
|
||||
"title": "qq-nodes-comfyui",
|
||||
@@ -3872,36 +3962,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI extension for chatting with your images. Runs on your own system, no external services used, no filter. Uses the [a/LLaVA multimodal LLM](https://llava-vl.github.io/) so you can give instructions or ask questions in natural language. It's maybe as smart as GPT3.5, and it can see."
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-ComfyRun",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-ComfyRun"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-MagicAnimate",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-MagicAnimate",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-MagicAnimate"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Easily use Magic Animate within ComfyUI!\n[w/WARN: This extension requires 15GB disk space.]"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-ComfyWorkflows",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
|
||||
},
|
||||
{
|
||||
"author": "styler00dollar",
|
||||
"title": "ComfyUI-sudo-latent-upscale",
|
||||
@@ -3993,6 +4053,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a custom node of ComfyUI that downloads and loads models from the input URL. The model is temporarily downloaded into memory and not saved to storage.\nThis could be useful when trying out models or when using various models on machines with limited storage. Since the model is downloaded into memory, expect higher memory usage than usual."
|
||||
},
|
||||
{
|
||||
"author": "pkpkTech",
|
||||
"title": "ComfyUI-SaveQueues",
|
||||
"reference": "https://github.com/pkpkTech/ComfyUI-SaveQueues",
|
||||
"files": [
|
||||
"https://github.com/pkpkTech/ComfyUI-SaveQueues"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a button to the menu to save and load the running queue and the pending queues.\nThis is intended to be used when you want to exit ComfyUI with queues still remaining."
|
||||
},
|
||||
{
|
||||
"author": "Crystian",
|
||||
"title": "Crystools",
|
||||
@@ -4184,6 +4254,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:3D Pose Editor"
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-DynamiCrafter",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-DynamiCrafter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Better Dynamic, Higher Resolution, and Stronger Coherence!"
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-Panda3d",
|
||||
@@ -4311,8 +4391,9 @@
|
||||
"files": [
|
||||
"https://github.com/MrForExample/ComfyUI-3D-Pack"
|
||||
],
|
||||
"nodename_pattern": "^\\[Comfy3D\\]",
|
||||
"install_type": "git-clone",
|
||||
"description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)"
|
||||
"description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)\nNOTE: Pre-built python wheels can be download from [a/https://github.com/remsky/ComfyUI3D-Assorted-Wheels](https://github.com/remsky/ComfyUI3D-Assorted-Wheels)"
|
||||
},
|
||||
{
|
||||
"author": "Mr.ForExample",
|
||||
@@ -4321,6 +4402,7 @@
|
||||
"files": [
|
||||
"https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved"
|
||||
],
|
||||
"nodename_pattern": "^\\[AnimateAnyone\\]",
|
||||
"install_type": "git-clone",
|
||||
"description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]"
|
||||
},
|
||||
@@ -4334,6 +4416,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: MS kosmos-2 Interrogator, Save Image w/o Metadata, Image Scale Bounding Box. An implementation of Microsoft [a/kosmos-2](https://huggingface.co/microsoft/kosmos-2-patch14-224) image to text transformer."
|
||||
},
|
||||
{
|
||||
"author": "Hangover3832",
|
||||
"title": "ComfyUI-Hangover-Moondream",
|
||||
"reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream",
|
||||
"files": [
|
||||
"https://github.com/Hangover3832/ComfyUI-Hangover-Moondream"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Moondream is a lightweight multimodal large languge model.\nIMPORTANT:According to the creator, Moondream is for research purposes only, commercial use is not allowed!\n[w/WARN:Additional python code will be downloaded from huggingface and executed. You have to trust this creator if you want to use this node!]"
|
||||
},
|
||||
{
|
||||
"author": "tzwm",
|
||||
"title": "ComfyUI Profiler",
|
||||
@@ -4534,6 +4626,26 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: Format String, Join String List, Load Preset, Load Preset (Advanced), Const String, Const String (multi line). Add useful nodes related to prompt."
|
||||
},
|
||||
{
|
||||
"author": "nkchocoai",
|
||||
"title": "ComfyUI-TextOnSegs",
|
||||
"reference": "https://github.com/nkchocoai/ComfyUI-TextOnSegs",
|
||||
"files": [
|
||||
"https://github.com/nkchocoai/ComfyUI-TextOnSegs"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a node for drawing text with CR Draw Text of ComfyUI_Comfyroll_CustomNodes to the area of SEGS detected by Ultralytics Detector of ComfyUI-Impact-Pack."
|
||||
},
|
||||
{
|
||||
"author": "nkchocoai",
|
||||
"title": "ComfyUI-SaveImageWithMetaData",
|
||||
"reference": "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData",
|
||||
"files": [
|
||||
"https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a node to save images with metadata (PNGInfo) extracted from the input values of each node.\nSince the values are extracted dynamically, values output by various extension nodes can be added to metadata."
|
||||
},
|
||||
{
|
||||
"author": "JaredTherriault",
|
||||
"title": "ComfyUI-JNodes",
|
||||
@@ -4774,6 +4886,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Better TAESD previews, BlehHyperTile."
|
||||
},
|
||||
{
|
||||
"author": "blepping",
|
||||
"title": "ComfyUI-sonar",
|
||||
"reference": "https://github.com/blepping/ComfyUI-sonar",
|
||||
"files": [
|
||||
"https://github.com/blepping/ComfyUI-sonar"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A janky implementation of Sonar sampling (momentum-based sampling) for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "JerryOrbachJr",
|
||||
"title": "ComfyUI-RandomSize",
|
||||
@@ -4854,6 +4976,26 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:segformer_clothes, segformer_agnostic, segformer_remove_bg, stabel_vition. Nodes for model dress up."
|
||||
},
|
||||
{
|
||||
"author": "StartHua",
|
||||
"title": "Comfyui_joytag",
|
||||
"reference": "https://github.com/StartHua/Comfyui_joytag",
|
||||
"files": [
|
||||
"https://github.com/StartHua/Comfyui_joytag"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "JoyTag is a state of the art AI vision model for tagging images, with a focus on sex positivity and inclusivity. It uses the Danbooru tagging schema, but works across a wide range of images, from hand drawn to photographic.\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/fancyfeast/joytag/tree/main](https://huggingface.co/fancyfeast/joytag/tree/main)"
|
||||
},
|
||||
{
|
||||
"author": "StartHua",
|
||||
"title": "comfyui_segformer_b2_clothes",
|
||||
"reference": "https://github.com/StartHua/Comfyui_segformer_b2_clothes",
|
||||
"files": [
|
||||
"https://github.com/StartHua/Comfyui_segformer_b2_clothes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "SegFormer model fine-tuned on ATR dataset for clothes segmentation but can also be used for human segmentation!\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)"
|
||||
},
|
||||
{
|
||||
"author": "ricklove",
|
||||
"title": "comfyui-ricklove",
|
||||
@@ -4916,7 +5058,7 @@
|
||||
},
|
||||
{
|
||||
"author": "TemryL",
|
||||
"title": "ComfyS3: Amazon S3 Integration for ComfyUI",
|
||||
"title": "ComfyS3",
|
||||
"reference": "https://github.com/TemryL/ComfyS3",
|
||||
"files": [
|
||||
"https://github.com/TemryL/ComfyS3"
|
||||
@@ -4954,8 +5096,198 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Clip text encoder with BREAK formatting like A1111 (uses conditioning concat)"
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"author": "MarkoCa1",
|
||||
"title": "ComfyUI_Segment_Mask",
|
||||
"reference": "https://github.com/MarkoCa1/ComfyUI_Segment_Mask",
|
||||
"files": [
|
||||
"https://github.com/MarkoCa1/ComfyUI_Segment_Mask"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Mask cutout based on Segment Anything."
|
||||
},
|
||||
{
|
||||
"author": "antrobot",
|
||||
"title": "antrobots ComfyUI Nodepack",
|
||||
"reference": "https://github.com/antrobot1234/antrobots-comfyUI-nodepack",
|
||||
"files": [
|
||||
"https://github.com/antrobot1234/antrobots-comfyUI-nodepack"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A small node pack containing various things I felt like ought to be in base comfy-UI. Currently includes Some image handling nodes to help with inpainting, a version of KSampler (advanced) that allows for denoise, and a node that can swap it's inputs. Remember to make an issue if you experience any bugs or errors!"
|
||||
},
|
||||
{
|
||||
"author": "bilal-arikan",
|
||||
"title": "ComfyUI_TextAssets",
|
||||
"reference": "https://github.com/bilal-arikan/ComfyUI_TextAssets",
|
||||
"files": [
|
||||
"https://github.com/bilal-arikan/ComfyUI_TextAssets"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "With this node you can upload text files to input folder from your local computer."
|
||||
},
|
||||
{
|
||||
"author": "kadirnar",
|
||||
"title": "ComfyUI-Transformers",
|
||||
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
|
||||
"files": [
|
||||
"https://github.com/kadirnar/ComfyUI-Transformers"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI-Transformers is a cutting-edge project combining the power of computer vision and natural language processing to create intuitive and user-friendly interfaces. Our goal is to make technology more accessible and engaging."
|
||||
},
|
||||
{
|
||||
"author": "digitaljohn",
|
||||
"title": "ComfyUI-ProPost",
|
||||
"reference": "https://github.com/digitaljohn/comfyui-propost",
|
||||
"files": [
|
||||
"https://github.com/digitaljohn/comfyui-propost"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of custom ComfyUI nodes for performing basic post-processing effects including Film Grain and Vignette. These effects can help to take the edge off AI imagery and make them feel more natural."
|
||||
},
|
||||
{
|
||||
"author": "DonBaronFactory",
|
||||
"title": "ComfyUI-Cre8it-Nodes",
|
||||
"reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes",
|
||||
"files": [
|
||||
"https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows"
|
||||
},
|
||||
{
|
||||
"author": "deforum",
|
||||
"title": "Deforum Nodes",
|
||||
"reference": "https://github.com/XmYx/deforum-comfy-nodes",
|
||||
"files": [
|
||||
"https://github.com/XmYx/deforum-comfy-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Official Deforum animation pipeline tools that provide a unique way to create frame-by-frame generative motion art."
|
||||
},
|
||||
{
|
||||
"author": "adbrasi",
|
||||
"title": "ComfyUI-TrashNodes-DownloadHuggingface",
|
||||
"reference": "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface",
|
||||
"files": [
|
||||
"https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI-TrashNodes-DownloadHuggingface is a ComfyUI node designed to facilitate the download of models you have just trained and uploaded to Hugging Face. This node is particularly useful for users who employ Google Colab for training and need to quickly download their models for deployment."
|
||||
},
|
||||
{
|
||||
"author": "mbrostami",
|
||||
"title": "ComfyUI-HF",
|
||||
"reference": "https://github.com/mbrostami/ComfyUI-HF",
|
||||
"files": [
|
||||
"https://github.com/mbrostami/ComfyUI-HF"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI Node to work with Hugging Face repositories"
|
||||
},
|
||||
{
|
||||
"author": "Billius-AI",
|
||||
"title": "ComfyUI-Path-Helper",
|
||||
"reference": "https://github.com/Billius-AI/ComfyUI-Path-Helper",
|
||||
"files": [
|
||||
"https://github.com/Billius-AI/ComfyUI-Path-Helper"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Create Project Root, Add Folder, Add Folder Advanced, Add File Name Prefix, Add File Name Prefix Advanced, ShowPath"
|
||||
},
|
||||
{
|
||||
"author": "Franck-Demongin",
|
||||
"title": "NX_PromptStyler",
|
||||
"reference": "https://github.com/Franck-Demongin/NX_PromptStyler",
|
||||
"files": [
|
||||
"https://github.com/Franck-Demongin/NX_PromptStyler"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI to create a prompt based on a list of keywords saved in CSV files."
|
||||
},
|
||||
{
|
||||
"author": "xiaoxiaodesha",
|
||||
"title": "hd-nodes-comfyui",
|
||||
"reference": "https://github.com/xiaoxiaodesha/hd_node",
|
||||
"files": [
|
||||
"https://github.com/xiaoxiaodesha/hd_node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Combine HDMasks, Cover HDMasks, HD FaceIndex, HD SmoothEdge, HD GetMaskArea, HD Image Levels, HD Ultimate SD Upscale"
|
||||
},
|
||||
{
|
||||
"author": "ShmuelRonen",
|
||||
"title": "ComfyUI-SVDResizer",
|
||||
"reference": "https://github.com/ShmuelRonen/ComfyUI-SVDResizer",
|
||||
"files": [
|
||||
"https://github.com/ShmuelRonen/ComfyUI-SVDResizer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "SVDResizer is a helper for resizing the source image, according to the sizes enabled in Stable Video Diffusion. The rationale behind the possibility of changing the size of the image in steps between the ranges of 576 and 1024, is the use of the greatest common denominator of these two numbers which is 64. SVD is lenient with resizing that adheres to this rule, so the chance of coherent video that is not the standard size of 576X1024 is greater. It is advisable to keep the value 1024 constant and play with the second size to maintain the stability of the result."
|
||||
},
|
||||
{
|
||||
"author": "redhottensors",
|
||||
"title": "ComfyUI-Prediction",
|
||||
"reference": "https://github.com/redhottensors/ComfyUI-Prediction",
|
||||
"files": [
|
||||
"https://github.com/redhottensors/ComfyUI-Prediction"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Fully customizable Classifier Free Guidance for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "Mamaaaamooooo",
|
||||
"title": "Batch Rembg for ComfyUI",
|
||||
"reference": "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes",
|
||||
"files": [
|
||||
"https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Remove background of plural images."
|
||||
},
|
||||
{
|
||||
"author": "jordoh",
|
||||
"title": "ComfyUI Deepface",
|
||||
"reference": "https://github.com/jordoh/ComfyUI-Deepface",
|
||||
"files": [
|
||||
"https://github.com/jordoh/ComfyUI-Deepface"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes wrapping the [a/deepface](https://github.com/serengil/deepface) library."
|
||||
},
|
||||
{
|
||||
"author": "yuvraj108c",
|
||||
"title": "ComfyUI-Pronodes",
|
||||
"reference": "https://github.com/yuvraj108c/ComfyUI-Pronodes",
|
||||
"files": [
|
||||
"https://github.com/yuvraj108c/ComfyUI-Pronodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A collection of nice utility nodes for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "GavChap",
|
||||
"title": "ComfyUI-CascadeResolutions",
|
||||
"reference": "https://github.com/GavChap/ComfyUI-CascadeResolutions",
|
||||
"files": [
|
||||
"https://github.com/GavChap/ComfyUI-CascadeResolutions"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Cascade Resolutions"
|
||||
},
|
||||
{
|
||||
"author": "yuvraj108c",
|
||||
"title": "ComfyUI-Vsgan",
|
||||
"reference": "https://github.com/yuvraj108c/ComfyUI-Vsgan",
|
||||
"files": [
|
||||
"https://github.com/yuvraj108c/ComfyUI-Vsgan"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Upscale Video Tensorrt"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"author": "Ser-Hilary",
|
||||
@@ -5228,7 +5560,17 @@
|
||||
"install_type": "copy",
|
||||
"description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning."
|
||||
},
|
||||
|
||||
{
|
||||
"author": "AshMartian",
|
||||
"title": "Dir Gir",
|
||||
"reference": "https://github.com/AshMartian/ComfyUI-DirGir",
|
||||
"files": [
|
||||
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_picker.py",
|
||||
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_loop.py"
|
||||
],
|
||||
"install_type": "copy",
|
||||
"description": "A collection of ComfyUI directory automation utility nodes. Directory Get It Right adds a GUI directory browser, and smart directory loop/iteration node that supports regex and file extension filtering."
|
||||
},
|
||||
|
||||
{
|
||||
"author": "theally",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1052,7 +1052,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
onclick: (e) => {
|
||||
const last_visited_site = localStorage.getItem("wg_last_visited")
|
||||
if (!!last_visited_site) {
|
||||
window.open(last_visited_site, "comfyui-workflow-gallery");
|
||||
window.open(last_visited_site, last_visited_site);
|
||||
} else {
|
||||
this.handleWorkflowGalleryButtonClick(e)
|
||||
}
|
||||
@@ -1179,7 +1179,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
callback: () => {
|
||||
const url = "https://openart.ai/workflows/dev";
|
||||
localStorage.setItem("wg_last_visited", url);
|
||||
window.open(url, "comfyui-workflow-gallery");
|
||||
window.open(url, url);
|
||||
modifyButtonStyle(url);
|
||||
},
|
||||
},
|
||||
@@ -1188,7 +1188,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
callback: () => {
|
||||
const url = "https://youml.com/?from=comfyui-share";
|
||||
localStorage.setItem("wg_last_visited", url);
|
||||
window.open(url, "comfyui-workflow-gallery");
|
||||
window.open(url, url);
|
||||
modifyButtonStyle(url);
|
||||
},
|
||||
},
|
||||
@@ -1197,7 +1197,16 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
callback: () => {
|
||||
const url = "https://comfyworkflows.com/";
|
||||
localStorage.setItem("wg_last_visited", url);
|
||||
window.open(url, "comfyui-workflow-gallery");
|
||||
window.open(url, url);
|
||||
modifyButtonStyle(url);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "Open 'flowt.ai'",
|
||||
callback: () => {
|
||||
const url = "https://flowt.ai/";
|
||||
localStorage.setItem("wg_last_visited", url);
|
||||
window.open(url, url);
|
||||
modifyButtonStyle(url);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -270,6 +270,138 @@
|
||||
"filename": "easynegative.safetensors",
|
||||
"url": "https://civitai.com/api/download/models/9208"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
|
||||
"type": "checkpoints",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "checkpoints/Stable-Cascade",
|
||||
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stable_cascade_stage_b.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
|
||||
"type": "checkpoints",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "checkpoints/Stable-Cascade",
|
||||
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stable_cascade_stage_c.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
|
||||
"type": "VAE",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "vae/Stable-Cascade",
|
||||
"description": "[73.7MB] Stable Cascade: stage_a",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_a.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
|
||||
"type": "VAE",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "vae/Stable-Cascade",
|
||||
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "effnet_encoder.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[6.25GB] Stable Cascade: stage_b",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[2.8GB] Stable Cascade: stage_b/lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_lite.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_lite_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[14.4GB] Stable Cascade: stage_c",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[4.12GB] Stable Cascade: stage_c/lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_lite.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_lite_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
|
||||
"type": "clip",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "clip/Stable-Cascade",
|
||||
"description": "[1.39GB] Stable Cascade: text_encoder",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "model.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "SDXL-Turbo 1.0 (fp16)",
|
||||
"type": "checkpoints",
|
||||
@@ -667,8 +799,8 @@
|
||||
"save_path": "default",
|
||||
"description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs",
|
||||
"reference": "https://huggingface.co/CiaraRowles/TemporalNet2",
|
||||
"filename": "temporalnetversion2.ckpt",
|
||||
"url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.ckpt"
|
||||
"filename": "temporalnetversion2.safetensors",
|
||||
"url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "CiaraRowles/TemporalNet1XL (1.0)",
|
||||
@@ -1246,56 +1378,220 @@
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff)",
|
||||
"name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/comfyui-animatediff/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "AnimateDiff",
|
||||
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v14.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff)",
|
||||
"name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/comfyui-animatediff/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "AnimateDiff",
|
||||
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v15.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v14.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v15.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v15_v2.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v3_sd15_mm.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SDXL",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sdxl_v10_beta.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_high.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_mid.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
|
||||
},
|
||||
{
|
||||
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
|
||||
"filename": "temporaldiff-v1-animatediff.ckpt",
|
||||
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanLeft.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanRight.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingAnticlockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingClockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltDown.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltUp.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomIn.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomOut.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_32_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "controlnet",
|
||||
@@ -1316,16 +1612,6 @@
|
||||
"filename": "v3_sd15_sparsectrl_scribble.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v3_sd15_mm.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v3_sd15_adapter.ckpt",
|
||||
"type": "lora",
|
||||
@@ -1337,158 +1623,6 @@
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SDXL",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sdxl_v10_beta.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_high.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_mid.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
|
||||
},
|
||||
{
|
||||
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
|
||||
"filename": "temporaldiff-v1-animatediff.ckpt",
|
||||
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanLeft.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanRight.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingAnticlockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingClockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltDown.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltUp.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomIn.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomOut.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_32_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "TencentARC/motionctrl.pth",
|
||||
"type": "checkpoints",
|
||||
@@ -1810,6 +1944,97 @@
|
||||
"reference": "https://huggingface.co/TencentARC/PhotoMaker",
|
||||
"filename": "photomaker-v1.bin",
|
||||
"url": "https://huggingface.co/TencentARC/PhotoMaker/resolve/main/photomaker-v1.bin"
|
||||
},
|
||||
{
|
||||
"name": "1k3d68.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "1k3d68.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx"
|
||||
},
|
||||
{
|
||||
"name": "2d106det.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "2d106det.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx"
|
||||
},
|
||||
{
|
||||
"name": "genderage.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "genderage.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx"
|
||||
},
|
||||
{
|
||||
"name": "glintr100.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "glintr100.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx"
|
||||
},
|
||||
{
|
||||
"name": "scrfd_10g_bnkps.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "scrfd_10g_bnkps.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx"
|
||||
},
|
||||
{
|
||||
"name": "ip-adapter.bin",
|
||||
"type": "instantid",
|
||||
"base": "SDXL",
|
||||
"save_path": "instantid",
|
||||
"description": "InstantId main model based on IpAdapter",
|
||||
"reference": "https://huggingface.co/InstantX/InstantID",
|
||||
"filename": "ip-adapter.bin",
|
||||
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin"
|
||||
},
|
||||
{
|
||||
"name": "diffusion_pytorch_model.safetensors",
|
||||
"type": "controlnet",
|
||||
"base": "SDXL",
|
||||
"save_path": "controlnet/instantid",
|
||||
"description": "InstantId controlnet model",
|
||||
"reference": "https://huggingface.co/InstantX/InstantID",
|
||||
"filename": "diffusion_pytorch_model.safetensors",
|
||||
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
|
||||
"type": "efficient_sam",
|
||||
"base": "efficient_sam",
|
||||
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
|
||||
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
|
||||
"filename": "efficient_sam_s_cpu.jit",
|
||||
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
|
||||
},
|
||||
{
|
||||
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
|
||||
"type": "efficient_sam",
|
||||
"base": "efficient_sam",
|
||||
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
|
||||
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
|
||||
"filename": "efficient_sam_s_gpu.jit",
|
||||
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
+86
-17
@@ -9,7 +9,56 @@
|
||||
"description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel."
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"author": "huizhang0110",
|
||||
"title": "ComfyUI_Easy_Nodes_hui",
|
||||
"reference": "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui",
|
||||
"files": [
|
||||
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:EasyEmptyLatentImage"
|
||||
},
|
||||
{
|
||||
"author": "tuckerdarby",
|
||||
"title": "ComfyUI-TDNodes [WIP]",
|
||||
"reference": "https://github.com/tuckerdarby/ComfyUI-TDNodes",
|
||||
"files": [
|
||||
"https://github.com/tuckerdarby/ComfyUI-TDNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:KSampler (RAVE), KSampler (TF), Object Tracker, KSampler Batched, Video Tracker Prompt, TemporalNet Preprocessor, Instance Tracker Prompt, Instance Diffusion Loader, Hand Tracker Node"
|
||||
},
|
||||
{
|
||||
"author": "shadowcz007",
|
||||
"title": "comfyui-musicgen",
|
||||
"reference": "https://github.com/shadowcz007/comfyui-musicgen",
|
||||
"files": [
|
||||
"https://github.com/shadowcz007/comfyui-musicgen"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Musicgen"
|
||||
},
|
||||
{
|
||||
"author": "Extraltodeus",
|
||||
"title": "ComfyUI-variableCFGandAntiBurn [WIP]",
|
||||
"reference": "https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn",
|
||||
"files": [
|
||||
"https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Continuous CFG rescaler (pre CFG), Intermediary latent merge (post CFG), Intensity/Brightness limiter (post CFG), Dynamic renoising (post CFG), Automatic CFG scale (pre/post CFG), CFG multiplier per channel (pre CFG), Self-Attention Guidance delayed activation mod (post CFG)"
|
||||
},
|
||||
{
|
||||
"author": "shadowcz007",
|
||||
"title": "comfyui-CLIPSeg",
|
||||
"reference": "https://github.com/shadowcz007/comfyui-CLIPSeg",
|
||||
"files": [
|
||||
"https://github.com/shadowcz007/comfyui-CLIPSeg"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Download [a/CLIPSeg](https://huggingface.co/CIDAS/clipseg-rd64-refined/tree/main), move to : models/clipseg"
|
||||
},
|
||||
{
|
||||
"author": "dezi-ai",
|
||||
"title": "ComfyUI Animate LCM",
|
||||
@@ -18,17 +67,47 @@
|
||||
"https://github.com/dezi-ai/ComfyUI-AnimateLCM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: Configurator for AnimateLCM, Renderer for AnimateLCM to render the video."
|
||||
"description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)].\b[w/This extension includes a large number of nodes imported from the existing custom nodes, increasing the likelihood of conflicts.]"
|
||||
},
|
||||
{
|
||||
"author": "blepping",
|
||||
"title": "ComfyUI-sonar (WIP)",
|
||||
"reference": "https://github.com/blepping/ComfyUI-sonar",
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-BRIA_AI-RMBG",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG",
|
||||
"files": [
|
||||
"https://github.com/blepping/ComfyUI-sonar"
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Extremely WIP and untested implementation of Sonar sampling. Currently it may not be even close to working properly. Only supports Euler and Euler Ancestral sampling. See [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) for a more in-depth explanation."
|
||||
"description": "Unofficial [a/BRIA Background Removal v1.4](https://huggingface.co/briaai/RMBG-1.4) of BRIA RMBG Model for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "stutya",
|
||||
"title": "ComfyUI-Terminal [UNSAFE]",
|
||||
"reference": "https://github.com/stutya/ComfyUI-Terminal",
|
||||
"files": [
|
||||
"https://github.com/stutya/ComfyUI-Terminal"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Run Terminal Commands from ComfyUI.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
|
||||
},
|
||||
{
|
||||
"author": "marcueberall",
|
||||
"title": "ComfyUI-BuildPath",
|
||||
"reference": "https://github.com/marcueberall/ComfyUI-BuildPath",
|
||||
"files": [
|
||||
"https://github.com/marcueberall/ComfyUI-BuildPath"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: Build Path Adv."
|
||||
},
|
||||
{
|
||||
"author": "LotzF",
|
||||
"title": "ComfyUI simple ChatGPT completion [UNSAFE]",
|
||||
"reference": "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion",
|
||||
"files": [
|
||||
"https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]"
|
||||
},
|
||||
{
|
||||
"author": "kappa54m",
|
||||
@@ -120,16 +199,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "WIP"
|
||||
},
|
||||
{
|
||||
"author": "kadirnar",
|
||||
"title": "ComfyUI-Transformers",
|
||||
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
|
||||
"files": [
|
||||
"https://github.com/kadirnar/ComfyUI-Transformers"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:DepthEstimation."
|
||||
},
|
||||
{
|
||||
"author": "MrAdamBlack",
|
||||
"title": "CheckProgress [WIP]",
|
||||
|
||||
+20
@@ -10,6 +10,26 @@
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"author": "ccvv804",
|
||||
"title": "ComfyUI StableCascade using diffusers for Low VRAM [DEPRECATED]",
|
||||
"reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
|
||||
"files": [
|
||||
"https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
|
||||
},
|
||||
{
|
||||
"author": "kijai",
|
||||
"title": "ComfyUI StableCascade using diffusers [DEPRECATED]",
|
||||
"reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-DiffusersStableCascade"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
|
||||
},
|
||||
{
|
||||
"author": "solarpush",
|
||||
"title": "comfyui_sendimage_node [REMOVED]",
|
||||
|
||||
+362
-391
@@ -10,6 +10,367 @@
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI YoloWorld-EfficientSAM",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/YOLO-World + EfficientSAM](https://huggingface.co/spaces/SkalskiP/YOLO-World) & [a/YOLO-World](https://github.com/AILab-CVC/YOLO-World) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "nkchocoai",
|
||||
"title": "ComfyUI-SaveImageWithMetaData",
|
||||
"reference": "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData",
|
||||
"files": [
|
||||
"https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a node to save images with metadata (PNGInfo) extracted from the input values of each node.\nSince the values are extracted dynamically, values output by various extension nodes can be added to metadata."
|
||||
},
|
||||
{
|
||||
"author": "yuvraj108c",
|
||||
"title": "ComfyUI-Vsgan",
|
||||
"reference": "https://github.com/yuvraj108c/ComfyUI-Vsgan",
|
||||
"files": [
|
||||
"https://github.com/yuvraj108c/ComfyUI-Vsgan"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Upscale Video Tensorrt"
|
||||
},
|
||||
{
|
||||
"author": "Kijai",
|
||||
"title": "Animatediff MotionLoRA Trainer",
|
||||
"reference": "https://github.com/kijai/ComfyUI-ADMotionDirector",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-ADMotionDirector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a trainer for AnimateDiff MotionLoRAs, based on the implementation of MotionDirector by ExponentialML."
|
||||
},
|
||||
{
|
||||
"author": "GavChap",
|
||||
"title": "ComfyUI-CascadeResolutions",
|
||||
"reference": "https://github.com/GavChap/ComfyUI-CascadeResolutions",
|
||||
"files": [
|
||||
"https://github.com/GavChap/ComfyUI-CascadeResolutions"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Cascade Resolutions"
|
||||
},
|
||||
{
|
||||
"author": "blepping",
|
||||
"title": "ComfyUI-sonar",
|
||||
"reference": "https://github.com/blepping/ComfyUI-sonar",
|
||||
"files": [
|
||||
"https://github.com/blepping/ComfyUI-sonar"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A janky implementation of Sonar sampling (momentum-based sampling) for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "StartHua",
|
||||
"title": "comfyui_segformer_b2_clothes",
|
||||
"reference": "https://github.com/StartHua/Comfyui_segformer_b2_clothes",
|
||||
"files": [
|
||||
"https://github.com/StartHua/Comfyui_segformer_b2_clothes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "SegFormer model fine-tuned on ATR dataset for clothes segmentation but can also be used for human segmentation!\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)"
|
||||
},
|
||||
{
|
||||
"author": "AshMartian",
|
||||
"title": "Dir Gir",
|
||||
"reference": "https://github.com/AshMartian/ComfyUI-DirGir",
|
||||
"files": [
|
||||
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_picker.py",
|
||||
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_loop.py"
|
||||
],
|
||||
"install_type": "copy",
|
||||
"description": "A collection of ComfyUI directory automation utility nodes. Directory Get It Right adds a GUI directory browser, and smart directory loop/iteration node that supports regex and file extension filtering."
|
||||
},
|
||||
{
|
||||
"author": "ccvv804",
|
||||
"title": "ComfyUI StableCascade using diffusers for Low VRAM",
|
||||
"reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
|
||||
"files": [
|
||||
"https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
|
||||
},
|
||||
{
|
||||
"author": "yuvraj108c",
|
||||
"title": "ComfyUI-Pronodes",
|
||||
"reference": "https://github.com/yuvraj108c/ComfyUI-Pronodes",
|
||||
"files": [
|
||||
"https://github.com/yuvraj108c/ComfyUI-Pronodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A collection of nice utility nodes for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "pkpkTech",
|
||||
"title": "ComfyUI-SaveQueues",
|
||||
"reference": "https://github.com/pkpkTech/ComfyUI-SaveQueues",
|
||||
"files": [
|
||||
"https://github.com/pkpkTech/ComfyUI-SaveQueues"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a button to the menu to save and load the running queue and the pending queues.\nThis is intended to be used when you want to exit ComfyUI with queues still remaining."
|
||||
},
|
||||
{
|
||||
"author": "jordoh",
|
||||
"title": "ComfyUI Deepface",
|
||||
"reference": "https://github.com/jordoh/ComfyUI-Deepface",
|
||||
"files": [
|
||||
"https://github.com/jordoh/ComfyUI-Deepface"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes wrapping the [a/deepface](https://github.com/serengil/deepface) library."
|
||||
},
|
||||
{
|
||||
"author": "kijai",
|
||||
"title": "ComfyUI StableCascade using diffusers",
|
||||
"reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-DiffusersStableCascade"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
|
||||
},
|
||||
{
|
||||
"author": "Extraltodeus",
|
||||
"title": "ComfyUI-AutomaticCFG",
|
||||
"reference": "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG",
|
||||
"files": [
|
||||
"https://github.com/Extraltodeus/ComfyUI-AutomaticCFG"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "My own version 'from scratch' of a self-rescaling CFG. It isn't much but it's honest work.\nTLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8. Low scale like 4 also gives really nice results since your CFG is not the CFG anymore. Also in general even with relatively low settings it seems to improve the quality."
|
||||
},
|
||||
{
|
||||
"author": "Mamaaaamooooo",
|
||||
"title": "Batch Rembg for ComfyUI",
|
||||
"reference": "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes",
|
||||
"files": [
|
||||
"https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Remove background of plural images."
|
||||
},
|
||||
{
|
||||
"author": "ShmuelRonen",
|
||||
"title": "ComfyUI-SVDResizer",
|
||||
"reference": "https://github.com/ShmuelRonen/ComfyUI-SVDResizer",
|
||||
"files": [
|
||||
"https://github.com/ShmuelRonen/ComfyUI-SVDResizer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "SVDResizer is a helper for resizing the source image, according to the sizes enabled in Stable Video Diffusion. The rationale behind the possibility of changing the size of the image in steps between the ranges of 576 and 1024, is the use of the greatest common denominator of these two numbers which is 64. SVD is lenient with resizing that adheres to this rule, so the chance of coherent video that is not the standard size of 576X1024 is greater. It is advisable to keep the value 1024 constant and play with the second size to maintain the stability of the result."
|
||||
},
|
||||
{
|
||||
"author": "xiaoxiaodesha",
|
||||
"title": "hd-nodes-comfyui",
|
||||
"reference": "https://github.com/xiaoxiaodesha/hd_node",
|
||||
"files": [
|
||||
"https://github.com/xiaoxiaodesha/hd_node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Combine HDMasks, Cover HDMasks, HD FaceIndex, HD SmoothEdge, HD GetMaskArea, HD Image Levels, HD Ultimate SD Upscale"
|
||||
},
|
||||
{
|
||||
"author": "StartHua",
|
||||
"title": "Comfyui_joytag",
|
||||
"reference": "https://github.com/StartHua/Comfyui_joytag",
|
||||
"files": [
|
||||
"https://github.com/StartHua/Comfyui_joytag"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "JoyTag is a state of the art AI vision model for tagging images, with a focus on sex positivity and inclusivity. It uses the Danbooru tagging schema, but works across a wide range of images, from hand drawn to photographic.\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/fancyfeast/joytag/tree/main](https://huggingface.co/fancyfeast/joytag/tree/main)"
|
||||
},
|
||||
{
|
||||
"author": "redhottensors",
|
||||
"title": "ComfyUI-Prediction",
|
||||
"reference": "https://github.com/redhottensors/ComfyUI-Prediction",
|
||||
"files": [
|
||||
"https://github.com/redhottensors/ComfyUI-Prediction"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Fully customizable Classifier Free Guidance for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "nkchocoai",
|
||||
"title": "ComfyUI-TextOnSegs",
|
||||
"reference": "https://github.com/nkchocoai/ComfyUI-TextOnSegs",
|
||||
"files": [
|
||||
"https://github.com/nkchocoai/ComfyUI-TextOnSegs"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a node for drawing text with CR Draw Text of ComfyUI_Comfyroll_CustomNodes to the area of SEGS detected by Ultralytics Detector of ComfyUI-Impact-Pack."
|
||||
},
|
||||
{
|
||||
"author": "cubiq",
|
||||
"title": "ComfyUI InstantID (Native Support)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID",
|
||||
"files": [
|
||||
"https://github.com/cubiq/ComfyUI_InstantID"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Native [a/InstantID](https://github.com/InstantID/InstantID) support for ComfyUI.\nThis extension differs from the many already available as it doesn't use diffusers but instead implements InstantID natively and it fully integrates with ComfyUI.\nPlease note this still could be considered beta stage, looking forward to your feedback."
|
||||
},
|
||||
{
|
||||
"author": "Franck-Demongin",
|
||||
"title": "NX_PromptStyler",
|
||||
"reference": "https://github.com/Franck-Demongin/NX_PromptStyler",
|
||||
"files": [
|
||||
"https://github.com/Franck-Demongin/NX_PromptStyler"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI to create a prompt based on a list of keywords saved in CSV files."
|
||||
},
|
||||
{
|
||||
"author": "Billius-AI",
|
||||
"title": "ComfyUI-Path-Helper",
|
||||
"reference": "https://github.com/Billius-AI/ComfyUI-Path-Helper",
|
||||
"files": [
|
||||
"https://github.com/Billius-AI/ComfyUI-Path-Helper"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Create Project Root, Add Folder, Add Folder Advanced, Add File Name Prefix, Add File Name Prefix Advanced, ShowPath"
|
||||
},
|
||||
{
|
||||
"author": "mbrostami",
|
||||
"title": "ComfyUI-HF",
|
||||
"reference": "https://github.com/mbrostami/ComfyUI-HF",
|
||||
"files": [
|
||||
"https://github.com/mbrostami/ComfyUI-HF"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI Node to work with Hugging Face repositories"
|
||||
},
|
||||
{
|
||||
"author": "digitaljohn",
|
||||
"title": "ComfyUI-ProPost",
|
||||
"reference": "https://github.com/digitaljohn/comfyui-propost",
|
||||
"files": [
|
||||
"https://github.com/digitaljohn/comfyui-propost"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of custom ComfyUI nodes for performing basic post-processing effects including Film Grain and Vignette. These effects can help to take the edge off AI imagery and make them feel more natural."
|
||||
},
|
||||
{
|
||||
"author": "deforum",
|
||||
"title": "Deforum Nodes",
|
||||
"reference": "https://github.com/XmYx/deforum-comfy-nodes",
|
||||
"files": [
|
||||
"https://github.com/XmYx/deforum-comfy-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Official Deforum animation pipeline tools that provide a unique way to create frame-by-frame generative motion art."
|
||||
},
|
||||
{
|
||||
"author": "adbrasi",
|
||||
"title": "ComfyUI-TrashNodes-DownloadHuggingface",
|
||||
"reference": "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface",
|
||||
"files": [
|
||||
"https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI-TrashNodes-DownloadHuggingface is a ComfyUI node designed to facilitate the download of models you have just trained and uploaded to Hugging Face. This node is particularly useful for users who employ Google Colab for training and need to quickly download their models for deployment."
|
||||
},
|
||||
{
|
||||
"author": "DonBaronFactory",
|
||||
"title": "ComfyUI-Cre8it-Nodes",
|
||||
"reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes",
|
||||
"files": [
|
||||
"https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows"
|
||||
},
|
||||
{
|
||||
"author": "dezi-ai",
|
||||
"title": "ComfyUI Animate LCM",
|
||||
"reference": "https://github.com/dezi-ai/ComfyUI-AnimateLCM",
|
||||
"files": [
|
||||
"https://github.com/dezi-ai/ComfyUI-AnimateLCM"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)]."
|
||||
},
|
||||
{
|
||||
"author": "kadirnar",
|
||||
"title": "ComfyUI-Transformers",
|
||||
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
|
||||
"files": [
|
||||
"https://github.com/kadirnar/ComfyUI-Transformers"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI-Transformers is a cutting-edge project combining the power of computer vision and natural language processing to create intuitive and user-friendly interfaces. Our goal is to make technology more accessible and engaging."
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-DynamiCrafter",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-DynamiCrafter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Better Dynamic, Higher Resolution, and Stronger Coherence!"
|
||||
},
|
||||
{
|
||||
"author": "bilal-arikan",
|
||||
"title": "ComfyUI_TextAssets",
|
||||
"reference": "https://github.com/bilal-arikan/ComfyUI_TextAssets",
|
||||
"files": [
|
||||
"https://github.com/bilal-arikan/ComfyUI_TextAssets"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "With this node you can upload text files to input folder from your local computer."
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI SegMoE",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/SegMoE: Segmind Mixture of Diffusion Experts](https://github.com/segmind/segmoe) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-SVD-ZHO (WIP)",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "My Workflows + Auxiliary nodes for Stable Video Diffusion (SVD)"
|
||||
},
|
||||
{
|
||||
"author": "MarkoCa1",
|
||||
"title": "ComfyUI_Segment_Mask",
|
||||
"reference": "https://github.com/MarkoCa1/ComfyUI_Segment_Mask",
|
||||
"files": [
|
||||
"https://github.com/MarkoCa1/ComfyUI_Segment_Mask"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Mask cutout based on Segment Anything."
|
||||
},
|
||||
{
|
||||
"author": "antrobot",
|
||||
"title": "antrobots-comfyUI-nodepack",
|
||||
"reference": "https://github.com/antrobot1234/antrobots-comfyUI-nodepack",
|
||||
"files": [
|
||||
"https://github.com/antrobot1234/antrobots-comfyUI-nodepack"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A small node pack containing various things I felt like ought to be in base comfy-UI. Currently includes Some image handling nodes to help with inpainting, a version of KSampler (advanced) that allows for denoise, and a node that can swap it's inputs. Remember to make an issue if you experience any bugs or errors!"
|
||||
},
|
||||
{
|
||||
"author": "dfl",
|
||||
"title": "comfyui-clip-with-break",
|
||||
@@ -52,7 +413,7 @@
|
||||
},
|
||||
{
|
||||
"author": "davask",
|
||||
"title": "MarasIT Nodes",
|
||||
"title": "🐰 MarasIT Nodes",
|
||||
"reference": "https://github.com/davask/ComfyUI-MarasIT-Nodes",
|
||||
"files": [
|
||||
"https://github.com/davask/ComfyUI-MarasIT-Nodes"
|
||||
@@ -359,396 +720,6 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Just a simple substring node that takes text and length as input, and outputs the first length characters."
|
||||
},
|
||||
{
|
||||
"author": "Nlar",
|
||||
"title": "ComfyUI_CartoonSegmentation",
|
||||
"reference": "https://github.com/Nlar/ComfyUI_CartoonSegmentation",
|
||||
"files": [
|
||||
"https://github.com/Nlar/ComfyUI_CartoonSegmentation"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Front end ComfyUI nodes for CartoonSegmentation Based upon the work of the CartoonSegmentation repository this project will provide a front end to some of the features."
|
||||
},
|
||||
{
|
||||
"author": "Acly",
|
||||
"title": "ComfyUI Inpaint Nodes",
|
||||
"reference": "https://github.com/Acly/comfyui-inpaint-nodes",
|
||||
"files": [
|
||||
"https://github.com/Acly/comfyui-inpaint-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Experimental nodes for better inpainting with ComfyUI. Adds two nodes which allow using [a/Fooocus](https://github.com/Acly/comfyui-inpaint-nodes) inpaint model. It's a small and flexible patch which can be applied to any SDXL checkpoint and will transform it into an inpaint model. This model can then be used like other inpaint models, and provides the same benefits. [a/Read more](https://github.com/lllyasviel/Fooocus/discussions/414)"
|
||||
},
|
||||
{
|
||||
"author": "Abdullah Ozmantar",
|
||||
"title": "InstaSwap Face Swap Node for ComfyUI",
|
||||
"reference": "https://github.com/abdozmantar/ComfyUI-InstaSwap",
|
||||
"files": [
|
||||
"https://github.com/abdozmantar/ComfyUI-InstaSwap"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A quick and easy ComfyUI custom nodes for ultra-quality, lightning-speed face swapping of humans."
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI PhotoMaker (ZHO)",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-InstantID",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/InstantID](https://github.com/InstantID/InstantID) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "FlyingFireCo",
|
||||
"title": "tiled_ksampler",
|
||||
"reference": "https://github.com/FlyingFireCo/tiled_ksampler",
|
||||
"files": [
|
||||
"https://github.com/FlyingFireCo/tiled_ksampler"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Tiled KSampler, Asymmetric Tiled KSampler, Circular VAEDecode."
|
||||
},
|
||||
{
|
||||
"author": "abdozmantar",
|
||||
"title": "InstaSwap Face Swap Node for ComfyUI",
|
||||
"reference": "https://github.com/abdozmantar/ComfyUI-InstaSwap",
|
||||
"files": [
|
||||
"https://github.com/abdozmantar/ComfyUI-InstaSwap"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Fastest Face Swap Extension Node for ComfyUI, Single node and FastTrack: Lightning-Speed Facial Transformation for your projects."
|
||||
},
|
||||
{
|
||||
"author": "pkpkTech",
|
||||
"title": "ComfyUI-ngrok",
|
||||
"reference": "https://github.com/pkpkTech/ComfyUI-ngrok",
|
||||
"files": [
|
||||
"https://github.com/pkpkTech/ComfyUI-ngrok"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Use ngrok to allow external access to ComfyUI.\nNOTE: Need to manually modify a token inside the __init__.py file."
|
||||
},
|
||||
{
|
||||
"author": "Daniel Lewis",
|
||||
"title": "ComfyUI-TTS",
|
||||
"reference": "https://github.com/daniel-lewis-ab/ComfyUI-TTS",
|
||||
"files": [
|
||||
"https://github.com/daniel-lewis-ab/ComfyUI-TTS"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Text To Speech (TTS) for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "thecooltechguy",
|
||||
"title": "ComfyUI-ComfyWorkflows",
|
||||
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
|
||||
"files": [
|
||||
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
|
||||
},
|
||||
{
|
||||
"author": "Shraknard",
|
||||
"title": "ComfyUI-Remover",
|
||||
"reference": "https://github.com/Shraknard/ComfyUI-Remover",
|
||||
"files": [
|
||||
"https://github.com/Shraknard/ComfyUI-Remover"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom node for ComfyUI that makes parts of the image transparent (face, background...)"
|
||||
},
|
||||
{
|
||||
"author": "adriflex",
|
||||
"title": "ComfyUI_Blender_Texdiff",
|
||||
"reference": "https://github.com/adriflex/ComfyUI_Blender_Texdiff",
|
||||
"files": [
|
||||
"https://github.com/adriflex/ComfyUI_Blender_Texdiff"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Blender viewport color, Blender Viewport depth"
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-RAFT",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-RAFT",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-RAFT"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is an ComfyUI implementation of RAFT to generate motion brush"
|
||||
},
|
||||
{
|
||||
"author": "DimaChaichan",
|
||||
"title": "LAizypainter-Exporter-ComfyUI",
|
||||
"reference": "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI",
|
||||
"files": [
|
||||
"https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This exporter is a plugin for ComfyUI, which can export tasks for [a/LAizypainter](https://github.com/DimaChaichan/LAizypainter).\nLAizypainter is a Photoshop plugin with which you can send tasks directly to a Stable Diffusion server. More information about a [a/Task](https://github.com/DimaChaichan/LAizypainter?tab=readme-ov-file#task)"
|
||||
},
|
||||
{
|
||||
"author": "Qais Malkawi",
|
||||
"title": "ComfyUI-Qais-Helper",
|
||||
"reference": "https://github.com/QaisMalkawi/ComfyUI-QaisHelper",
|
||||
"files": [
|
||||
"https://github.com/QaisMalkawi/ComfyUI-QaisHelper"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This Extension adds a few custom QOL nodes that ComfyUI lacks by default."
|
||||
},
|
||||
{
|
||||
"author": "longgui0318",
|
||||
"title": "comfyui-mask-util",
|
||||
"reference": "https://github.com/longgui0318/comfyui-mask-util",
|
||||
"files": [
|
||||
"https://github.com/longgui0318/comfyui-mask-util"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Split Masks"
|
||||
},
|
||||
{
|
||||
"author": "shiimizu",
|
||||
"title": "ComfyUI PhotoMaker Plus",
|
||||
"reference": "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus",
|
||||
"files": [
|
||||
"https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI reference implementation for [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) models. [w/WARN:The repository name has been changed. For those who have previously installed it, please delete custom_nodes/ComfyUI-PhotoMaker from disk and reinstall this.]"
|
||||
},
|
||||
{
|
||||
"author": "darkpixel",
|
||||
"title": "DarkPrompts",
|
||||
"reference": "https://github.com/darkpixel/darkprompts",
|
||||
"files": [
|
||||
"https://github.com/darkpixel/darkprompts"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Slightly better random prompt generation tools that allow combining and picking prompts from both file and text input sources."
|
||||
},
|
||||
{
|
||||
"author": "Taremin",
|
||||
"title": "WebUI Monaco Prompt",
|
||||
"reference": "https://github.com/Taremin/webui-monaco-prompt",
|
||||
"files": [
|
||||
"https://github.com/Taremin/webui-monaco-prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Make it possible to edit the prompt using the Monaco Editor, an editor implementation used in VSCode.\nNOTE: This extension supports both ComfyUI and A1111 simultaneously."
|
||||
},
|
||||
{
|
||||
"author": "JcandZero",
|
||||
"title": "ComfyUI_GLM4Node",
|
||||
"reference": "https://github.com/JcandZero/ComfyUI_GLM4Node",
|
||||
"files": [
|
||||
"https://github.com/JcandZero/ComfyUI_GLM4Node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "GLM4 Vision Integration"
|
||||
},
|
||||
{
|
||||
"author": "miosp",
|
||||
"title": "ComfyUI-FBCNN",
|
||||
"reference": "https://github.com/Miosp/ComfyUI-FBCNN",
|
||||
"files": [
|
||||
"https://github.com/Miosp/ComfyUI-FBCNN"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A node for JPEG de-artifacting using [a/FBCNN](https://github.com/jiaxi-jiang/FBCNN)."
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-LightGlue",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-LightGlue",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-LightGlue"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is an ComfyUI implementation of LightGlue to generate motion brush"
|
||||
},
|
||||
{
|
||||
"author": "Mr.ForExample",
|
||||
"title": "ComfyUI-AnimateAnyone-Evolved",
|
||||
"reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved",
|
||||
"files": [
|
||||
"https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]"
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-I2VGEN-XL",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-I2VGEN-XL",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-I2VGEN-XL"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)"
|
||||
},
|
||||
{
|
||||
"author": "Inzaniak",
|
||||
"title": "Ranbooru for ComfyUI",
|
||||
"reference": "https://github.com/Inzaniak/comfyui-ranbooru",
|
||||
"files": [
|
||||
"https://github.com/Inzaniak/comfyui-ranbooru"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of"
|
||||
},
|
||||
{
|
||||
"author": "Taremin",
|
||||
"title": "ComfyUI String Tools",
|
||||
"reference": "https://github.com/Taremin/comfyui-string-tools",
|
||||
"files": [
|
||||
"https://github.com/Taremin/comfyui-string-tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts."
|
||||
},
|
||||
{
|
||||
"author": "dave-palt",
|
||||
"title": "comfyui_DSP_imagehelpers",
|
||||
"reference": "https://github.com/dave-palt/comfyui_DSP_imagehelpers",
|
||||
"files": [
|
||||
"https://github.com/dave-palt/comfyui_DSP_imagehelpers"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: DSP Image Concat"
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-Moore-AnimateAnyone",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: Run python tools/download_weights.py first to download weights automatically"
|
||||
},
|
||||
{
|
||||
"author": "chflame163",
|
||||
"title": "ComfyUI Layer Style",
|
||||
"reference": "https://github.com/chflame163/ComfyUI_LayerStyle",
|
||||
"files": [
|
||||
"https://github.com/chflame163/ComfyUI_LayerStyle"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
|
||||
},
|
||||
{
|
||||
"author": "kijai",
|
||||
"title": "ComfyUI-DDColor",
|
||||
"reference": "https://github.com/kijai/ComfyUI-DDColor",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-DDColor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "prozacgod",
|
||||
"title": "ComfyUI Multi-Workspace",
|
||||
"reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace",
|
||||
"files": [
|
||||
"https://github.com/prozacgod/comfyui-pzc-multiworkspace"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "Siberpone",
|
||||
"title": "Lazy Pony Prompter",
|
||||
"reference": "https://github.com/Siberpone/lazy-pony-prompter",
|
||||
"files": [
|
||||
"https://github.com/Siberpone/lazy-pony-prompter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)."
|
||||
},
|
||||
{
|
||||
"author": "chaojie",
|
||||
"title": "ComfyUI-MotionCtrl-SVD",
|
||||
"reference": "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD",
|
||||
"files": [
|
||||
"https://github.com/chaojie/ComfyUI-MotionCtrl-SVD"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: Download the weights of MotionCtrl-SVD [a/motionctrl_svd.ckpt](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl_svd.ckpt) and put it to ComfyUI/models/checkpoints"
|
||||
},
|
||||
{
|
||||
"author": "JaredTherriault",
|
||||
"title": "ComfyUI-JNodes",
|
||||
"reference": "https://github.com/JaredTherriault/ComfyUI-JNodes",
|
||||
"files": [
|
||||
"https://github.com/JaredTherriault/ComfyUI-JNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]"
|
||||
},
|
||||
{
|
||||
"author": "nkchocoai",
|
||||
"title": "ComfyUI-SizeFromPresets",
|
||||
"reference": "https://github.com/nkchocoai/ComfyUI-SizeFromPresets",
|
||||
"files": [
|
||||
"https://github.com/nkchocoai/ComfyUI-SizeFromPresets"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add a node that outputs width and height of the size selected from the preset (.csv)."
|
||||
},
|
||||
{
|
||||
"author": "HAL41",
|
||||
"title": "ComfyUI aichemy nodes",
|
||||
"reference": "https://github.com/HAL41/ComfyUI-aichemy-nodes",
|
||||
"files": [
|
||||
"https://github.com/HAL41/ComfyUI-aichemy-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple node to handle scaling of YOLOv8 segmentation masks"
|
||||
},
|
||||
{
|
||||
"author": "abyz22",
|
||||
"title": "image_control",
|
||||
"reference": "https://github.com/abyz22/image_control",
|
||||
"files": [
|
||||
"https://github.com/abyz22/image_control"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor. Please check workflow in [a/https://github.com/abyz22/image_control](https://github.com/abyz22/image_control)"
|
||||
},
|
||||
{
|
||||
"author": "foxtrot-roger",
|
||||
"title": "RF Nodes",
|
||||
"reference": "https://github.com/foxtrot-roger/comfyui-rf-nodes",
|
||||
"files": [
|
||||
"https://github.com/foxtrot-roger/comfyui-rf-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps."
|
||||
},
|
||||
{
|
||||
"author": "LarryJane491",
|
||||
"title": "Lora-Training-in-Comfy",
|
||||
"reference": "https://github.com/LarryJane491/Lora-Training-in-Comfy",
|
||||
"files": [
|
||||
"https://github.com/LarryJane491/Lora-Training-in-Comfy"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom node lets you train LoRA directly in ComfyUI! By default, it saves directly in your ComfyUI lora folder. That means you just have to refresh after training (...and select the LoRA) to test it!"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+496
-46
File diff suppressed because it is too large
Load Diff
+239
-305
@@ -1,5 +1,208 @@
|
||||
{
|
||||
"models": [
|
||||
{
|
||||
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
|
||||
"type": "efficient_sam",
|
||||
"base": "efficient_sam",
|
||||
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
|
||||
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
|
||||
"filename": "efficient_sam_s_cpu.jit",
|
||||
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
|
||||
},
|
||||
{
|
||||
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
|
||||
"type": "efficient_sam",
|
||||
"base": "efficient_sam",
|
||||
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
|
||||
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
|
||||
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
|
||||
"filename": "efficient_sam_s_gpu.jit",
|
||||
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
|
||||
"type": "checkpoints",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "checkpoints/Stable-Cascade",
|
||||
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stable_cascade_stage_b.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
|
||||
"type": "checkpoints",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "checkpoints/Stable-Cascade",
|
||||
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stable_cascade_stage_c.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
|
||||
"type": "VAE",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "vae/Stable-Cascade",
|
||||
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "effnet_encoder.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
|
||||
"type": "VAE",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "vae/Stable-Cascade",
|
||||
"description": "[73.7MB] Stable Cascade: stage_a",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_a.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[6.25GB] Stable Cascade: stage_b",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[2.8GB] Stable Cascade: stage_b/lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_lite.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_b_lite_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[14.4GB] Stable Cascade: stage_c",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[4.12GB] Stable Cascade: stage_c/lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_lite.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
|
||||
"type": "unet",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "unet/Stable-Cascade",
|
||||
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "stage_c_lite_bf16.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
|
||||
"type": "clip",
|
||||
"base": "Stable Cascade",
|
||||
"save_path": "clip/Stable-Cascade",
|
||||
"description": "[1.39GB] Stable Cascade: text_encoder",
|
||||
"reference": "https://huggingface.co/stabilityai/stable-cascade",
|
||||
"filename": "model.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "1k3d68.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "1k3d68.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx"
|
||||
},
|
||||
{
|
||||
"name": "2d106det.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "2d106det.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx"
|
||||
},
|
||||
{
|
||||
"name": "genderage.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "genderage.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx"
|
||||
},
|
||||
{
|
||||
"name": "glintr100.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "glintr100.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx"
|
||||
},
|
||||
{
|
||||
"name": "scrfd_10g_bnkps.onnx",
|
||||
"type": "insightface",
|
||||
"base": "inswapper",
|
||||
"save_path": "insightface/models/antelopev2",
|
||||
"description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
|
||||
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
|
||||
"filename": "scrfd_10g_bnkps.onnx",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "photomaker-v1.bin",
|
||||
"type": "photomaker",
|
||||
@@ -175,11 +378,11 @@
|
||||
},
|
||||
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
|
||||
@@ -258,21 +461,21 @@
|
||||
"url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_32_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
|
||||
"filename": "lt_long_mm_16_64_frames.ckpt",
|
||||
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
|
||||
@@ -420,363 +623,94 @@
|
||||
},
|
||||
|
||||
{
|
||||
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "animatediff",
|
||||
"base": "SDXL",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sdxl_v10_beta.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanLeft.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_PanRight.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingAnticlockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_RollingClockwise.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltDown.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_TiltUp.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomIn.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
|
||||
"type": "motion lora",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"save_path": "animatediff_motion_lora",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "v2_lora_ZoomOut.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "CiaraRowles/TemporalNet1XL (1.0)",
|
||||
"type": "controlnet",
|
||||
"base": "SD1.5",
|
||||
"save_path": "controlnet/TemporalNet1XL",
|
||||
"description": "This is TemporalNet1XL, it is a re-train of the controlnet TemporalNet1 with Stable Diffusion XL.",
|
||||
"reference": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0",
|
||||
"filename": "diffusion_pytorch_model.safetensors",
|
||||
"url": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "LCM LoRA SD1.5",
|
||||
"type": "lora",
|
||||
"base": "SD1.5",
|
||||
"save_path": "loras/lcm/SD1.5",
|
||||
"description": "Latent Consistency LoRA for SD1.5",
|
||||
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5",
|
||||
"filename": "pytorch_lora_weights.safetensors",
|
||||
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/resolve/main/pytorch_lora_weights.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "LCM LoRA SSD-1B",
|
||||
"type": "lora",
|
||||
"base": "SSD-1B",
|
||||
"save_path": "loras/lcm/SSD-1B",
|
||||
"description": "Latent Consistency LoRA for SSD-1B",
|
||||
"reference": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b",
|
||||
"filename": "pytorch_lora_weights.safetensors",
|
||||
"url": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b/resolve/main/pytorch_lora_weights.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "LCM LoRA SDXL",
|
||||
"type": "lora",
|
||||
"base": "SSD-1B",
|
||||
"save_path": "loras/lcm/SDXL",
|
||||
"description": "Latent Consistency LoRA for SDXL",
|
||||
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdxl",
|
||||
"filename": "pytorch_lora_weights.safetensors",
|
||||
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdxl/resolve/main/pytorch_lora_weights.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "face_yolov8m-seg_60.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "face_yolov8m-seg_60.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8m-seg_60.pt"
|
||||
},
|
||||
{
|
||||
"name": "face_yolov8n-seg2_60.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "face_yolov8n-seg2_60.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8n-seg2_60.pt"
|
||||
},
|
||||
{
|
||||
"name": "hair_yolov8n-seg_60.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "hair_yolov8n-seg_60.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/hair_yolov8n-seg_60.pt"
|
||||
},
|
||||
{
|
||||
"name": "skin_yolov8m-seg_400.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "skin_yolov8m-seg_400.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8m-seg_400.pt"
|
||||
},
|
||||
{
|
||||
"name": "skin_yolov8n-seg_400.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "skin_yolov8n-seg_400.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_400.pt"
|
||||
},
|
||||
{
|
||||
"name": "skin_yolov8n-seg_800.pt (segm)",
|
||||
"type": "Ultralytics",
|
||||
"base": "Ultralytics",
|
||||
"save_path": "ultralytics/segm",
|
||||
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
|
||||
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
|
||||
"filename": "skin_yolov8n-seg_800.pt",
|
||||
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_800.pt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
|
||||
"filename": "temporaldiff-v1-animatediff.ckpt",
|
||||
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/guoyww/animatediff",
|
||||
"filename": "mm_sd_v15_v2.ckpt",
|
||||
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_high.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
|
||||
},
|
||||
{
|
||||
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved)",
|
||||
"type": "animatediff",
|
||||
"base": "SD1.x",
|
||||
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
|
||||
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
|
||||
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
|
||||
"filename": "mm-Stabilized_mid.pth",
|
||||
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "GFPGANv1.4.pth",
|
||||
"type": "GFPGAN",
|
||||
"base": "GFPGAN",
|
||||
"save_path": "facerestore_models",
|
||||
"description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/TencentARC/GFPGAN/releases",
|
||||
"filename": "GFPGANv1.4.pth",
|
||||
"url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth"
|
||||
},
|
||||
{
|
||||
"name": "codeformer.pth",
|
||||
"type": "CodeFormer",
|
||||
"base": "CodeFormer",
|
||||
"save_path": "facerestore_models",
|
||||
"description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/sczhou/CodeFormer/releases",
|
||||
"filename": "codeformer.pth",
|
||||
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth"
|
||||
},
|
||||
{
|
||||
"name": "detection_Resnet50_Final.pth",
|
||||
"type": "facexlib",
|
||||
"base": "facexlib",
|
||||
"save_path": "facerestore_models",
|
||||
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/xinntao/facexlib",
|
||||
"filename": "detection_Resnet50_Final.pth",
|
||||
"url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth"
|
||||
},
|
||||
{
|
||||
"name": "detection_mobilenet0.25_Final.pth",
|
||||
"type": "facexlib",
|
||||
"base": "facexlib",
|
||||
"save_path": "facerestore_models",
|
||||
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/xinntao/facexlib",
|
||||
"filename": "detection_mobilenet0.25_Final.pth",
|
||||
"url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_mobilenet0.25_Final.pth"
|
||||
},
|
||||
{
|
||||
"name": "yolov5l-face.pth",
|
||||
"type": "facexlib",
|
||||
"base": "facexlib",
|
||||
"save_path": "facedetection",
|
||||
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/xinntao/facexlib",
|
||||
"filename": "yolov5l-face.pth",
|
||||
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5l-face.pth"
|
||||
},
|
||||
{
|
||||
"name": "yolov5n-face.pth",
|
||||
"type": "facexlib",
|
||||
"base": "facexlib",
|
||||
"save_path": "facedetection",
|
||||
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
|
||||
"reference": "https://github.com/xinntao/facexlib",
|
||||
"filename": "yolov5n-face.pth",
|
||||
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5n-face.pth"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET/fp16)",
|
||||
"type": "unet",
|
||||
"base": "SDXL",
|
||||
"save_path": "unet/xl-inpaint-0.1",
|
||||
"description": "[5.14GB] Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
|
||||
"reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
|
||||
"filename": "diffusion_pytorch_model.fp16.safetensors",
|
||||
"url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET)",
|
||||
"type": "unet",
|
||||
"base": "SDXL",
|
||||
"save_path": "unet/xl-inpaint-0.1",
|
||||
"description": "[10.3GB] Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
|
||||
"reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
|
||||
"filename": "diffusion_pytorch_model.safetensors",
|
||||
"url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "Inswapper (face swap)",
|
||||
"type": "insightface",
|
||||
"base" : "inswapper",
|
||||
"save_path": "insightface",
|
||||
"description": "Checkpoint of the insightface swapper model (used by Comfy-Roop and comfy_mtb)",
|
||||
"reference": "https://huggingface.co/deepinsight/inswapper/",
|
||||
"filename": "inswapper_128.onnx",
|
||||
"url": "https://huggingface.co/deepinsight/inswapper/resolve/main/inswapper_128.onnx"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "CLIPVision model (stabilityai/clip_vision_g)",
|
||||
"type": "clip_vision",
|
||||
"base": "vit-g",
|
||||
"save_path": "clip_vision",
|
||||
"description": "[3.69GB] clip_g vision model",
|
||||
"reference": "https://huggingface.co/stabilityai/control-lora",
|
||||
"filename": "clip_vision_g.safetensors",
|
||||
"url": "https://huggingface.co/stabilityai/control-lora/resolve/main/revision/clip_vision_g.safetensors"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "CLIPVision model (IP-Adapter) CLIP-ViT-H-14-laion2B-s32B-b79K",
|
||||
"type": "clip_vision",
|
||||
"base": "ViT-H",
|
||||
"save_path": "clip_vision",
|
||||
"description": "[2.5GB] CLIPVision model (needed for IP-Adapter)",
|
||||
"reference": "https://huggingface.co/h94/IP-Adapter",
|
||||
"filename": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors",
|
||||
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/image_encoder/model.safetensors"
|
||||
},
|
||||
{
|
||||
"name": "CLIPVision model (IP-Adapter) CLIP-ViT-bigG-14-laion2B-39B-b160k",
|
||||
"type": "clip_vision",
|
||||
"base": "ViT-G",
|
||||
"save_path": "clip_vision",
|
||||
"description": "[3.69GB] CLIPVision model (needed for IP-Adapter)",
|
||||
"reference": "https://huggingface.co/h94/IP-Adapter",
|
||||
"filename": "CLIP-ViT-bigG-14-laion2B-39B-b160k.safetensors",
|
||||
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/image_encoder/model.safetensors"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+20
@@ -99,6 +99,26 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Load Image Dedup"
|
||||
},
|
||||
{
|
||||
"author": "IvanRybakov",
|
||||
"title": "comfyui-node-int-to-string-convertor",
|
||||
"reference": "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor",
|
||||
"files": [
|
||||
"https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Int To String Convertor"
|
||||
},
|
||||
{
|
||||
"author": "yowipr",
|
||||
"title": "ComfyUI-Manual",
|
||||
"reference": "https://github.com/yowipr/ComfyUI-Manual",
|
||||
"files": [
|
||||
"https://github.com/yowipr/ComfyUI-Manual"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:M_Layer, M_Output"
|
||||
}
|
||||
]
|
||||
}
|
||||
+11
-9
@@ -3,6 +3,8 @@ import torch
|
||||
|
||||
import comfy.utils
|
||||
|
||||
from .utils import BIGMIN, BIGMAX
|
||||
|
||||
|
||||
class MergeStrategies:
|
||||
MATCH_A = "match A"
|
||||
@@ -36,7 +38,7 @@ class SplitLatents:
|
||||
return {
|
||||
"required": {
|
||||
"latents": ("LATENT",),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -61,7 +63,7 @@ class SplitImages:
|
||||
return {
|
||||
"required": {
|
||||
"images": ("IMAGE",),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -83,7 +85,7 @@ class SplitMasks:
|
||||
return {
|
||||
"required": {
|
||||
"mask": ("MASK",),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}),
|
||||
"split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -258,7 +260,7 @@ class SelectEveryNthLatent:
|
||||
return {
|
||||
"required": {
|
||||
"latents": ("LATENT",),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -279,7 +281,7 @@ class SelectEveryNthImage:
|
||||
return {
|
||||
"required": {
|
||||
"images": ("IMAGE",),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -300,7 +302,7 @@ class SelectEveryNthMask:
|
||||
return {
|
||||
"required": {
|
||||
"mask": ("MASK",),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}),
|
||||
"select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -378,7 +380,7 @@ class DuplicateLatents:
|
||||
return {
|
||||
"required": {
|
||||
"latents": ("LATENT",),
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1})
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -403,7 +405,7 @@ class DuplicateImages:
|
||||
return {
|
||||
"required": {
|
||||
"images": ("IMAGE",),
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1})
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,7 +429,7 @@ class DuplicateMasks:
|
||||
return {
|
||||
"required": {
|
||||
"mask": ("MASK",),
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1})
|
||||
"multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user