|
|
|
# code adapted from https://github.com/exx8/differential-diffusion
|
|
|
|
|
|
|
|
import torch
|
|
|
|
|
|
|
|
class DifferentialDiffusion():
|
|
|
|
@classmethod
|
|
|
|
def INPUT_TYPES(s):
|
|
|
|
return {"required": {"model": ("MODEL", ),
|
|
|
|
}}
|
|
|
|
RETURN_TYPES = ("MODEL",)
|
|
|
|
FUNCTION = "apply"
|
|
|
|
CATEGORY = "_for_testing"
|
|
|
|
INIT = False
|
|
|
|
|
|
|
|
def apply(self, model):
|
|
|
|
model = model.clone()
|
|
|
|
model.set_model_denoise_mask_function(self.forward)
|
|
|
|
return (model,)
|
|
|
|
|
|
|
|
def forward(self, sigma: torch.Tensor, denoise_mask: torch.Tensor, extra_options: dict):
|
|
|
|
model = extra_options["model"]
|
|
|
|
step_sigmas = extra_options["sigmas"]
|
|
|
|
sigma_to = model.inner_model.model_sampling.sigma_min
|
|
|
|
if step_sigmas[-1] > sigma_to:
|
|
|
|
sigma_to = step_sigmas[-1]
|
|
|
|
sigma_from = step_sigmas[0]
|
|
|
|
|
|
|
|
ts_from = model.inner_model.model_sampling.timestep(sigma_from)
|
|
|
|
ts_to = model.inner_model.model_sampling.timestep(sigma_to)
|
|
|
|
current_ts = model.inner_model.model_sampling.timestep(sigma)
|
|
|
|
|
|
|
|
threshold = (current_ts - ts_to) / (ts_from - ts_to)
|
|
|
|
|
|
|
|
return (denoise_mask >= threshold).to(denoise_mask.dtype)
|
|
|
|
|
|
|
|
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
|
|
"DifferentialDiffusion": DifferentialDiffusion,
|
|
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
|
|
"DifferentialDiffusion": "Differential Diffusion",
|
|
|
|
}
|