SmilingTree's picture
Create app.py
2486a6e verified
Raw
History Blame Contribute Delete
3.91 kB
import gradio as gr
import numpy as np
import random
from diffusers import DiffusionPipeline
from rembg import remove
import torch
# ===== 初始化模型 =====
device = "cuda" if torch.cuda.is_available() else "cpu"
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1024
if torch.cuda.is_available():
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/sdxl-turbo",
torch_dtype=torch.float16,
variant="fp16",
use_safetensors=True
)
pipe.enable_xformers_memory_efficient_attention()
pipe = pipe.to(device)
else:
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/sdxl-turbo",
use_safetensors=True
)
pipe = pipe.to(device)
# ===== 功能函數 =====
def generate_anime(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps):
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
image = pipe(
prompt=f"{prompt}, Anime",
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator
).images[0]
return image
def remove_background(input_img):
if input_img is None:
return None
return remove(input_img)
# ===== Gradio 介面設計 =====
examples = [
"A well-behaved schoolgirl with glasses",
"Astronaut in a jungle, cold color palette, 8k",
"An astronaut riding a green horse",
]
css = """
#col-container {
margin: 0 auto;
max-width: 520px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown("## 🧠 Anime Character Generator + Background Remover")
# Prompt row
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Describe your anime character...",
container=False,
)
run_button = gr.Button("🎨 Generate Anime")
# Output image (before and after remove background)
with gr.Row():
result_img = gr.Image(label="Generated Image")
removed_img = gr.Image(label="Background Removed")
# Advanced settings
with gr.Accordion("Advanced Settings", open=False):
negative_prompt = gr.Text(
label="Negative prompt",
max_lines=1,
placeholder="Enter a negative prompt",
visible=True
)
seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=0)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
with gr.Row():
width = gr.Slider(label="Width", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=512)
height = gr.Slider(label="Height", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=512)
with gr.Row():
guidance_scale = gr.Slider(label="Guidance Scale", minimum=0.0, maximum=10.0, step=0.1, value=0.0)
num_inference_steps = gr.Slider(label="Steps", minimum=1, maximum=12, step=1, value=2)
# 範例按鈕區
gr.Markdown("#### ✨ Prompt Examples")
with gr.Row():
for example in examples:
gr.Button(example).click(lambda x=example: x, outputs=prompt)
# 主按鈕 callback
run_button.click(
fn=generate_anime,
inputs=[prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
outputs=[result_img]
).then(
fn=remove_background,
inputs=[result_img],
outputs=[removed_img]
)
demo.queue().launch(share=True)