Spaces:
Running
on
Zero
Running
on
Zero
Update pipelines/pipeline_seesr.py
Browse files- pipelines/pipeline_seesr.py +37 -4
pipelines/pipeline_seesr.py
CHANGED
@@ -778,7 +778,6 @@ class StableDiffusionControlNetPipeline(DiffusionPipeline, TextualInversionLoade
|
|
778 |
return torch.tile(torch.tensor(weights, device=self.device), (nbatches, self.unet.config.in_channels, 1, 1))
|
779 |
|
780 |
@perfcount
|
781 |
-
@torch.no_grad()
|
782 |
@replace_example_docstring(EXAMPLE_DOC_STRING)
|
783 |
def __call__(
|
784 |
self,
|
@@ -808,7 +807,8 @@ class StableDiffusionControlNetPipeline(DiffusionPipeline, TextualInversionLoade
|
|
808 |
ram_encoder_hidden_states=None,
|
809 |
latent_tiled_size=320,
|
810 |
latent_tiled_overlap=4,
|
811 |
-
|
|
|
812 |
):
|
813 |
r"""
|
814 |
Function invoked when calling the pipeline for generation.
|
@@ -996,6 +996,9 @@ class StableDiffusionControlNetPipeline(DiffusionPipeline, TextualInversionLoade
|
|
996 |
# 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline
|
997 |
extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta)
|
998 |
|
|
|
|
|
|
|
999 |
# 8. Denoising loop
|
1000 |
num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order
|
1001 |
with self.progress_bar(total=num_inference_steps) as progress_bar:
|
@@ -1183,9 +1186,39 @@ class StableDiffusionControlNetPipeline(DiffusionPipeline, TextualInversionLoade
|
|
1183 |
noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
|
1184 |
|
1185 |
|
|
|
1186 |
|
1187 |
-
|
1188 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1189 |
|
1190 |
# call the callback, if provided
|
1191 |
if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0):
|
|
|
778 |
return torch.tile(torch.tensor(weights, device=self.device), (nbatches, self.unet.config.in_channels, 1, 1))
|
779 |
|
780 |
@perfcount
|
|
|
781 |
@replace_example_docstring(EXAMPLE_DOC_STRING)
|
782 |
def __call__(
|
783 |
self,
|
|
|
807 |
ram_encoder_hidden_states=None,
|
808 |
latent_tiled_size=320,
|
809 |
latent_tiled_overlap=4,
|
810 |
+
use_KDS=True,
|
811 |
+
args=None,
|
812 |
):
|
813 |
r"""
|
814 |
Function invoked when calling the pipeline for generation.
|
|
|
996 |
# 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline
|
997 |
extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta)
|
998 |
|
999 |
+
if use_KDS:
|
1000 |
+
latents.requires_grad_(True)
|
1001 |
+
|
1002 |
# 8. Denoising loop
|
1003 |
num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order
|
1004 |
with self.progress_bar(total=num_inference_steps) as progress_bar:
|
|
|
1186 |
noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
|
1187 |
|
1188 |
|
1189 |
+
if use_KDS:
|
1190 |
|
1191 |
+
# 2) Compute x₀ prediction
|
1192 |
+
beta_t = 1 - self.scheduler.alphas_cumprod[t]
|
1193 |
+
alpha_t = self.scheduler.alphas_cumprod[t].sqrt()
|
1194 |
+
sigma_t = beta_t.sqrt()
|
1195 |
+
x0_pred = (latents - sigma_t * noise_pred) / alpha_t
|
1196 |
+
|
1197 |
+
# 3) Apply KDE steering
|
1198 |
+
m_shift = kde_grad(x0_pred)
|
1199 |
+
delta_t = gamma_0 * (1 - i / (len(timesteps_tensor) - 1))
|
1200 |
+
x0_steer = x0_pred + delta_t * m_shift
|
1201 |
+
|
1202 |
+
# 4) Recompute “noise” for DDIM step
|
1203 |
+
noise_pred_kds = (latents - alpha_t * x0_steer) / sigma_t
|
1204 |
+
|
1205 |
+
# 5) Determine prev alphas
|
1206 |
+
if i < len(timesteps_tensor) - 1:
|
1207 |
+
next_t = timesteps_tensor[i + 1]
|
1208 |
+
alpha_prev = self.scheduler.alphas_cumprod[next_t].sqrt()
|
1209 |
+
else:
|
1210 |
+
alpha_prev = self.scheduler.final_alpha_cumprod.sqrt()
|
1211 |
+
|
1212 |
+
sigma_prev = (1 - alpha_prev**2).sqrt()
|
1213 |
+
|
1214 |
+
# 6) Form next latent per DDIM
|
1215 |
+
latents = (
|
1216 |
+
alpha_prev * x0_steer
|
1217 |
+
+ sigma_prev * noise_pred_kds
|
1218 |
+
).detach().requires_grad_(True)
|
1219 |
+
else:
|
1220 |
+
# compute the previous noisy sample x_t -> x_t-1
|
1221 |
+
latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0].requires_grad_(False)
|
1222 |
|
1223 |
# call the callback, if provided
|
1224 |
if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0):
|