计算机图形学 Project 3 ·「生成式 AI 实践」。 在统一 SD1.5 底座 + 公平对比协议下,横向复现对比三个组合式文生图方法,并用四个受控消融把结论做成机制因果链。 所有分数均为本仓库 harness 同口径重跑,未引用任何论文自报数字。
完整写作素材(机制对比 / 公平协议 / 主结果 / 四个消融 + 数据附录)见 REPORT_MATERIAL.md。
主对比(全量 100 prompt/类 × 4 种子 = 1600 张/方法,BLIP-VQA + CLIPScore):
| method | color | shape | texture | non_spatial | avg |
|---|---|---|---|---|---|
| lmd_plus | 0.4438 | 0.5450 | 0.5378 | 0.2900 | 0.4541 🥇 |
| sd15_baseline | 0.3662 | 0.3820 | 0.4102 | 0.3118 | 0.3675 🥈 |
| rpg | 0.2558 | 0.2507 | 0.2823 | 0.2818 | 0.2676 🥉 |
核心结论:LMD+ > SD1.5 > RPG,且"更复杂的组合机制 ≠ 更好"。 布局接地(LMD+)对属性绑定的提升稳健、由扩散端机制驱动;区域扩散(RPG)在简单场景 + 弱底座上因"丢物体"垫底——四个消融(难度分层 / 显著性 / 规划器消融 / base_ratio 扫描)证明:RPG 规划器越强、旋钮怎么调都救不回来。
我们做的不是"提新方法",而是一份扎实的复现对比:当把"组合机制"作为唯一变量、其余全部钉死时,加进来的机制到底带来了什么?是机制本身,还是规划器/超参/底座等混淆因素?
| 方法 | 加入的结构 | 如何施加 | 生成方式 |
|---|---|---|---|
| SD1.5 | 无(对照锚点) | — | 全局单遍 |
| LMD+ | 每个物体一个 bbox | 软(GLIGEN 接地 + 梯度引导) | 全局单遍 |
| RPG | 画布矩形分区 | 硬(逐区潜在 + 区域注意力) | 分区生成 |
机制差异的详细对比见 REPORT_MATERIAL.md §2。
harness/ 统一对比 harness(与具体框架解耦)
config.yaml ★ 所有"钉死的实验变量"集中在此
common.py 配置 / 路径 / 文件命名约定
sample_prompts.py 从 T2I-CompBench 确定性抽样 prompt 子集
generate_baseline.py 纯 SD1.5 baseline 生成
evaluate.py 调 T2I-CompBench 打分脚本(非并行,保留逐图产物)
evaluate_parallel.py 图片分片 + 多卡并行评测
aggregate.py 汇总 → 对比表 results/summary.{md,csv}
normalize_lmd.py LMD+ 输出图归一化进统一布局
perimage.py 逐图分数加载器(分析消融用)
stratify.py 消融A:难度分层
significance.py 消融B:排序显著性 + 种子方差
plot_base_ratio.py 消融D:base_ratio 扫描出图
env/ 环境与一键脚本(见 env/README.md 安装 recipe)
project_env.sh 统一环境变量(conda / 缓存 / 代理 / pip 源)
run_phase1.sh SD1.5 baseline 全流程(生成 + 评测 + 汇总)
run_lmd_full.sh LMD+ 全流程(规划 + 生成 + 归一化 + 评测)
run_rpg_batch.sh RPG 全流程(并发规划 + 2 卡生成 + 评测)
run_ablation_finish.sh 消融 C/D 收尾编排(生成 + 评测 + 出图)
verify_gpu.sh 验收 4 个 conda env 的 CUDA 可用性
methods/ 三套方法 + 评测器代码(含我们的改造,见 §7)
data/prompts/ 抽样出的 prompt 子集 <category>.txt(进 Git)
data/images/ 生成图与逐图评测产物(★ 不进 Git,见 §5)
results/ <method>/<cat>.json + summary.{md,csv}
analysis/ 四个消融的数据 + base_ratio_curve.png
REPORT_MATERIAL.md 报告全文素材(中文)
data/images/(~3.4G 生成图)与Project3说明_2026.pptx不纳入 Git(见 §5)。
硬件:2× NVIDIA H100 80GB(CUDA 12.x)。生成是大头,评测较轻。
四个独立 conda 环境(依赖差异大,互相隔离):
| env | 用途 | 关键依赖 |
|---|---|---|
compbench |
评测器(BLIP-VQA + CLIPScore) | spacy(en_core_web_sm)、transformers |
sd15 |
SD1.5 baseline 生成 + 汇总 | diffusers、torch |
lmd |
LMD+ 生成 | diffusers 严格 0.18.0 |
rpg |
RPG 生成 | diffusers 0.27.x |
逐环境安装 recipe(含踩过的坑)见 env/README.md 与 env/SETUP_RESULT.md。
所有路径/缓存约定集中在 env/project_env.sh,运行任何脚本前先 source 它。
两个外部依赖:
- 规划器 LLM 走 OpenRouter API(LMD+ 与 RPG 共用),运行前需
export OPENAI_API_KEY=<你的 OpenRouter key>;绝不要把 key 写进任何文件(本仓库已确认无 key 泄露)。主结果用qwen/qwen3.7-max,规划器消融用qwen/qwen-2.5-7b-instruct。 - 网络/代理是环境相关的:我们的集群上 OpenRouter 仅经代理可达、HF 权重也走代理;不同环境请按
env/project_env.sh自行调整(http_proxy/HF_ENDPOINT等)。
bash env/verify_gpu.sh # 验收:4 个 env 的 torch.cuda 都 Truedata/images/(3.4G 生成图)不入 Git,有两种获取方式:
- 下载原图:从网盘取(链接见下),解压后放到
data/images/; - 自行复现:按 §6 跑生成脚本即可重建全部图片——LLM 规划缓存(
methods/RPG-DiffusionMaster/rpg_layout_cache*/、methods/LLM-groundedDiffusion/cache/)已随仓库提供,无需重新调用 API。
📦 原图网盘链接:(待补)(含 9 个方法的
data/images/,以及Project3说明_2026.pptx)
不用 Git LFS(免费额度 1G,装不下 3.4G);*.pptx(>100MB)同样不入 Git。
所有命令默认已
cd到仓库根、source env/project_env.sh、(生成类)export OPENAI_API_KEY=...。
Phase 0 · 抽样 prompt 子集(本机,无 GPU)
python -m harness.sample_prompts --phase1 # 写 data/prompts/<cat>.txt(已随仓库提供)Phase 1 · SD1.5 baseline
bash env/run_phase1.sh # 抽样→2卡生成1600张→评测→汇总Phase 2 · 两个方法
export OPENAI_API_KEY=<openrouter-key>
bash env/run_lmd_full.sh # LMD+:规划→生成→归一化→评测
bash env/run_rpg_batch.sh # RPG :并发规划→2卡生成→评测消融 A/B(零额外生成,纯分析,compbench env)
python -m harness.stratify --phase1 # 难度分层 → results/analysis/stratification.*
python -m harness.significance --phase1 # 显著性 → results/analysis/significance.*消融 C/D(需重新生成,前 30 条子集)
export OPENAI_API_KEY=<openrouter-key>
bash env/run_ablation_finish.sh # C 规划器消融 + D base_ratio 扫描 + 出图随时汇总对比表
python -m harness.aggregate --phase1 # → results/summary.{md,csv}methods/ 下三套仓库来自开源,我们做了最小、向后兼容的改造(默认行为不变):
- LMD+(
LLM-groundedDiffusion):utils/llm.py接 OpenRouter 规划器 +gpt-4-weak弱模型别名;prompt.py加compbench_<cat>prompt-type。 - RPG(
RPG-DiffusionMaster):mllm.py接 OpenRouter(规划器经RPG_PLANNER_MODEL可切);gen_rpg.py/plan_rpg.py为本项目子集生成 + 加--base-ratio/--output-method/--cache-dir。 - T2I-CompBench:
CLIPScore_eval/CLIP_similarity_hf.py(transformers 后端等价实现 + 逐图映射);BLIPvqa_eval模型加载 8→1 提速(口径不变)。
第三方代码版权归各自作者;本仓库仅为课程复现用途,建议设为 private。
公平对比协议(改实验只改 harness/config.yaml):
- 底座统一锚定 SD1.5;规划器 LLM 三方共用同一个 API 模型;种子
[0,1,2,3];prompt 子集三方同一份;评测器同一套。 - 绝不引用论文自报数字——全部同口径重跑。
如实声明的局限(详见 REPORT_MATERIAL.md §7):
- 底座无法 100% 统一(LMD+ 的 GLIGEN 适配器绑定 SD v1.4);
- RPG 用 SD1.5@512 而非其原生 SDXL,可能放大其劣势;
- 评测仅覆盖属性绑定 + 非空间关系(空间/数量维度需 detectron2/UniDet,未做);
- 消融 C/D 用 30 条子集(生成类消融的算力惯例),主表为全量 100。