SDXL2 / app.py
Jagrut Thakare
v1
238009c
import gradio as gr
import numpy as np
import torch
import logging
import os
import cv2
from huggingface_hub import login
from diffusers import AutoPipelineForInpainting, UNet2DConditionModel
import diffusers
import spaces # type: ignore
from PIL import Image
login(os.getenv("HF_TOKEN"))
device = "cuda" if torch.cuda.is_available() else "cpu"
pipe = AutoPipelineForInpainting.from_pretrained("diffusers/stable-diffusion-xl-1.0-inpainting-0.1", torch_dtype=torch.float16, variant="fp16").to(device, dtype=torch.float16)
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@spaces.GPU()
def predict(image, mask=None, positive_prompt="", negative_prompt=None, guidance_scale=7.5, steps=20, strength=1.0, scheduler="EulerDiscreteScheduler"):
try:
logging.info("Starting inpainting process")
scheduler_parts = scheduler.split("-")
scheduler_class_name = scheduler_parts[0]
add_kwargs = {}
if len(scheduler_parts) > 1:
add_kwargs["use_karras"] = True
if len(scheduler_parts) > 2:
add_kwargs["algorithm_type"] = "sde-dpmsolver++"
logging.info(f"Using scheduler: {scheduler_class_name} with args {add_kwargs}")
scheduler_cls = getattr(diffusers, scheduler_class_name)
source_image = Image.fromarray(image["background"]).convert("RGB")
if np.unique(mask["background"]).size == 1:
alpha_channel = image["layers"][0][:, :, 3]
mask = np.where(alpha_channel == 255,255,0).astype(np.uint8)
mask_4ch = np.stack([mask] * 4, axis=2)
mask_image = Image.fromarray(mask_4ch)
logging.info(f"Mask was not uploaded")
else :
mask_image = Image.fromarray(mask["background"]).convert("RGBA")
print(type(mask["background"]))
print("Value of Mask : ", mask)
print("Value of Mask : ", mask["background"])
logging.info(f"Mask was uploaded")
logging.info("Converted images to required formats")
# Set the scheduler
pipe.scheduler = scheduler_cls.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler", **add_kwargs)
logging.info("Scheduler set successfully")
h = (source_image.height//8) * 8
w = (source_image.width//8) * 8
# Run the inpainting model
output = pipe(
prompt=positive_prompt,
negative_prompt=negative_prompt,
image=source_image,
height=h,
width=w,
mask_image=mask_image,
guidance_scale=guidance_scale,
num_inference_steps=int(steps),
strength=strength
)
logging.info("Model inference completed successfully")
return output.images[0], mask_image
except Exception as e:
logging.error(f"Error occurred: {str(e)}", exc_info=True)
return None
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
image = gr.ImageMask(
type="numpy", label="Input Image", layers=False
)
with gr.Row():
positive_prompt = gr.Textbox(placeholder="Your prompt", label="Positive Prompt")
negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="What you don't want to see in the image")
with gr.Row():
btn = gr.Button("Inpaint")
with gr.Accordion(label="Advanced Settings", open=False):
with gr.Row():
guidance_scale = gr.Number(value=7.5, minimum=1.0, maximum=20.0, step=0.1, label="Guidance Scale")
steps = gr.Number(value=50, minimum=10, maximum=100, step=1, label="Steps")
strength = gr.Number(value=0.80, minimum=0.01, maximum=1.0, step=0.01, label="Strength")
with gr.Row():
schedulers = ["DEISMultistepScheduler", "HeunDiscreteScheduler", "EulerDiscreteScheduler", "DPMSolverMultistepScheduler", "DPMSolverMultistepScheduler-Karras", "DPMSolverMultistepScheduler-Karras-SDE"]
scheduler = gr.Dropdown(label="Schedulers", choices=schedulers, value="DPMSolverMultistepScheduler-Karras-SDE")
with gr.Row():
mask = gr.ImageMask(label="Mask", format="png", value=None, sources=["upload"])
mask_image = gr.Image(label="Mask Image", format="png")
with gr.Column():
image_out = gr.Image(label="Output", format="png")
btn.click(fn=predict, inputs=[image, mask, positive_prompt, negative_prompt, guidance_scale, steps, strength, scheduler], outputs=[image_out, mask_image])
demo.launch(debug=True,show_error=True)