Description
Describe the bug
SD inpainting works fine only if mask is absolutely perfect.
Otherwise, there are always visible seams at the edge of the mask, and uneven colors between inpainted and input image.
I've tried manually assembling latents and using them for image
and mask_image
instead of images as well as manually assembling entire masked_image_latent
- results are the same so i left reproduction as simple as possible.
Same behavior is visible in SD and SD-XL pipelines, using base model as well as dedicated inpainting models.
Non-diffuser inpainting implementations such as legacy A1111 implementation does not have this issue.
i've attached a very simple reproduction code that
- generates image
- creates mask as a square in the middle of the image.
- runs inpainting pipeline
Reproduction
import torch
import diffusers
from PIL import Image
model = '/mnt/f/Models/stable-diffusion/cyan-2.5d-v1.safetensors'
pipe0 = diffusers.StableDiffusionPipeline.from_single_file(model).to('cuda')
print(pipe0.__class__.__name__)
base = pipe0('seashore').images[0]
print(base)
mask = Image.new('L', base.size, 0)
square = Image.new('L', (base.size[0]//2, base.size[1]//2), 255)
mask.paste(square, (base.size[0]//4, base.size[1]//4))
print(mask)
pipe1 = diffusers.AutoPipelineForInpainting.from_pipe(pipe0).to('cuda')
print(pipe1.__class__.__name__)
inpaint = pipe1('house', image=base, mask_image=mask, strength=0.75).images[0]
print(inpaint)
base.save('base.png')
mask.save('mask.png')
inpaint.save('inpaint.png')
Logs
No response
System Info
diffusers==0.23.0
Who can help?
@patrickvonplaten @yiyixuxu @DN6 @sayakpaul
Examples
note: issue was originally reported at vladmandic/sdnext#2501 which you can check for additional examples.