AI 生图从玄学到工程:Stable Diffusion、ComfyUI 与 Midjourney 的原理与 Prompt 方法论
身边第一次玩 AI 生图的朋友,十个有九个会问同一个问题:"为什么我抽了三十张,能用的只有一张?"而另一个玩家同样输入一句 Prompt,出图张张接近终稿。差距不在运气,而在流程:前者把生图当抽奖,后者把生图当生产。
这篇长文想把"AI 生图"这件事从头到尾工程化一遍:先用通俗语言拆开扩散模型的加噪/去噪机制,再横向对比 SD WebUI、ComfyUI、Midjourney 三条主流路线,然后给出一套可复用的五层 Prompt 结构,接着用 LoRA 与 ControlNet 解决"像不像、准不准"的可控性问题,最后落到很多人忽视的一环------批量出图之后的素材管理。读完你应该能做到:出图可预期、参数可复现、失败可定位、素材可检索。
📑 文章目录
- [一. 抽卡感的来源](#一. 抽卡感的来源)
- [二. 扩散模型通俗原理](#二. 扩散模型通俗原理)
- [2.1 加噪与去噪](#2.1 加噪与去噪)
- [2.2 CFG:文字到底是怎么"管住"画面的](#2.2 CFG:文字到底是怎么"管住"画面的)
- [2.3 采样步数与采样器](#2.3 采样步数与采样器)
- [三. 三条主流路线对比](#三. 三条主流路线对比)
- [四. Prompt 五层结构方法论](#四. Prompt 五层结构方法论)
- [五. LoRA 与 ControlNet 解决可控性](#五. LoRA 与 ControlNet 解决可控性)
- [六. 批量出图与素材管理](#六. 批量出图与素材管理)
- [七. 总结](#七. 总结)
- 参考文献
一. 抽卡感的来源 🎰
先把结论摆出来:"抽卡感"不是模型的锅,是流程没有工程化的锅。 具体来说,是下面四件事一件都没做:
- 意图没翻译:脑子里想的是"赛博朋克女战士,电影感",手上打的是"一个漂亮的赛博朋克女孩,要高清"。模型接收到的信息量比你以为的少得多,剩下全是它自己发挥。
- 变量没固定:种子(seed)随机、分辨率随手填、采样器从没看过、CFG 永远是默认的 7。同一个 Prompt 跑十次,等于同时开了十个互不相干的实验。
- 过程没记录:出图不满意,改 Prompt 碰运气,改了七八轮之后连最初那句是什么都忘了,更没记录"哪张图对应哪组参数"。
- 结果没管理 :几百张图散落在 Downloads 文件夹里,文件名全是
0001-1.png、0001-2.png,第二天就再也找不到昨天那张"差点就是它"的图了。
对照软件工程的视角:这四步恰好对应需求分析(意图翻译)、控制变量(参数固化)、日志(参数卡)、资产管理(素材库)。任何一条生产流水线缺了这四步都会变成抽奖,AI 生图也不例外。
要理解为什么"变量"如此重要,得先搞清楚图是怎么从噪声里"长"出来的,这就是下一章的主题。
思考:💡 为什么人类画家不会"抽卡",而 AI 生图会?
🤔 因为画家在落笔前已经控制了构图、透视、光影的所有约束,笔触只是在小范围内采样;而朴素生图玩家把这些约束全部交给了模型的先验分布。工程化生图本质上就是在补约束:Prompt 补语义约束,ControlNet 补几何约束,LoRA 补风格约束,种子与参数卡补复现约束。约束越完备,方差越小。
二. 扩散模型通俗原理 🌊
2.1 加噪与去噪
Stable Diffusion 属于扩散模型(Diffusion Model),其训练思想可以概括为两句话:
正向过程:给一张干净图片逐步掺入高斯噪声,直到它彻底变成噪声。
反向过程:训练一个网络(U-Net)学会"看噪声图,猜里面掺了多少噪声"。
训练完成后,生成图片就变成了"从纯噪声出发,让网络一步步把噪声减掉"的迭代过程。第一次提出这套框架的是 2020 年的 DDPM 论文1,而 2022 年的 Latent Diffusion Models(LDM)论文2做了一件关键的工程优化:不在像素空间做扩散,而是先用 VAE 把图片压缩到潜空间(latent space),在小得多的张量上加噪去噪,最后再解码回像素。这就是"Stable" Diffusion 跑得比早期扩散模型快一个数量级的原因。
整条生成流水线用 ASCII 表示:
文字 Prompt ──→ CLIP 文本编码器 ──→ 条件向量 c
│
随机噪声 zT(由 seed 决定) │
│ │
▼ ▼
┌─────────────────────────────────────────┐
│ U-Net 迭代去噪:zT → zT-1 → ... → z0 │◄── CFG 干预每一步
└─────────────────────────────────────────┘
│
▼
VAE 解码器
│
▼
输出图片
这里第一个关键认知:seed 决定初始噪声 zT。同参数同 seed,输出几乎逐像素一致------这就是"可复现"的物理基础;seed 不同,等于换了另一坨噪声,构图和细节自然漂移,这就是"抽卡"的物理源头。
2.2 CFG:文字到底是怎么"管住"画面的
光有噪声起点,模型凭什么知道你要"银发、机械臂、雨夜霓虹"?靠的是 Classifier-Free Guidance(无分类器引导,简称 CFG),出自论文3。每一步去噪时,U-Net 其实要算两次:
- 带文本条件:
ε(z, c)------"听着 Prompt 猜噪声" - 不带文本条件:
ε(z, ∅)------"不管 Prompt 瞎猜噪声"
然后把两者的差值放大:
ε̃ = ε(z, ∅) + scale × ( ε(z, c) − ε(z, ∅) )
界面上的 CFG Scale / Guidance Scale 就是这个 scale,直觉理解是"对 Prompt 的服从程度":
| CFG 取值 | 表现 |
|---|---|
| 1 ~ 3 | 模型基本不听指令,画面发散,适合找灵感 |
| 4 ~ 8 | 平衡区,多数模型的推荐区间(SD 系常取 5~7) |
| 9 ~ 15 | 高度服从 Prompt,但色彩过饱和、对比过硬,开始"糊" |
| 18 以上 | 画面出现烧焦感、细节崩坏,一般只在特殊风格下使用 |
第二个关键认知:CFG 不是越高越听话。过高的引导会把分布推向"最安全"的样本,牺牲多样性甚至质量。工程上把它当作"风格化强度旋钮"来调,而不是越满越好。
2.3 采样步数与采样器
去噪不是一次完成的,而是把 zT → z0 切成 N 步慢慢走。这就引出**采样步数(Steps)和采样器(Sampler)**两个参数:
- 步数太少(<15):去噪不彻底,画面浑浊、细节"融化";
- 步数太多(>50):收益递减,耗时线性上涨,某些采样器甚至会越修越"油";
- 采样器决定每一步怎么走:Euler a (ancestral)随机性强、同 Prompt 每次构图不同,适合开盲盒;DPM++ 2M Karras 确定性好、收敛快,20~30 步就能出干净的成图,是目前 SD 社区的生产线默认选项。
我的常用基线:DPM++ 2M Karras + 25~30 steps + CFG 6.5。在此基础上,把 seed 固定、只动单一参数做 A/B 对比------这就不是抽卡了,是控制变量实验。
思考:💡 为什么 512~1024 是 SD 模型的"舒适分辨率",硬拉到 4K 会多出三只手?
🤔 模型的构图先验来自训练集的分块尺寸(SD1.5 主力训练分辨率 512,SDXL 为 1024)。远离训练分布时,U-Net 对全局结构的把控力下降,容易出现肢体重复、多头多指、画面元素复制。正确姿势是在舒适区出图,再用放大算法(如 4x-UltraSharp、Tiled Diffusion)做超分,而不是一步生成 4K。
三. 三条主流路线对比 🛤️
工具层面,目前主流路线有三条:SD WebUI (AUTOMATIC1111 及其衍生 Fork,如 Forge)、ComfyUI 节点工作流、Midjourney。三者哲学完全不同:WebUI 是"给功能加开关",ComfyUI 是"把流程摊成电路图",Midjourney 是"把一切包进订阅制黑箱"。
| 维度 | SD WebUI / Forge | ComfyUI | Midjourney |
|---|---|---|---|
| 上手成本 | 低:表单式界面,半天上手 | 中高:要理解节点连线逻辑 | 极低:对话框输入即可 |
| 硬件/费用 | 本地免费,N 卡 4GB 显存起 | 同左,显存利用更优 | 订阅制,约 $10/月起,无需本地显卡 |
| 可控性 | 中:扩展靠插件,流程半固定 | 高:管线每个环节显式可改 | 中:靠 --ar/--sref/--cref 等参数指令 |
| 可复现性 | 好:参数与 seed 可完整记录 | 极好:整个工作流就是一个 JSON | 一般:模型权重封闭,版本迭代画风会变 |
| 生态 | 模型/插件/Lora 生态最成熟 | 节点生态增长最快,工作流可分享导入 | 官方社区,prompt 文化浓厚但封闭 |
| 批量与自动化 | 一般,靠脚本插件 | 强:JSON 可直接 API 调用 | 弱:无官方批量 API |
| 适合人群 | 个人创作者、想先玩明白的人 | 开发者、需要搭建生产线的人 | 无硬件、要快、概念设计优先的人 |
一个常见误区是把三者当竞品二选一。实际生产里它们更像"分工":
- Midjourney 负责前 30%:快速试探方向、出情绪板(moodboard)、找构图灵感;
- ComfyUI 负责后 70%:把验证过的方向固化成工作流,批量出图、换装、换背景、修图;
- WebUI 适合夹在中间做单张精修和局部重绘(inpaint)。
我的迁移路径也是大多数人的路径:WebUI 入坑 → 被"重复手工操作 50 次"逼进 ComfyUI → 在 Midjourney 和 SD 之间按任务来回横跳。
思考:💡 中小团队到底该自建 SD 还是直接用 Midjourney?
🤔 看三个问题:要不要私有风格(有自训 LoRA 需求基本只能走 SD 系);要不要批量自动化(ComfyUI API 化 vs MJ 手动抽卡);数据能不能出内网(商密素材用云端服务有大麻烦)。三个问题里有两个指向 SD,就值得投入人力自建;否则 MJ 的订阅费远比一张 4090 便宜。
四. Prompt 五层结构方法论 🧱
4.1 五层结构:主体-场景-风格-镜头-质量词
把"想要什么"塞进一句话是玄学起点。工程化的做法是把 Prompt 拆成五个正交的层,每层只管一件事,层与层之间用逗号分隔,从权重高到低排列:
| 层 | 管什么 | 示例(英文 tag) | 常见错误 |
|---|---|---|---|
| 1. 主体 Subject | 画面里是谁/是什么,有什么特征 | 1girl, silver short hair, mechanical left arm, black tactical jacket |
用形容词代替名词("一个很酷的人") |
| 2. 场景 Scene | 在哪里,环境光与氛围 | cyberpunk alley, neon signs, rainy night, steam |
场景词压过主体、喧宾夺主 |
| 3. 风格 Style | 画风、媒介、渲染方式 | cinematic concept art, octane render, cyberpunk anime style |
风格互相打架(写实摄影+厚涂同堆) |
| 4. 镜头 Camera | 景别、机位、焦距、构图 | medium shot, low angle, 35mm lens, shallow depth of field |
完全不管镜头,构图全凭模型心情 |
| 5. 质量词 Quality | 精度与兜底要求 | masterpiece, best quality, ultra detailed, 8k |
堆几十个质量词期待奇迹 |
CLIP 文本编码器对靠前的词权重更高 ,且总有效 token 数有限(SD1.5 约 75 token 一切断),所以排序本身就是权重控制。需要强调的词用 (word:1.2) 语法加权,削弱的用 (word:0.8)。
4.2 正误示例
反例(自然语言许愿式):
生成一个漂亮的赛博朋克女孩,要高清,氛围感拉满,像电影海报,
最好有点忧郁的感觉,千万不要崩。
问题清单:没有可辨识的特征词("漂亮"对模型是空集);"氛围感""忧郁"是感受词不是视觉词;"千万不要崩"写进正向 Prompt 反而是负向指令,容易触发反向效果;无任何镜头与构图约束。
正例(五层结构化):
(1girl, silver short hair, glowing mechanical left arm:1.2), black tactical jacket,
cyberpunk alley with neon signs, heavy rain at night, rising steam,
cinematic concept art, octane render, teal and magenta color scheme,
medium shot, low angle, 35mm lens, shallow depth of field,
masterpiece, best quality, ultra detailed
配套负面提示词(Negative Prompt)单独成层,专管"排除项":
lowres, bad anatomy, bad hands, extra fingers, missing fingers, watermark, text,
signature, blurry, jpeg artifacts, worst quality, deformed face
工程视角看,正例每一层都对应一个"可单独回滚的变量":脸不对改主体层,气氛不对改场景层------而反例失败了你连该改哪儿都不知道。
4.3 模板化与程序化调用
把五层结构固化成模板,业务侧只填槽位,是生产线的第一步。以 SD WebUI 的 REST API 为例:
python
import requests, base64, json, time
from pathlib import Path
BASE_URL = "http://127.0.0.1:7860" # 需勾选 --api 启动
PROMPT_TEMPLATE = (
"({subject}:1.2), {scene}, {style}, {camera}, "
"masterpiece, best quality, ultra detailed"
)
NEGATIVE = ("lowres, bad anatomy, bad hands, extra fingers, watermark, text, "
"blurry, worst quality")
def txt2img(slot: dict, seed: int = -1, steps: int = 28, cfg: float = 6.5,
width: int = 832, height: int = 1216, batch: int = 4) -> dict:
prompt = PROMPT_TEMPLATE.format(**slot)
payload = {
"prompt": prompt,
"negative_prompt": NEGATIVE,
"seed": seed, # 生产环境务必固定,-1 只用于探索期
"steps": steps,
"cfg_scale": cfg,
"sampler_name": "DPM++ 2M Karras",
"width": width, "height": height,
"batch_size": batch,
}
r = requests.post(f"{BASE_URL}/sdapi/v1/txt2img", json=payload, timeout=600)
r.raise_for_status()
data = r.json()
stamp = time.strftime("%Y%m%d_%H%M%S")
out_dir = Path(f"output/{stamp}_seed{data['images'] and payload['seed']}")
out_dir.mkdir(parents=True, exist_ok=True)
for i, img_b64 in enumerate(data["images"]):
(out_dir / f"{i:02d}.png").write_bytes(base64.b64decode(img_b64))
# 关键:把参数与 prompt 写成 sidecar JSON,供复盘与复现
(out_dir / "params.json").write_text(
json.dumps({"payload": payload, "server_seed": data.get("seed")},
ensure_ascii=False, indent=2))
return data
if __name__ == "__main__":
txt2img({
"subject": "1girl, silver short hair, glowing mechanical left arm, black tactical jacket",
"scene": "cyberpunk alley with neon signs, heavy rain at night, rising steam",
"style": "cinematic concept art, octane render, teal and magenta color scheme",
"camera": "medium shot, low angle, 35mm lens, shallow depth of field",
})
注意最后两段:图片落盘的同时把完整请求参数写成 params.json 存在图旁边。出图不存参数,等于做实验不记笔记。
思考:💡 用中文写 Prompt 还是英文写 Prompt?
🤔 SD 系的文本编码器在英文图文对上训练,英文 tag 的命中率和社区素材兼容性明显更好;MJ 对自然语言(含中文)支持优秀,可以直接用中文长句。跨模型复用模板时建议维护一张"中文意图 → 英文 tag"映射表,让业务同学填中文、系统吐英文。
五. LoRA 与 ControlNet 解决可控性 🎛️
Prompt 只能描述"概念",解决不了两件事:固定 IP 级的一致性风格 (这个角色的脸每次都得一样)和精确的空间控制(姿势必须照这张参考图来)。对应武器是 LoRA 和 ControlNet。
5.1 LoRA:给模型打"风格补丁"
LoRA(Low-Rank Adaptation)不改底座模型权重,而是外挂一个几十到两百 MB 的低秩增量,推理时叠加进去。生图场景里它就是"专项词库+微调":一个 LoRA 可以锁定一种画风、一个角色、一套服装或一种产品外观。
参数建议(以 ComfyUI 的 LoraLoader 为例):
| 参数 | 推荐区间 | 说明 |
|---|---|---|
strength_model |
0.6 ~ 0.9 | 对 U-Net 的影响强度;拉满易"烤糊"(过拟合、色彩脏) |
strength_clip |
0.6 ~ 0.9 | 对文本编码的影响;一般与 model 同步微调 |
| 多 LoRA 叠加 | 权重之和 ≤ 1.5 | 风格 LoRA 0.7 + 角色 LoRA 0.8 是常见组合,冲突时优先降风格权重 |
| 底座匹配 | --- | SD1.5 的 LoRA 不能用在 SDXL 上,反之亦然,加载错版本直接报错或出噪点 |
定位问题也用这套:出图"不像目标风格",先升 strength_model 到 0.9 验证 LoRA 本身没训练坏,再逐步回调。
5.2 ControlNet:把构图钉死
LoRA 管"长什么样",ControlNet 管"摆在哪、什么姿势"。它从预训练模型复制一份可训练层,专门吃一种"结构参考图":OpenPose(人体骨架)、Depth(深度图)、Canny/Lineart(线稿)、Tile(结构细化)。
两个必懂的子参数:
strength(0.5 ~ 0.9):结构服从度。0.75 附近是甜点位;start_percent/end_percent(常设 0.0 ~ 0.8):只在去噪前 80% 步施加控制,最后 20% 放手让模型自由细化,否则细节会被骨架线"勒死",出现生硬边缘。
多 ControlNet 组合是生产线常态:OpenPose 0.75 定姿势 + Depth 0.4 定前后景深关系 + Canny 0.3 兜底产品轮廓,权重从主到次递减,总和控制在 1.5 以内。
5.3 固化进 ComfyUI 工作流
ComfyUI 的核心价值是"把一次性操作变成可分享、可 API 调用的确定性流水线"。一个"LoRA 风格 + 骨架控制 + 批量出图"的生产工作流,简化后的节点拓扑与关键参数如下(官方 graph JSON 更冗长,这里用示意片段表达连接关系):
json
{
"name": "cyberpunk_character_prod_v3",
"nodes": {
"CheckpointLoaderSimple": { "ckpt_name": "sd_xl_base_1.0.safetensors" },
"LoraLoader_style": { "lora_name": "cyber_neon.safetensors",
"strength_model": 0.75, "strength_clip": 0.75 },
"LoraLoader_character": { "lora_name": "girl_aurora.safetensors",
"strength_model": 0.85, "strength_clip": 0.8 },
"ControlNetLoader": { "control_net_name": "controlnet-openpose-sdxl.safetensors" },
"OpenposePreprocessor": { "image": "ref/pose_hands_on_hips.png",
"detect_resolution": 1024 },
"CLIPTextEncode_pos": { "text": "<五层模板渲染结果>" },
"CLIPTextEncode_neg": { "text": "<负面提示词>" },
"EmptyLatentImage": { "width": 1024, "height": 1024, "batch_size": 4 },
"KSampler": { "seed": 20480517, "steps": 28, "cfg": 6.5,
"sampler_name": "dpmpp_2m", "scheduler": "karras",
"denoise": 1.0 },
"ApplyControlNet": { "strength": 0.75, "start_percent": 0.0, "end_percent": 0.8 }
},
"edges": [
"Checkpoint.model → LoraLoader_style → LoraLoader_character → ApplyControlNet → KSampler.model",
"Checkpoint.clip → LoraLoader_style → LoraLoader_character → CLIPTextEncode_pos/neg → ApplyControlNet.pos/neg",
"Checkpoint.vae → VAEDecode",
"OpenposePreprocessor → ApplyControlNet; ApplyControlNet → KSampler.positive",
"EmptyLatentImage → KSampler.latent; KSampler → VAEDecode → SaveImage"
]
}
这个 JSON 文件本身就是"工艺规程":版本管理进 Git,同事导入即可完全复现你的出图行为;接上 ComfyUI 的 /prompt HTTP 接口,就从"手工节点"升级成了内部出图服务。到此为止,模型层、参数层、控制层全部固化,剩下的问题只有一个:生产出来的几百号素材,往哪儿放?
思考:💡 都工程化了,还要不要保留随机性?
🤔 要,但要把随机性圈进专门环节。成熟流程通常是"两段式":探索段用固定 seed=-1、低 CFG,一次批量 16~24 张找方向;收敛段一旦选中某张的 seed,就固定 seed、单变量微调 prompt 与 LoRA 权重做精修。随机性负责创意供给,工程化负责把创意规模化,两者不冲突。
六. 批量出图与素材管理 🗂️
出图能力解决"有没有",素材管理解决"找不找得回来"。我见过太多团队:模型越训越好,文件夹却越来越乱,最后所有人重新回 Downloads 里人肉翻图。
6.1 命名规范:文件名即元数据
推荐一个五段式命名法:
{项目}_{用途}_{版本}_{seed}_{日期}.png
proj01_cover_v3_20480517_20260827.png
配套目录结构:
assets/
├── proj01/
│ ├── raw/ # 抽卡原图,只进不改
│ ├── picked/ # 人工筛选后的候选
│ ├── final/ # 交付终稿
│ └── refs/ # pose/depth 等输入参考图
├── loras/
└── workflows/ # ComfyUI JSON 归档
要点:raw / picked / final 三级漏斗让"筛选"这个动作被目录显式表达;refs/ 常被遗忘------ControlNet 的输入骨架图、img2img 的垫图不归档,就永远无法复现"当时是拿哪张图生成的"。
6.2 版本与参数卡
图片本身用 v1/v2/v3 后缀做粗版本控制即可,但每个版本必须绑定一张"参数卡"(即第 4.3 节里 sidecar JSON 的人读版):
| 字段 | 值 |
|---|---|
| 文件 | proj01_cover_v3_20480517_20260827.png |
| 底模 | sd_xl_base_1.0 |
| LoRA | cyber_neon@0.75 + girl_aurora@0.85 |
| ControlNet | openpose@0.75 (0.0~0.8) |
| Prompt | 五层模板槽位快照 |
| seed / steps / cfg | 20480517 / 28 / 6.5 |
| 工作流版本 | workflows/prod_v3.json |
有了参数卡,"这张图再出一版夜景的"才能从一句话需求变成十分钟的定位微调,而不是三小时重新抽卡。
6.3 素材工作台:AI 生图和采集素材放在同一个货架上
做剪辑或自媒体的同事有个共性痛点:他们的素材从来不是单一来源------AI 生成的封面图、从平台采集的短视频参考片段、截图的运镜分镜、下载的 BGM 封面,散在五个文件夹三朵云里,"那半张有用的参考图"永远找不回来。
解法是把 AI 生图产物和采集素材统一进同一个"素材工作台":统一入库(下载即归档,生成即归档)、统一命名与标签(按平台/用途/风格打标,可按标签筛选预览)、统一版本跟踪。采集类工具负责"入口"------解析链接、无水印下载、批量任务、自动入库;出图类工作流负责"产出"------两边的元数据字段约定好后,AI 生成图和采集素材完全可以共用一套检索逻辑。(合规提醒:采集素材仅供个人学习和研究使用,注意遵守原平台的版权规则。)
影栈素材库界面:AI 生成图与采集素材统一管理,按平台、类型、标签筛选与预览。

素材管理的尽头不是更多的文件夹,而是"任何一张图,60 秒内能定位到它的来源、参数和用途"。这一环扣上,从 Prompt 到交付的整条链路才真正闭环。
七. 总结 📝
回到标题:从玄学到工程,转变的不是工具,而是方法。全文的清单如下------
- 原理层:生图 = 初始噪声(seed)+ 文本条件(CFG 控制服从度)+ 迭代去噪(steps/sampler);理解它们,参数才不是"玄学旋钮"。
- 路线层:WebUI 学概念,ComfyUI 建产线,Midjourney 找灵感,按任务分工而非信仰站队。
- Prompt 层:主体-场景-风格-镜头-质量五层模板化,正例每层可独立回滚,参数与图同存。
- 控制层:LoRA 锁风格与角色,ControlNet 锁结构与姿势,ComfyUI JSON 把工作流变成可版本化的工艺规程。
- 资产层:五段式命名 + raw/picked/final 漏斗 + 参数卡 + 统一素材工作台,让今天的产出成为明天的可检索资产。
玄学的本质是不可复现,工程的本质是把偶然变成流程。当你开始记录 seed,你就已经赢了百分之八十的抽卡玩家。
文中提到的批量采集与素材库管理,我自己也在用一款叫「影栈」的工具在迭代,官网搜 yc.codexaiplus.com 可见。
参考文献
1 Jonathan Ho, Ajay Jain, Pieter Abbeel. (2020). "Denoising Diffusion Probabilistic Models." NeurIPS 2020. https://arxiv.org/abs/2006.11239
2 Robin Rombach, Andreas Blattmann, Dominik Lorenz, et al. (2022). "High-Resolution Image Synthesis with Latent Diffusion Models." CVPR 2022. https://arxiv.org/abs/2112.10752
3 Chitwan Saharia, William Chan, Huiwen Chang, et al. (2022). "Classifier-Free Diffusion Guidance." arXiv:2207.12598. https://arxiv.org/abs/2207.12598
4 ComfyUI 官方仓库. https://github.com/comfyanonymous/ComfyUI
5 Midjourney Official Documentation. https://docs.midjourney.com
6 AUTOMATIC1111. Stable Diffusion WebUI. https://github.com/AUTOMATIC1111/stable-diffusion-webui