通俗易懂的理解文生图/图生图的流程

AI 摘要: 本文详细介绍了文生图(txt2img)和图生图(img2img)的工作原理及流程,结合通俗比喻和技术细节,帮助读者理解扩散模型的核心机制。内容涵盖模型微调方法(如Textual Inversion、LoRA、Dreambooth等)、商业与开源模型的对比、提升画质的关键技巧,以及硬件环境对性能的影响。作者还强调了促进高质量生成的技巧、常见误区、以及版权和伦理问题,特别是在苹果Silicon环境下的实际操作建议。全篇旨在让读者在理解原理的基础上,掌握实际操作技巧和模型优化策略,方便未来的实验与创新。

本文基于在 macOS(Apple Silicon M4 Pro)上从零搭建 Stable Diffusion WebUI 的实践过程整理而成,尽量用类比和通俗语言讲清楚背后的原理,同时保留关键的技术细节,方便日后回顾。

SDWebUI

目录

  1. 文生图 / 图生图的核心流程
  2. 术语概念大全(缩写 + 功能解读)
  3. 安装并使用 SD WebUI
  4. 文生图模型的微调方式
  5. 商业 / 开源模型对比
  6. 生成高质量图片的关键要点
  7. 其他补充(容易被忽略但很重要的点)

一、文生图 / 图生图的核心流程

1.1 一句话理解

文生图 = “从一张随机噪声图开始,一步一步’猜’出符合文字描述的画面” > 图生图 = “从一张已有的图开始,先往里面加点噪声,再用同样的’猜’的过程把它往文字描述的方向修改”

text2img

这套"猜"的过程有个专业名字叫扩散模型(Diffusion Model),因为它的训练方式借鉴了物理学里"扩散"的概念(详见第二节的名词解释)。

1.2 文生图(txt2img)完整流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[文字 Prompt]
① CLIP 文本编码器 —— 把文字变成一组"语义向量"
② 在隐空间(latent space)里生成一张随机高斯噪声"图"(由 seed 决定)
③ 循环 N 步(steps):
     UNet 网络根据【当前噪声图 + 文本向量 + 第几步】
     预测"这一步的噪声应该长什么样",然后减掉一点噪声
     (这一步同时用到 Classifier-Free Guidance,见下文)
④ 循环结束后,得到一张"干净"的隐空间图(latent)
⑤ VAE 解码器:把隐空间图还原成我们能看的像素图片
[最终生成的图片]

流程图

text2img_flow

关键理解点:

  • 为什么要在"隐空间"里操作,而不是直接对像素操作? 因为像素空间维度太高(512×512×3 ≈ 78 万个数),计算成本极高。SD 用 VAE 把图片压缩到一个更小的"隐空间"(比如 SD1.5 是 64×64×4 ≈ 1.6 万个数),所有加噪/去噪的计算都在这个小空间里做,速度快很多,最后再用 VAE"解压"回真实图片。

  • 每一步到底在干什么? UNet 并不是直接生成图片,而是预测当前图里的噪声长什么样,然后把预测出来的噪声按比例减掉一点。就像"看一张模糊的照片,猜哪部分是噪点,然后擦掉一点",重复很多次,画面就会从"全是雪花"逐渐变得清晰、有内容。

  • Classifier-Free Guidance(CFG,无分类器引导):为了让生成结果更贴合提示词,模型每一步实际上会做两次预测——一次"带着文字提示词"的预测,一次"不带提示词(空文本)“的预测,然后按公式:

    1
    
    最终噪声 = 不带提示词的噪声 + cfg_scale × (带提示词的噪声 − 不带提示词的噪声)
    

    把两者的"差异"按 cfg_scale 的强度放大,这就是为什么调高 CFG 值画面会更"听话”(但过高会导致画面过曝/过锐化,参考第六节)。

1.3 图生图(img2img)与文生图的区别

图生图不是另一套算法,而是复用了文生图的第 ②③④⑤ 步,只是第 ② 步的起点不一样

1
2
3
4
[已有图片] → VAE 编码器压缩成隐空间图 → 按 denoising strength 加一定量噪声
                              (接下来和文生图第③步完全一样,循环去噪)
  • denoising strength(重绘幅度) 是图生图特有的关键参数(0~1):
    • 值越小 → 加的噪声越少 → 去噪后越接近原图(改动小,比如只想微调色调)
    • 值越大 → 加的噪声越多 → 越接近"重新画一张"(原图只起构图参考作用)
  • 常见图生图玩法的本质区别:
    • 普通 img2img:整张图重新加噪去噪
    • Inpainting(局部重绘):只对蒙版(mask)圈出的区域加噪去噪,其余部分保持原图不变,常用于"换脸"“改背景局部"“修手”
    • Outpainting(扩图):把画布往外扩展一块空白/噪声区域,让模型基于原图边缘续画出扩展部分的内容

二、术语概念大全(缩写 + 功能解读)

术语全称 / 名字来源通俗解读
SDStable Diffusion“Stable” 来自公司名 Stability AI(品牌命名,不是"数值稳定"的技术含义);“Diffusion” 借用了热力学"扩散"的概念——训练时先把图片一步步"扩散"成纯噪声,再训练模型学会逆向"还原”
Checkpoint检查点 / 模型文件(.safetensors/.ckpt一个文件里打包了三个独立神经网络的权重:CLIP + UNet + VAE,方便一次性加载
CLIPContrastive Language-Image Pre-training(对比式图文预训练)SD 只用它的文本编码器部分:把 prompt 的文字变成一组语义向量,作为"指挥"UNet 去噪方向的信号
UNet得名于网络结构画出来呈"U"字形(下采样再上采样,两边有跳跃连接)整个流程里真正做"去噪预测"的核心网络,原本是医学图像分割用的架构,被借用来做扩散模型的骨干
VAEVariational Autoencoder(变分自编码器)编码器把像素图压缩进隐空间,解码器把隐空间图还原成像素图,相当于扩散模型的"压缩/解压工具"
Latent(隐空间)比原始像素小很多的"压缩表示空间",所有加噪/去噪计算都在这里进行,是效率的关键
Seed随机种子决定"起点那张随机噪声图"的具体样子;同一个 seed + 同一套参数 = 完全可复现的结果
Steps采样步数去噪循环执行的次数,越多细节通常越丰富,但边际收益递减,且耗时线性增加
CFG ScaleClassifier-Free Guidance Scale提示词"服从强度",见上文公式
Sampler / Scheduler采样器 / 调度器决定"每一步具体怎么减噪声"的数学方法(如 Euler a、DPM++ 2M Karras),影响出图风格、细节和收敛速度,没有绝对的"最好",需要实测
Refiner精修模型SDXL 生态里的一个可选的第二阶段模型,专门用于对已经生成大致内容的 latent 做"后半段"的精细化去噪
Hires.fixHigh Resolution Fix先在低分辨率下生成,再放大并用较低 denoising strength 重绘一次,用于突破模型原生分辨率限制、提升细节
LoRALow-Rank Adaptation(低秩适应)参数高效微调技术,只训练插在原权重旁的一小组"低秩矩阵"(几 MB~几百 MB),用来让底模学会新风格/角色,可以叠加多个
Textual Inversion文本反演不改模型权重,只学一个新的"词向量"代表某个概念,文件极小(几十 KB)
Hypernetwork超网络在注意力层旁插入小型辅助网络调整激活,是 LoRA 出现前的过渡技术,现在较少用
Dreambooth用少量图片(10~30 张)对整个 UNet 做微调,学会一个具体的人物/物体,效果最强但成本最高
ControlNet直译"控制网络"(论文/项目名)给扩散模型加一路"结构性条件输入"(边缘图、深度图、人体姿态骨架、分割图等),精确控制构图/姿势,而不仅靠文字
ADetailerAfter Detailer常用扩展,自动检测画面里的脸/手等区域并单独做二次精修,改善"远景小脸崩坏"问题
Embedding嵌入向量Textual Inversion 的产物,也泛指任何"把内容映射成向量"的技术(CLIP 的输出也是一种 embedding)
SDXLStable Diffusion XLSD 系列的"大杯"版本,原生 1024×1024,画质显著优于 SD1.5,参数量更大
SD3 / MMDiTStable Diffusion 3 / Multimodal Diffusion Transformer用 Transformer(DiT 架构)替代传统 UNet 做去噪主干,是当前新一代扩散模型的技术方向
DiTDiffusion Transformer用 Transformer 架构替代 UNet 做扩散模型骨干的统称,FLUX、SD3、Qwen-Image 等新模型都属于这一路线
VAE-ApproxVAE 近似模型WebUI 里用于生成过程"实时预览缩略图"的小型辅助模型,不影响最终画质

三、安装并使用 SD WebUI

以下是本机(macOS + Apple Silicon M4 Pro,Python 3.12,torch 2.3.1 + MPS 加速)从零搭建 AUTOMATIC1111/stable-diffusion-webui 的实践经验摘要(完整版参见 stable-diffusion-webui/安装手册和使用指南.md)。

3.1 环境要求

  • macOS Apple Silicon(arm64)
  • Python 3.12(系统自带版本过新时需手动指定,否则 torch 轮子装不上)
  • Git
  • 磁盘空间:SD1.5 约 10GB+,如需 SDXL 再加约 7GB+

3.2 安装过程中踩过的坑(重点)

  1. Python 版本不兼容:需在 webui-user.sh 里固定 python_cmd="/usr/local/bin/python3.12"
  2. 官方 Stable Diffusion 仓库 404Stability-AI/stablediffusion 已被删除,需用环境变量 STABLE_DIFFUSION_REPO 指向社区镜像仓库
  3. CLIP/open_clip 安装失败pkg_resources 缺失):新版 setuptools 移除了这个模块,需手动 pip install "setuptools<81" wheel 后再装 CLIP
  4. 部分依赖包在 arm64 + Python 3.12 下没有预编译轮子:如 scikit-imagetransformers(连带 tokenizers 编译失败)、Pillowblendmodes,需要在 requirements_versions.txt 里调整到有现成轮子的邻近版本,并用 pip install --dry-run 验证无依赖冲突

经验总结:在 macOS arm64 环境装这类项目,遇到"某个包编译失败",八成是该版本没有对应 Python 版本/架构的预编译 wheel,被迫走源码编译才暴露出各种 C++/Rust 编译器版本问题。解决思路统一:用 pip download --only-binary=:all: 先确认哪个版本有现成轮子,再用 pip install --dry-run 验证换版本后依赖树不冲突,最后才提交真正的慢安装,避免反复踩坑浪费时间。

3.3 用 Makefile 管理服务生命周期

为方便管理,封装了一个 Makefile:

1
2
3
4
5
6
7
8
9
make setup       # 首次安装依赖
make model       # 下载 SD1.5 基础模型 (~4GB)
make model-sdxl  # 下载 SDXL 1.0 base 模型 (~6.9GB) + fp16-fix VAE
make up          # 后台启动服务(默认开启 --api)
make status      # 查看运行状态
make logs        # 实时查看日志
make open        # 浏览器打开 WebUI
make restart     # 重启
make down        # 停止服务(优雅终止 + 超时强杀)

3.4 REST API 调用示例

WebUI 内置的 Gradio 界面和 FastAPI REST API 跑在同一进程/端口上,--api 参数开启后即可直接用 HTTP 调用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
curl -s -X POST http://127.0.0.1:7860/sdapi/v1/txt2img \
  -H "Content-Type: application/json" \
  -d '{
        "prompt": "a cute cat, best quality, highly detailed",
        "negative_prompt": "worst quality, low quality, blurry",
        "steps": 20,
        "width": 1024,
        "height": 1024,
        "cfg_scale": 7,
        "sampler_name": "DPM++ 2M Karras"
      }'

返回的 images 字段是 base64 编码的图片数据,解码即可保存为 PNG。图生图对应 /sdapi/v1/img2img,额外需要传 init_images(base64 数组)和 denoising_strength

3.5 升级到 SDXL 需要注意的两个坑

  1. 首次加载会自动下载第二个文本编码器(OpenCLIP ViT-bigG-14,约 10.2GB,只需一次,之后走本地缓存)
  2. 生成时可能报 CERTIFICATE_VERIFY_FAILED:python.org 发行的 Python 未关联系统根证书库,导致下载"预览缩略图辅助模型"(vaeapprox-sdxl.pt)失败,用 curl 手动下载放到 models/VAE-approx/ 即可绕过

实测:SDXL 1024×1024、20 步耗时约 51 秒(M4 Pro,MPS),画质(毛发/光影细节)明显优于 SD1.5。


四、文生图模型的微调方式

Civitai 等社区上五花八门的"风格化模型",本质都是拿官方底模(如 SD1.5)做起点,用不同强度的技术微调出来的:

方法原理产出文件大小特点
Textual Inversion只学一个新词向量,不改模型权重几十 KB最轻量,表达力有限
Hypernetwork注意力层旁插小型辅助网络几十 MB已基本被 LoRA 取代
LoRA插入低秩矩阵,只训练新增的小部分参数几 MB~百 MB目前最主流,训练快、可叠加
Dreambooth用少量图片对整个 UNet 做微调完整 checkpoint(几 GB)效果最强、最贴近训练素材,成本最高
Checkpoint Merge把多个现成 checkpoint 按权重线性插值合并(不算真正的"训练")完整 checkpoint零训练成本,效果靠经验调配比

常用工具

  • Kohya_ss GUI——社区训练 LoRA/Dreambooth 最主流的工具
  • WebUI 自带 Train 标签页——支持 Textual Inversion / Hypernetwork
  • diffusers 官方训练脚本(train_dreambooth_lora.py 等)——纯代码路线,跨平台

在 Apple Silicon 上做训练是可行的,但耗时和内存开销明显高于推理,LoRA 训练是最现实的起点;全量 Dreambooth 建议量力而行或考虑云端 GPU。


五、商业 / 开源模型对比

商业模型(截至本文整理时)

模型厂商特点
MidjourneyMidjourney Inc.艺术性、氛围感极强,长期是"美感"标杆,但可控性(精确构图/文字)较弱
DALL·E 3OpenAI对复杂长提示词理解能力强,文字渲染较好,与 ChatGPT 深度集成
ImagenGoogle语义理解和文字渲染能力突出,多在 Google 生态产品内使用

开源模型

模型特点
SD1.5生态最成熟(LoRA/ControlNet 数量最多),速度快,但原生分辨率低、细节弱
SDXL 1.0原生 1024×1024,画质显著提升,生态仅次于 SD1.5
SD3 Medium采用 MMDiT(Transformer 架构),语义理解更强,但社区生态和许可证条款需留意
FLUX目前开源文生图里综合质量最强的方向之一,文字渲染能力突出,DiT 架构
Kolors(快手)用 ChatGLM3 做文本编码器,中文原生支持好,是中文 prompt 场景的优选
Qwen-Image(阿里)DiT 架构,中文语义理解强,国产模型里综合实力较强的选择

选型建议:追求生态成熟度和速度 → SD1.5;追求画质且愿意等待/换硬件 → SDXL 或 FLUX;中文 prompt 场景 → Kolors / Qwen-Image(但这些是 diffusers 格式的独立 pipeline,不能直接放进 AUTOMATIC1111 WebUI 当 checkpoint 用,需要用 diffusers 库或 ComfyUI 单独跑)。


六、生成高质量图片的关键要点

  1. 提示词结构化主体, 细节, 风格/艺术家, 光线/镜头参数, 质量tag,质量类 tag 放靠前权重更高
  2. 善用权重语法(word:1.2) 增强、(word:0.8) 减弱某个词
  3. 负向提示词不能省:常用组合 worst quality, low quality, blurry, bad anatomy, extra fingers, watermark
  4. 采样器 + 步数DPM++ 2M Karras 20~30 步性价比高,探索阶段可用 Euler a 感受随机变化
  5. CFG Scale 别贪高:7 左右最均衡,过高(>12)容易过饱和/过锐化
  6. 开启 Hires.fix:SD1.5 尤其重要,突破 512×512 分辨率限制、避免构图崩坏
  7. 换一个好的底模:同样的提示词,社区微调过的底模效果往往远好于官方原始模型
  8. 固定 seed 做对比实验:调参时只改一个变量,才能准确判断该参数的实际影响
  9. 分辨率要匹配模型的"原生尺寸":SD1.5 建议贴近 512×512,SDXL/SD3 建议贴近 1024×1024,超出太多容易画面崩坏

七、其他补充(容易被忽略但值得注意的点)

除了上面列的六个方向,整理过程中还发现下面这些点值得一并了解:

7.1 图生图特有的进阶玩法

  • Inpainting(局部重绘):配合蒙版工具,只修改画面局部(换脸、改背景、修手),是目前修复 AI 生成图"手部/五官崩坏"最常用的手段
  • Outpainting(扩图):把画布向外扩展,让模型续画边缘之外的内容,适合"横图转竖图"“补全裁切"等场景
  • ControlNet 的实际价值:单靠文字很难精确控制"人物姿势"“构图透视”,ControlNet 配合深度图/骨架图后,才能真正做到"按图施工”,是从"随缘抽卡"到"精确控制"的关键一步

7.2 硬件与性能的取舍

  • Apple Silicon 走的是 MPS 加速,没有 CUDA 生态下的 xformers/TensorRT 等专属优化,同等参数量下比 NVIDIA GPU 慢
  • 统一内存架构下,理论上"显存"=系统内存,跑 SDXL/SD3 这类大模型比独立显卡的 8GB/12GB 显存机型更宽松,但速度仍受算力(不是内存)瓶颈制约
  • 内存紧张时可加 --medvram / --medvram-sdxl 参数,用速度换内存占用

7.3 版权与伦理注意事项(容易被忽视但很重要)

  • 训练数据版权争议:主流开源模型的训练集里包含大量未经授权的网络图片,多个艺术家/图库公司已对相关公司提起诉讼,商用前需了解目标模型的许可证条款
  • 生成结果的版权归属:不同法域对"AI 生成内容能否受版权保护"的认定不一致(如美国版权局目前倾向于不保护纯 AI 生成、无实质人工创作的作品),商业化使用前建议咨询法务
  • 许可证条款差异大:如 SD3 Medium 用的是 Stability AI 社区许可证,超过一定收入门槛需要付费商用授权;FLUX 也分开源版(non-commercial 为主)和商用版,用之前一定要看清楚条款
  • 深度伪造/不良内容风险:真人换脸、名人肖像生成等场景涉及肖像权和法律合规风险,各大模型/平台通常都有内容安全策略,自建环境使用时需自行承担合规责任

7.4 生态工具的选择

7.5 实用资源站点

7.6 常见认知误区

  • ❌ “步数(steps)越多质量越好” → 超过一定步数后收益递减,甚至可能因过度收敛变得死板,20~30 步通常已经足够
  • ❌ “CFG 越高越听话越好” → 过高会导致画面过曝、色彩失真、细节丢失
  • ❌ “分辨率越高越好” → 超出模型原生训练分辨率太多,容易出现多头/肢体错乱等"分辨率外推"问题,应配合 Hires.fix 而不是直接调大宽高
  • ❌ “中文 prompt 效果差是 bug” → 本质是训练数据语言分布导致的正常现象(SD 系列的 CLIP 主要在英文图文对上训练),换用 Kolors 等中文原生模型才是根本解法