|
import os
|
|
import gradio as gr
|
|
from diffusers import DiffusionPipeline
|
|
import torch
|
|
from huggingface_hub import login
|
|
|
|
|
|
if os.getenv('HF_TOKEN'):
|
|
login(token=os.getenv('HF_TOKEN'))
|
|
|
|
|
|
def load_model():
|
|
model_id = "IndexTeam/Index-anisora"
|
|
print("正在加载模型...")
|
|
|
|
pipe = DiffusionPipeline.from_pretrained(
|
|
model_id,
|
|
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
|
variant="fp16" if torch.cuda.is_available() else None,
|
|
use_safetensors=True
|
|
)
|
|
|
|
if torch.cuda.is_available():
|
|
print("使用CUDA加速")
|
|
pipe = pipe.to("cuda")
|
|
pipe.enable_attention_slicing()
|
|
if hasattr(pipe, 'enable_xformers_memory_efficient_attention'):
|
|
pipe.enable_xformers_memory_efficient_attention()
|
|
else:
|
|
print("警告:未检测到CUDA,使用CPU模式运行")
|
|
|
|
return pipe
|
|
|
|
|
|
pipe = load_model()
|
|
|
|
|
|
def generate_image(prompt, negative_prompt, steps=30, guidance_scale=7.5, seed=None):
|
|
if seed is not None and seed >= 0:
|
|
generator = torch.Generator("cuda" if torch.cuda.is_available() else "cpu").manual_seed(int(seed))
|
|
else:
|
|
generator = None
|
|
|
|
try:
|
|
with torch.inference_mode():
|
|
print(f"生成图像: {prompt[:50]}...")
|
|
image = pipe(
|
|
prompt=prompt,
|
|
negative_prompt=negative_prompt,
|
|
num_inference_steps=steps,
|
|
guidance_scale=guidance_scale,
|
|
generator=generator
|
|
).images[0]
|
|
return image
|
|
except Exception as e:
|
|
print(f"生成失败: {str(e)}")
|
|
raise gr.Error(f"生成图像时出错: {str(e)}")
|
|
|
|
|
|
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
gr.Markdown("""
|
|
# Index-anisora 演示
|
|
""")
|
|
|
|
with gr.Row():
|
|
with gr.Column():
|
|
prompt = gr.Textbox(
|
|
label="提示词",
|
|
value="1girl, beautiful anime style, detailed background",
|
|
placeholder="描述你想要生成的图像..."
|
|
)
|
|
negative_prompt = gr.Textbox(
|
|
label="负面提示词",
|
|
value="low quality, blurry, bad anatomy",
|
|
placeholder="描述你不希望在图像中出现的内容..."
|
|
)
|
|
|
|
with gr.Row():
|
|
steps = gr.Slider(
|
|
label="推理步数",
|
|
minimum=10,
|
|
maximum=50,
|
|
value=30,
|
|
step=1
|
|
)
|
|
guidance_scale = gr.Slider(
|
|
label="引导强度",
|
|
minimum=1.0,
|
|
maximum=20.0,
|
|
value=7.5,
|
|
step=0.5
|
|
)
|
|
seed = gr.Number(
|
|
label="随机种子",
|
|
value=-1,
|
|
precision=0
|
|
)
|
|
|
|
submit_btn = gr.Button("生成", variant="primary")
|
|
|
|
with gr.Column():
|
|
output_image = gr.Image(label="生成结果")
|
|
|
|
|
|
submit_btn.click(
|
|
fn=generate_image,
|
|
inputs=[prompt, negative_prompt, steps, guidance_scale, seed],
|
|
outputs=output_image
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
demo.launch(
|
|
server_name="0.0.0.0",
|
|
server_port=7860,
|
|
share=False
|
|
) |