Skip to content

Commit 6da8b94

Browse files
patrickvonplatenJimmy
authored andcommitted
[Bug fix] Make sure correct timesteps are chosen for img2img (huggingface#3128)
Make sure correct timesteps are chosen for img2img
1 parent 28b5e10 commit 6da8b94

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

src/diffusers/pipelines/alt_diffusion/pipeline_alt_diffusion_img2img.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def get_timesteps(self, num_inference_steps, strength, device):
503503
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
504504

505505
t_start = max(num_inference_steps - init_timestep, 0)
506-
timesteps = self.scheduler.timesteps[t_start:]
506+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
507507

508508
return timesteps, num_inference_steps - t_start
509509

src/diffusers/pipelines/stable_diffusion/pipeline_cycle_diffusion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ def get_timesteps(self, num_inference_steps, strength, device):
528528
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
529529

530530
t_start = max(num_inference_steps - init_timestep, 0)
531-
timesteps = self.scheduler.timesteps[t_start:]
531+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
532532

533533
return timesteps, num_inference_steps - t_start
534534

src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def get_timesteps(self, num_inference_steps, strength, device):
390390
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
391391

392392
t_start = max(num_inference_steps - init_timestep, 0)
393-
timesteps = self.scheduler.timesteps[t_start:]
393+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
394394

395395
return timesteps, num_inference_steps - t_start
396396

src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ def get_timesteps(self, num_inference_steps, strength, device):
511511
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
512512

513513
t_start = max(num_inference_steps - init_timestep, 0)
514-
timesteps = self.scheduler.timesteps[t_start:]
514+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
515515

516516
return timesteps, num_inference_steps - t_start
517517

src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint_legacy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ def get_timesteps(self, num_inference_steps, strength, device):
507507
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
508508

509509
t_start = max(num_inference_steps - init_timestep, 0)
510-
timesteps = self.scheduler.timesteps[t_start:]
510+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
511511

512512
return timesteps, num_inference_steps - t_start
513513

tests/pipelines/stable_diffusion/test_stable_diffusion_img2img.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
AutoencoderKL,
2626
DDIMScheduler,
2727
DPMSolverMultistepScheduler,
28+
HeunDiscreteScheduler,
2829
LMSDiscreteScheduler,
2930
PNDMScheduler,
3031
StableDiffusionImg2ImgPipeline,
@@ -416,6 +417,33 @@ def test_stable_diffusion_pipeline_with_model_offloading(self):
416417
for module in pipe.text_encoder, pipe.unet, pipe.vae:
417418
assert module.device == torch.device("cpu")
418419

420+
def test_img2img_2nd_order(self):
421+
sd_pipe = StableDiffusionImg2ImgPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
422+
sd_pipe.scheduler = HeunDiscreteScheduler.from_config(sd_pipe.scheduler.config)
423+
sd_pipe.to(torch_device)
424+
sd_pipe.set_progress_bar_config(disable=None)
425+
426+
inputs = self.get_inputs(torch_device)
427+
inputs["num_inference_steps"] = 10
428+
inputs["strength"] = 0.75
429+
image = sd_pipe(**inputs).images[0]
430+
431+
expected_image = load_numpy(
432+
"https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/img2img/img2img_heun.npy"
433+
)
434+
max_diff = np.abs(expected_image - image).max()
435+
assert max_diff < 5e-2
436+
437+
inputs = self.get_inputs(torch_device)
438+
inputs["num_inference_steps"] = 11
439+
inputs["strength"] = 0.75
440+
image_other = sd_pipe(**inputs).images[0]
441+
442+
mean_diff = np.abs(image - image_other).mean()
443+
444+
# images should be very similar
445+
assert mean_diff < 5e-2
446+
419447
def test_stable_diffusion_img2img_pipeline_multiple_of_8(self):
420448
init_image = load_image(
421449
"https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"

0 commit comments

Comments
 (0)