|
| 1 | +from tqdm import trange |
1 | 2 | import comfy.samplers
|
2 | 3 | import torch
|
3 | 4 | import comfy.k_diffusion.sampling
|
| 5 | +import comfy.sample |
4 | 6 |
|
5 | 7 | from ..utils.injection_utils import get_blank_injection_dict, clear_injections, update_injections
|
6 | 8 | from ..utils.flow_noise import create_noise_generator
|
7 | 9 |
|
8 | 10 |
|
| 11 | +@torch.no_grad() |
| 12 | +def sample_inversed_euler(model, x, sigmas, extra_args=None, callback=None, disable=None, s_churn=0., s_tmin=0., s_tmax=float('inf'), s_noise=1.): |
| 13 | + """Implements Algorithm 2 (Euler steps) from Karras et al. (2022).""" |
| 14 | + extra_args = {} if extra_args is None else extra_args |
| 15 | + s_in = x.new_ones([x.shape[0]]) |
| 16 | + latents = [] |
| 17 | + for i in trange(1, len(sigmas), disable=disable): |
| 18 | + sigma_in = sigmas[i-1] |
| 19 | + |
| 20 | + if i == 1: |
| 21 | + sigma_t = sigmas[i] |
| 22 | + else: |
| 23 | + sigma_t = sigma_in |
| 24 | + |
| 25 | + denoised = model(x, sigma_t * s_in, **extra_args) |
| 26 | + |
| 27 | + if i == 1: |
| 28 | + d = (x - denoised) / (2 * sigmas[i]) |
| 29 | + else: |
| 30 | + d = (x - denoised) / sigmas[i-1] |
| 31 | + |
| 32 | + dt = sigmas[i] - sigmas[i-1] |
| 33 | + x = x + d * dt |
| 34 | + if callback is not None: |
| 35 | + callback( |
| 36 | + {'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) |
| 37 | + |
| 38 | + return x / sigmas[-1] |
| 39 | + |
| 40 | + |
9 | 41 | class UnsamplerFlattenNode:
|
10 | 42 | @classmethod
|
11 | 43 | def INPUT_TYPES(s):
|
@@ -71,15 +103,21 @@ def save_injections_handler(context_start):
|
71 | 103 |
|
72 | 104 | noise_mask = None
|
73 | 105 | if "noise_mask" in latent:
|
74 |
| - noise_mask = comfy.sample.prepare_mask( |
75 |
| - latent["noise_mask"], latent_image.shape, device) |
| 106 | + noise_mask = latent["noise_mask"] |
76 | 107 |
|
77 | 108 | # SETUP SAMPLING
|
| 109 | + inversed_euler = sampler_name == 'inverse_euler' |
| 110 | + if inversed_euler: |
| 111 | + sampler_name = 'euler' |
78 | 112 | sampler = comfy.samplers.KSampler(model, steps=steps, device=device, sampler=sampler_name,
|
79 | 113 | scheduler=scheduler, denoise=1.0, model_options=model.model_options)
|
80 | 114 | ksampler = comfy.samplers.ksampler(sampler_name)
|
81 | 115 |
|
82 |
| - sigmas = sigmas = sampler.sigmas.flip(0) + 0.0001 |
| 116 | + if inversed_euler: |
| 117 | + ksampler.sampler_function = sample_inversed_euler |
| 118 | + sigmas = sampler.sigmas.flip(0) |
| 119 | + else: |
| 120 | + sigmas = sampler.sigmas.flip(0) + 0.0001 |
83 | 121 |
|
84 | 122 | pbar = comfy.utils.ProgressBar(steps)
|
85 | 123 |
|
|
0 commit comments