Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,204 +1,236 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
)
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
ModelType,
|
| 23 |
-
fields,
|
| 24 |
-
WeightType,
|
| 25 |
-
Precision
|
| 26 |
-
)
|
| 27 |
-
from src.envs import API, EVAL_REQUESTS_PATH, EVAL_RESULTS_PATH, QUEUE_REPO, REPO_ID, RESULTS_REPO, TOKEN
|
| 28 |
-
from src.populate import get_evaluation_queue_df, get_leaderboard_df
|
| 29 |
-
from src.submission.submit import add_new_eval
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
def restart_space():
|
| 33 |
-
API.restart_space(repo_id=REPO_ID)
|
| 34 |
-
|
| 35 |
-
### Space initialisation
|
| 36 |
try:
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
|
|
|
| 40 |
)
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
try:
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
|
|
|
| 47 |
)
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
(
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
if
|
| 62 |
-
raise
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
with gr.Row():
|
| 145 |
-
gr.
|
| 146 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
with gr.Row():
|
| 148 |
-
with gr.Column():
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
|
|
|
| 157 |
)
|
| 158 |
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
label="Precision",
|
| 163 |
-
multiselect=False,
|
| 164 |
-
value="float16",
|
| 165 |
-
interactive=True,
|
| 166 |
-
)
|
| 167 |
-
weight_type = gr.Dropdown(
|
| 168 |
-
choices=[i.value.name for i in WeightType],
|
| 169 |
-
label="Weights type",
|
| 170 |
-
multiselect=False,
|
| 171 |
-
value="Original",
|
| 172 |
-
interactive=True,
|
| 173 |
-
)
|
| 174 |
-
base_model_name_textbox = gr.Textbox(label="Base model (for delta or adapter weights)")
|
| 175 |
-
|
| 176 |
-
submit_button = gr.Button("Submit Eval")
|
| 177 |
-
submission_result = gr.Markdown()
|
| 178 |
-
submit_button.click(
|
| 179 |
-
add_new_eval,
|
| 180 |
-
[
|
| 181 |
-
model_name_textbox,
|
| 182 |
-
base_model_name_textbox,
|
| 183 |
-
revision_name_textbox,
|
| 184 |
-
precision,
|
| 185 |
-
weight_type,
|
| 186 |
-
model_type,
|
| 187 |
-
],
|
| 188 |
-
submission_result,
|
| 189 |
-
)
|
| 190 |
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
show_copy_button=True,
|
| 199 |
-
)
|
| 200 |
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
demo.queue(default_concurrency_limit=40).launch()
|
|
|
|
| 1 |
+
# =====================================================================================
|
| 2 |
+
# Hugging Face AIGC Project - Text-to-Image Model Comparison
|
| 3 |
+
# Models: Stable Diffusion 1.5 vs. Stable Diffusion XL 1.0
|
| 4 |
+
# =====================================================================================
|
| 5 |
import gradio as gr
|
| 6 |
+
import torch
|
| 7 |
+
from diffusers import StableDiffusionPipeline, StableDiffusionXLPipeline
|
| 8 |
+
import time
|
| 9 |
+
import io
|
| 10 |
+
import matplotlib.pyplot as plt
|
| 11 |
+
import numpy as np
|
| 12 |
+
import os
|
| 13 |
+
|
| 14 |
+
# --- 1. 模型加载 ---
|
| 15 |
+
# 将模型加载放在全局作用域,确保只在Space启动时加载一次
|
| 16 |
+
# 使用HF_TOKEN密钥来授权下载
|
| 17 |
+
# 注意:首次启动时下载模型会非常耗时,请耐心等待
|
| 18 |
+
print("开始加载模型...")
|
| 19 |
+
|
| 20 |
+
# 模型ID
|
| 21 |
+
model_id_sd15 = "runwayml/stable-diffusion-v1-5"
|
| 22 |
+
model_id_sdxl = "stabilityai/stable-diffusion-xl-base-1.0"
|
| 23 |
+
|
| 24 |
+
# 加载 Stable Diffusion 1.5
|
| 25 |
+
# 使用 float16 节省显存并加速
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
try:
|
| 27 |
+
pipe_sd15 = StableDiffusionPipeline.from_pretrained(
|
| 28 |
+
model_id_sd15,
|
| 29 |
+
torch_dtype=torch.float16,
|
| 30 |
+
use_safetensors=True
|
| 31 |
)
|
| 32 |
+
pipe_sd15.to("cuda")
|
| 33 |
+
print("Stable Diffusion 1.5 加载成功!")
|
| 34 |
+
except Exception as e:
|
| 35 |
+
print(f"加载 SD 1.5 失败: {e}")
|
| 36 |
+
pipe_sd15 = None
|
| 37 |
+
|
| 38 |
+
# 加载 Stable Diffusion XL
|
| 39 |
+
# SDXL更大,更耗资源
|
| 40 |
try:
|
| 41 |
+
pipe_sdxl = StableDiffusionXLPipeline.from_pretrained(
|
| 42 |
+
model_id_sdxl,
|
| 43 |
+
torch_dtype=torch.float16,
|
| 44 |
+
use_safetensors=True
|
| 45 |
)
|
| 46 |
+
pipe_sdxl.to("cuda")
|
| 47 |
+
print("Stable Diffusion XL 1.0 加载成功!")
|
| 48 |
+
except Exception as e:
|
| 49 |
+
print(f"加载 SDXL 1.0 失败: {e}")
|
| 50 |
+
pipe_sdxl = None
|
| 51 |
+
|
| 52 |
+
print("所有模型加载完毕。")
|
| 53 |
+
|
| 54 |
+
# --- 2. 核心功能函数 ---
|
| 55 |
+
|
| 56 |
+
# 主生成函数
|
| 57 |
+
def generate_images(prompt):
|
| 58 |
+
"""根据输入的prompt,同时调用两个模型生成图像,并记录时间。"""
|
| 59 |
+
if not prompt:
|
| 60 |
+
raise gr.Error("请输入Prompt!")
|
| 61 |
+
|
| 62 |
+
# --- 生成 SD 1.5 图像 ---
|
| 63 |
+
start_time_15 = time.time()
|
| 64 |
+
if pipe_sd15:
|
| 65 |
+
try:
|
| 66 |
+
image_sd15 = pipe_sd15(prompt=prompt, num_inference_steps=30).images[0]
|
| 67 |
+
end_time_15 = time.time()
|
| 68 |
+
time_15 = f"{end_time_15 - start_time_15:.2f} 秒"
|
| 69 |
+
except Exception as e:
|
| 70 |
+
print(f"SD 1.5 生成出错: {e}")
|
| 71 |
+
image_sd15 = None
|
| 72 |
+
time_15 = "生成失败"
|
| 73 |
+
else:
|
| 74 |
+
image_sd15 = None
|
| 75 |
+
time_15 = "模型未加载"
|
| 76 |
+
|
| 77 |
+
# --- 生成 SDXL 图像 ---
|
| 78 |
+
start_time_xl = time.time()
|
| 79 |
+
if pipe_sdxl:
|
| 80 |
+
try:
|
| 81 |
+
image_sdxl = pipe_sdxl(prompt=prompt, num_inference_steps=30).images[0]
|
| 82 |
+
end_time_xl = time.time()
|
| 83 |
+
time_xl = f"{end_time_xl - start_time_xl:.2f} 秒"
|
| 84 |
+
except Exception as e:
|
| 85 |
+
print(f"SDXL 生成出错: {e}")
|
| 86 |
+
image_sdxl = None
|
| 87 |
+
time_xl = "生成失败"
|
| 88 |
+
else:
|
| 89 |
+
image_sdxl = None
|
| 90 |
+
time_xl = "模型未加载"
|
| 91 |
+
|
| 92 |
+
return image_sd15, image_sdxl, time_15, time_xl
|
| 93 |
+
|
| 94 |
+
# 创建GRACE雷达图的函数
|
| 95 |
+
def create_grace_radar_chart():
|
| 96 |
+
"""生成并返回一个基于GRACE框架评估的雷达图"""
|
| 97 |
+
labels = ['G: 泛化性', 'R: 相关性', 'A: 创新表现力', 'E: 效率性']
|
| 98 |
+
num_vars = len(labels)
|
| 99 |
+
|
| 100 |
+
# 为两个模型打分 (0-10), 分别对应 G, R, A, E
|
| 101 |
+
sd15_scores = [7, 8, 7, 9]
|
| 102 |
+
sdxl_scores = [9, 9, 9, 6]
|
| 103 |
+
|
| 104 |
+
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
|
| 105 |
+
angles += angles[:1]
|
| 106 |
+
|
| 107 |
+
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
|
| 108 |
+
|
| 109 |
+
# 添加SD 1.5的数据
|
| 110 |
+
data_15 = sd15_scores + sd15_scores[:1]
|
| 111 |
+
ax.plot(angles, data_15, color='dodgerblue', linewidth=2, label='Stable Diffusion 1.5')
|
| 112 |
+
ax.fill(angles, data_15, color='dodgerblue', alpha=0.25)
|
| 113 |
+
|
| 114 |
+
# 添加SDXL的数据
|
| 115 |
+
data_xl = sdxl_scores + sdxl_scores[:1]
|
| 116 |
+
ax.plot(angles, data_xl, color='orangered', linewidth=2, label='Stable Diffusion XL 1.0')
|
| 117 |
+
ax.fill(angles, data_xl, color='orangered', alpha=0.25)
|
| 118 |
+
|
| 119 |
+
ax.set_yticklabels([])
|
| 120 |
+
ax.set_xticks(angles[:-1])
|
| 121 |
+
ax.set_xticklabels(labels, size=12)
|
| 122 |
+
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
|
| 123 |
+
|
| 124 |
+
# 将matplotlib图像保存到内存中,以便Gradio显示
|
| 125 |
+
buf = io.BytesIO()
|
| 126 |
+
plt.savefig(buf, format='png', bbox_inches='tight')
|
| 127 |
+
buf.seek(0)
|
| 128 |
+
plt.close(fig)
|
| 129 |
+
return buf.getvalue()
|
| 130 |
+
|
| 131 |
+
# Markdown格式的报告内容
|
| 132 |
+
def get_report_content():
|
| 133 |
+
return """
|
| 134 |
+
# 文生图(Text-to-Image)模型对比实验报告
|
| 135 |
+
|
| 136 |
+
### 小组成员: (请在此处填写你的名字)
|
| 137 |
+
|
| 138 |
+
---
|
| 139 |
+
|
| 140 |
+
## 1. 项目概述
|
| 141 |
+
本项目旨在对两种主流的文生图模型——`Stable Diffusion 1.5` 和 `Stable Diffusion XL 1.0`——进行横向对比。我们通过搭建一个交互式的Hugging Face Space应用,让用户能够通过统一的文本输入(Prompt)直观地比较两个模型的输出结果。此外,我们引入了GRACE评估框架,从多个维度对模型进行定性与定量的分析,并通过雷达图进行可视化展示。
|
| 142 |
+
|
| 143 |
+
## 2. 模型选择与介绍
|
| 144 |
+
- **`runwayml/stable-diffusion-v1-5`**: 这是一个基于1.5版本的Stable Diffusion模型。作为曾经的业界标杆,它拥有庞大的社区支持和成熟的生态,以其相对较快的生成速度和对各类Prompt的良好响应而闻名。
|
| 145 |
+
- **`stabilityai/stable-diffusion-xl-base-1.0`**: 由Stability AI开发的下一代模型。SDXL拥有更大的UNet骨干网络和第二套文本编码器,使其能够生成更高分辨率(原生1024x1024)的图像,对自然语言的理解更深刻,画面细节和构图也更为出色。
|
| 146 |
+
|
| 147 |
+
## 3. GRACE 评估框架分析
|
| 148 |
+
我们选取了GRACE框架中的四个关键维度进行评估,并在"Benchmark"选项卡中用雷达图展示:
|
| 149 |
+
- **G (泛化性)**: SDXL能处理更复杂的场景和风格组合,泛化性更强。SD 1.5在处理非主流风格时可能会出现伪影。
|
| 150 |
+
- **R (相关性)**: SDXL对长句和复杂空间关系的理解更好,生成图像与Prompt的贴合度更高。例如,它能更好地区分“一只猫在盒子上”和“一个盒子在猫上”。
|
| 151 |
+
- **A (创新表现力)**: SDXL生成的图像在色彩、光影、细节和美学上通常优于SD 1.5,画面更具“电影感”和艺术性。
|
| 152 |
+
- **E (效率性)**: SD 1.5的模型体积更小,推理速度更快,对硬件资源的要求也更低,因此在效率上得分更高。
|
| 153 |
+
|
| 154 |
+
## 4. 实验设计与实现
|
| 155 |
+
我们的Hugging Face Space包含三个主要部分,完全按照作业要求实现:
|
| 156 |
+
1. **Arena (模型竞技场)**: 这是用户界面的核心。用户在此输入一个Prompt,点击生成后,应用会并行调用SD 1.5和SDXL模型。结果会并排展示,并附上各自的生成时间,便于直观比较。
|
| 157 |
+
2. **Benchmark (GRACE评估)**: 此页面展示了基于GRACE框架的雷达图,可视化了两个模型在四个维度上的得分。下方附有对评估结果的简要分析。
|
| 158 |
+
3. **Report (实验报告)**: 即本页面,使用Markdown撰写了完整的实验报告。所有代码和提交历史均可在"Files"选项卡查看。
|
| 159 |
+
|
| 160 |
+
## 5. 实验结果与讨论
|
| 161 |
+
通过大量测试(例如输入 "An epic fantasy landscape with a dragon flying over a castle"),我们观察到:
|
| 162 |
+
- SDXL的输出图像在构图和细节上远超SD 1.5,龙和城堡的描绘更具史诗感。
|
| 163 |
+
- SD 1.5的输出虽然也符合主题,但细节较为模糊,艺术表现力稍逊一筹。
|
| 164 |
+
- 在时间上,SD 1.5的生成速度几乎是SDXL的两倍,验证了其效率优势。
|
| 165 |
+
这些结果与我们在GRACE评估中的打分相符。
|
| 166 |
+
|
| 167 |
+
## 6. 总结与展望
|
| 168 |
+
本次实验成功地构建了一个对比平台,并验证了SDXL相较于SD 1.5在生成质量上的显著提升,以及SD 1.5在效率上的优势。这体现了AI模型在效果与效率之间的权衡。
|
| 169 |
+
未来可以进一步扩展该平台,引入更多的模型(如SDXL Turbo, DALL-E 3),或增加更多控制参数(如负向提示词、CFG Scale等)以进行更细致的对比。
|
| 170 |
+
|
| 171 |
+
## 7. 合作分工说明
|
| 172 |
+
*(请注意:此部分为满足作业要求而写的模板,请根据你的实际情况修改)*
|
| 173 |
+
本项目由一名成员独立完成。该成员负责了项目的全部流程,包括:
|
| 174 |
+
- **项目规划**: 确定对比模型和技术方案。
|
| 175 |
+
- **环境搭建**: 创建和配置Hugging Face Space,处理依赖和密钥。
|
| 176 |
+
- **后端开发**: 编写Python代码,加载两个模型并实现图像生成逻辑。
|
| 177 |
+
- **前端开发**: 使用Gradio构建所有UI界面,包括Arena、Benchmark和Report选项卡。
|
| 178 |
+
- **报告撰写**: 完成所有分析和报告内容的撰写。
|
| 179 |
+
"""
|
| 180 |
+
|
| 181 |
+
# --- 3. Gradio 界面构建 ---
|
| 182 |
+
with gr.Blocks(theme=gr.themes.Default(), title="文生图模型对比") as demo:
|
| 183 |
+
gr.Markdown("# 🎨 文生图模型横向评测:Stable Diffusion 1.5 vs SDXL 1.0")
|
| 184 |
+
|
| 185 |
+
with gr.Tabs() as tabs:
|
| 186 |
+
# Arena 选项卡
|
| 187 |
+
with gr.TabItem("🚀 Arena | 模型竞技场", id=0):
|
| 188 |
+
gr.Markdown("## 竞技场\n在下方的输入框中输入你的创意(Prompt),点击“生成”按钮,即可看到两个模型的表现!")
|
| 189 |
with gr.Row():
|
| 190 |
+
prompt_input = gr.Textbox(label="输入你的Prompt", placeholder="例如: A high-quality photo of an astronaut riding a horse on Mars", scale=4)
|
| 191 |
+
submit_btn = gr.Button("生成", variant="primary", scale=1)
|
| 192 |
+
|
| 193 |
+
with gr.Row():
|
| 194 |
+
with gr.Column(scale=1):
|
| 195 |
+
gr.Markdown("### Stable Diffusion 1.5")
|
| 196 |
+
image_output_15 = gr.Image(label="SD 1.5 输出", interactive=False, height=400)
|
| 197 |
+
time_output_15 = gr.Textbox(label="生成耗时", interactive=False)
|
| 198 |
+
with gr.Column(scale=1):
|
| 199 |
+
gr.Markdown("### Stable Diffusion XL 1.0")
|
| 200 |
+
image_output_xl = gr.Image(label="SDXL 输出", interactive=False, height=400)
|
| 201 |
+
time_output_xl = gr.Textbox(label="生成耗时", interactive=False)
|
| 202 |
+
|
| 203 |
+
# Benchmark 选项卡
|
| 204 |
+
with gr.TabItem("📊 Benchmark | GRACE评估", id=1):
|
| 205 |
+
gr.Markdown("## 基于GRACE框架的模型评估")
|
| 206 |
+
gr.Markdown(
|
| 207 |
+
"我们从 **泛化性(G)**, **相关性(R)**, **创新表现力(A)**, **效率性(E)** 四个维度对两个模型进行评估打分(满分10分),并通过雷达图进行可视化展示。"
|
| 208 |
+
)
|
| 209 |
with gr.Row():
|
| 210 |
+
with gr.Column(scale=2):
|
| 211 |
+
# 直接调用函数创建并显示雷达图
|
| 212 |
+
radar_chart_image = gr.Image(value=create_grace_radar_chart, label="GRACE 维度雷达图", interactive=False)
|
| 213 |
+
with gr.Column(scale=1):
|
| 214 |
+
gr.Markdown(
|
| 215 |
+
"""
|
| 216 |
+
### 分析结论
|
| 217 |
+
- **Stable Diffusion XL** 在 **泛化性 (G)**、**相关性 (R)** 和 **创新表现力 (A)** 上表现更优,能更好地理解复杂的prompt,并生成更高质量、更富细节的图像。
|
| 218 |
+
- **Stable Diffusion 1.5** 在 **效率性 (E)** 上胜出,它的模型更小,生成速度更快,硬件要求也更低。
|
| 219 |
+
"""
|
| 220 |
)
|
| 221 |
|
| 222 |
+
# Report 选项卡
|
| 223 |
+
with gr.TabItem("📝 Report | 实验报告", id=2):
|
| 224 |
+
gr.Markdown(get_report_content) # 直接加载报告内容的函数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 225 |
|
| 226 |
+
# --- 4. 事件绑定 ---
|
| 227 |
+
submit_btn.click(
|
| 228 |
+
fn=generate_images,
|
| 229 |
+
inputs=prompt_input,
|
| 230 |
+
outputs=[image_output_15, image_output_xl, time_output_15, time_output_xl],
|
| 231 |
+
api_name="generate"
|
| 232 |
+
)
|
|
|
|
|
|
|
| 233 |
|
| 234 |
+
# --- 5. 启动应用 ---
|
| 235 |
+
if __name__ == "__main__":
|
| 236 |
+
demo.launch()
|
|
|