comfy-diffuser / app.py
hermanda's picture
Create app.py
3b3ffae verified
import torch
import gradio as gr
from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel, EulerDiscreteScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
# Initialize model and pipeline once at startup
base = "stabilityai/stable-diffusion-xl-base-1.0"
repo = "ByteDance/SDXL-Lightning"
ckpt = "sdxl_lightning_4step_unet.safetensors"
# Load model with float32 precision for CPU compatibility
unet = UNet2DConditionModel.from_config(base, subfolder="unet").to(torch.float32)
unet.load_state_dict(load_file(hf_hub_download(repo, ckpt), device="cpu"))
# Create pipeline with CPU configuration
pipe = StableDiffusionXLPipeline.from_pretrained(
base,
unet=unet,
torch_dtype=torch.float32
).to("cpu")
# Configure scheduler
pipe.scheduler = EulerDiscreteScheduler.from_config(
pipe.scheduler.config,
timestep_spacing="trailing"
)
# Expanded list of predefined elements
elements_list = [
"Kittens", "Tea", "Home", "Snow", "Young Girl", "Stars",
"Blanket", "Books", "Candles", "Flowers", "Moon", "Cookies",
"Fireplace", "Pillows", "Mittens", "Lanterns", "Socks",
"Hot Chocolate", "Snowflakes", "Winter Scarf", "Marshmallows",
"Vintage Clock", "Knitted Sweater", "Fairy Lights", "Porcelain Cup"
]
def generate_image(custom_text, elements, steps):
"""Generate image using the provided text, selected elements, and steps"""
# Construct the prompt
prompt_parts = []
if custom_text.strip():
prompt_parts.append(custom_text)
if elements:
prompt_parts.append(", ".join(elements))
prompt = ", ".join(prompt_parts) or "a beautiful image"
image = pipe(
prompt,
num_inference_steps=int(steps),
guidance_scale=0,
width=768,
height=960
).images[0]
return image
# Create Gradio interface
with gr.Blocks(title="Good Night Image Diffuser") as demo:
gr.Markdown("# 🌙 Generate Good Night Wish Images")
gr.Markdown("Create personalized good night images with your message and favorite elements!")
with gr.Row():
with gr.Column(scale=1):
custom_text = gr.Textbox(
label="Your Message",
value="Create a cozy and heartwarming scene. Use a warm, pastel color palette with soft shadows and subtle textures to evoke comfort and nostalgia. Additional elements to include:",
max_lines=3
)
elements = gr.CheckboxGroup(
label="Image Elements",
choices=elements_list,
value=["Kittens", "Moon"],
info="Select elements to include in your image"
)
steps_slider = gr.Slider(
label="Number of Inference Steps",
minimum=1,
maximum=8,
value=4,
step=2,
info="Adjust the number of denoising steps (more steps can improve quality but take longer)"
)
generate_btn = gr.Button("✨ Generate Image", variant="primary")
with gr.Column(scale=1):
output_image = gr.Image(
label="Generated Image",
width=768,
height=960,
elem_id="output-image"
)
# Connect components
generate_btn.click(
fn=generate_image,
inputs=[custom_text, elements, steps_slider],
outputs=output_image,
api_name="generate"
)
if __name__ == "__main__":
demo.launch()