简介:本文系统解析两阶段扩散生成模型的内在运行机制:从潜空间压缩、扩散去噪、条件编码这些基础概念,到"基础模型定构图、精修模型补细节"的分工逻辑,再到潜空间放大与分区构图如何实现区域可控的高分辨率出图。帮助读者理解每一步"为什么这样设计、内部模块如何协作",理清从"随机惊喜"走向"可控构图+细节质感"的原理脉络与工程边界。
我们平时用图形化节点工具搭建的图像生成链路,本质上是一套两阶段潜空间扩散生成流程。它不是”输入提示词→直接吐出图片”的魔法,而是由若干职责清晰的模块串成的一条数据处理流水线。本文要解释的,就是这条流水线背后的核心机制:
理解了这三件事,你就从”会拖节点”升级为”懂机制”——知道每个节点在做什么、参数改了会连锁影响什么、以及为什么这样做有效。
如果只用一个采样器、一次去噪就把图生成出来,会同时暴露三个矛盾:
两阶段架构 + 潜空间放大 + 分区构图,正是针对这三个矛盾的工程解法。
1. 潜空间(Latent Space)与变分自编码器(VAE)
扩散模型并不会直接在像素图上做去噪,而是先用一个变分自编码器把图像压缩成低维潜空间张量(例如空间分辨率降为 1/8,通道数远多于 3)。所有去噪计算都发生在这个”信息浓缩版”里。这样做的根本原因是:潜空间去掉了像素级冗余,计算量骤降,模型只需关注语义与结构。
2. 扩散与去噪(Diffusion / Denoising)
生成过程从一张纯高斯噪声出发,采样器按时间步(timestep,对应噪声强度)一步步预测并减去噪声。步数越靠前噪声越大,决定大结构;越靠后噪声越小,负责精修高频细节。
3. 条件编码(文本编码器 + 交叉注意力)
提示词先被文本编码器转成一组向量(即 CONDITIONING),再通过交叉注意力机制注入到去噪网络。这一步是”提示词如何影响画面”的物理通道——它决定了哪些概念应该出现在结果里。
4. 无分类器引导(Classifier-Free Guidance, CFG)
去噪时同时计算”有条件预测”和”无条件预测”,按 CFG 比例外推,让画面更贴合提示词。CFG 过高会导致过饱和、结构僵硬,过低则提示词失效,这是理解后面参数调节的关键。
一条完整的两阶段高分辨率链路,可以按职责拆成六类角色:
| 模块 | 职责 | 关键输入/输出 |
|---|---|---|
| 加载模块 | 载入基础模型/精修模型的权重,产出 MODEL / CLIP(文本编码) / VAE | 权重文件 → 三类句柄 |
| 条件编码模块 | 把正负提示词编码为 CONDITIONING | 文本 → 条件向量 |
| 潜空间初始化 | 提供噪声画布(如 1024×1024 对应的潜张量) | 尺寸 → LATENT |
| 采样器(基础/精修) | 执行扩散去噪,是整个链路的”计算核心” | 模型+条件+潜空间 → 去噪后潜空间 |
| 潜空间放大 | 放大潜张量并做轻度再采样,恢复细节 | 潜张量 → 高分辨率潜张量 |
| 解码与保存 | VAE 解码为像素图并输出 | 潜张量 → 图像 |
以”基础链 + 分区构图 + 精修闭环 + 高分辨率放大”为例,完整链路如下:
第一步:准备基础链(建立构图骨架)
load_checkpoint(base) # 输出 model, text_encoder, vaepos = encode_positive(prompt) # 正提示词编码neg = encode_negative(prompt) # 负提示词编码latent = empty_latent(w, h) # 噪声画布sampled = KSampler(base_model, pos, neg, latent, steps, cfg)image = VAE_decode(sampled, vae)save(image)
此时得到的是一张结构成立但细节一般的图,它是后续所有精修与放大的”锚点”。
第二步:接入精修模型(两阶段交接)
基础模型只跑前若干时间步(如去噪进度到 20%–30%),负责把大构图和光影结构定下来;随后把这份”半去噪的潜空间”交给精修模型,由它跑完剩余时间步,补齐高频细节。
latent_stage1 = KSampler_partial(base_model, ..., denoise=0.3) # 只去噪一部分latent_stage2 = KSampler_partial(refiner_model, latent_stage1, denoise=0.7)
为什么这样分工有效:去噪的”高噪声段”天然决定全局结构,”低噪声段”负责局部精修。让擅长结构的基础模型处理高噪声段、让精修模型接手低噪声段,等于把不同尺度的活分给更合适的模型,这也是”双阶段架构”的核心逻辑。
第三步:潜空间放大(高分辨率出图)
在潜空间层面把潜张量按目标倍率(如 1.5×/2×)插值放大,再用采样器以较低的去噪强度重新跑一小段:
latent_big = upscale(latent_stage2, scale=1.5) # 潜空间插值放大latent_big = KSampler_partial(model, latent_big, denoise=0.3~0.5)image = VAE_decode(latent_big)
为什么不能直接在像素上放大:普通图像放大只是插值补像素,得到的是”模糊的放大”。而潜空间放大后做一次轻度去噪,等于让模型在新尺度上重新想象高频细节,把插值产生的模糊用扩散去噪”补实”,因此在保留原构图的同时获得真实的细节锐度。
第四步:分区构图(区域可控)
将画面划分为若干区域,为每个区域准备独立的正向条件,再合成到采样器的条件输入中:
region_cond = {(0.0, 0.0, 0.5, 1.0): encode("左侧主体"),(0.5, 0.0, 1.0, 1.0): encode("右侧背景"),}combined_cond = combine_conditioning(region_cond) # 按区域与权重融合sampled = KSampler(model, combined_cond, neg, latent, ...)
为什么能实现区域控制:条件是通过交叉注意力作用于潜空间的空间位置的。当不同区域被赋予不同条件向量并加权合成时,采样器在不同空间区域会接受到不同的引导信号,从而让”左边一个样、右边另一个样”。
机制一:两阶段为什么比单阶段好
单阶段模型要在同一次去噪里同时管结构和高频细节,资源紧张;两阶段通过按时间步交接,让每个模型只需在自己擅长的噪声区间发力。代价是需要两个权重、交接点(denoise 分界)需要调,分界过早会细节不足,过晚会丢失精修价值。
机制二:潜空间放大为什么”可控且高效”
机制三:分区构图靠”条件—空间”的映射成立
其成立前提是潜空间具备空间结构、条件通过注意力可以定位到具体区域。若区域划分与提示词语义冲突(比如某物体天然跨区),或权重分配失衡,合成条件会互相打架,出现区域边界生硬或概念污染。分区越细,越需要控制各区域权重的平衡。
机制四:CFG 与去噪步数是”隐藏调节阀”
CFG 控制贴合度,步数控制迭代精度。理解这两个量的作用,才能解释”为什么图过曝/结构崩/提示词不生效”等现象——它们不是玄学,而是扩散迭代的数学结果。
# 阶段0:准备base, clip, vae = load_checkpoint(base_path)refiner, _, _ = load_checkpoint(refiner_path)pos, neg = encode(clip, prompt), encode(clip, negative)# 阶段1:基础模型定构图(高噪声段)latent = empty_latent(width=1024, height=1024)latent = sample(base, pos, neg, latent, steps=30, cfg=7,denoise_start=0.0, denoise_end=0.30)# 阶段2:精修模型补细节(低噪声段)latent = sample(refiner, pos, neg, latent, steps=30, cfg=7,denoise_start=0.30, denoise_end=1.0)# 阶段3:潜空间放大 + 轻度再采样latent = latent_upscale(latent, scale=1.5)latent = sample(base, pos, neg, latent, steps=30, cfg=7,denoise_start=0.0, denoise_end=0.40)# 阶段4(可选):分区构图条件合成后重采# combined = combine(areas); sample(..., condition=combined)image = vae_decode(latent, vae)
优势:结构与细节解耦带来更稳的高分输出;潜空间放大的算力效率高;分区构图把”随机”变成”可控”。这三者组合,使从”能出图”到”出得好”成为可复现的工程流程。
边界:
这套技术的核心,是把图像生成理解成”在潜空间里、按噪声尺度分阶段、通过条件引导的迭代去噪过程“。两阶段架构解决了”结构与细节抢算力”的矛盾,潜空间放大解决了”分辨率与稳定性”的矛盾,分区构图解决了”随机性”的矛盾。三者共同把生成从”碰运气”变成一条可解释、可复现的流水线。理解了潜空间、扩散去噪、条件注入这三条主线,再复杂的链路也不过是在这套机制上做参数编排。