sphinxsolution's picture
Locally working code
c24af23 verified
Raw History Blame Contribute Delete
2.04 kB
import torch
from diffusers import StableDiffusionInpaintPipeline
import gradio as gr
from PIL import Image
import numpy as np
# Ensure we use GPU if available
device = "cuda" if torch.cuda.is_available() else "cpu"
def load_model():
"""Load Stable Diffusion 2 Inpainting model."""
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-inpainting",
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
).to(device)
return pipe
pipe = load_model()
def inpaint(image_editor_output, prompt):
"""Perform inpainting using the uploaded image and mask."""
print(f"image_editor_output:{image_editor_output}")
if not isinstance(image_editor_output, dict) or "background" not in image_editor_output or "layers" not in image_editor_output:
raise ValueError("Invalid input. Please upload an image and paint a mask.")
# Extract the base image (background or composite)
image = Image.fromarray(image_editor_output["composite"]).convert("RGB") # Ensure image is in RGB format
# Extract the first layer (mask) and convert to grayscale
mask_array = np.array(image_editor_output["layers"][0], dtype=np.uint8)
mask = Image.fromarray(mask_array[:, :, 3]).convert("L") # Use the alpha channel
# Resize mask to match image size if needed
if mask.size != image.size:
mask = mask.resize(image.size, Image.LANCZOS)
# Perform inpainting
result = pipe(prompt=prompt, image=image, mask_image=mask).images[0]
return result
# Gradio UI with ImageEditor for inpainting
demo = gr.Interface(
fn=inpaint,
inputs=[
gr.ImageEditor(label="Upload & Paint Image (White areas will be inpainted)"),
gr.Textbox(label="Prompt for Inpainting"),
],
outputs=gr.Image(type="pil", label="Generated Image"),
title="Stable Diffusion 2 Inpainting",
description="Upload an image, paint directly on it to define mask areas, and provide a text prompt.",
)
demo.launch()