图生图中的 strength 参数如何理解?
简化版
图生图先把输入图编码成 latent,再加到某个噪声程度,从该位置开始逆扩散。strength 通常控制起始噪声有多大:越低越保留原图,越高越允许模型重画构图和语义。
它不是线性的“保留百分比”,不同 Scheduler 对时间步和 sigma 的映射不同。即使 strength 为 0,VAE 重建也可能改变像素;strength 为 1 也不一定完全忘记输入。要联合 Prompt、CFG、采样步数和结构控制评测。
strength 控制的是采样轨迹从哪里开始,不是简单的图层透明度。
详细版
典型流程为:
input image -> VAE encode -> z0
t_start = map(strength, scheduler timesteps)
z_t = √ᾱ_t z0 + √(1-ᾱ_t) ε
z_t -> denoise from t_start to 0 -> decode
若总推理步数为 50,某实现用 init_timestep=floor(50×strength):strength=0.4 约从 20 个噪声步对应的位置开始,实际去噪约 20 步。但不同库会处理 offset、最小步数和时间步子序列,不能把这个公式视为通用 API 契约。
| strength 区间 | 常见效果 | 风险 |
|---|---|---|
| 0~0.2 | 颜色、纹理轻微变化 | VAE 误差仍存在,Prompt 作用弱 |
| 0.2~0.5 | 保持布局并改变风格 | 局部结构可能漂移 |
| 0.5~0.8 | 明显重绘,语义可变化 | 身份与几何一致性下降 |
| 0.8~1.0 | 接近文生图自由度 | 输入图约束可能很弱 |
以上只适合作为起始经验。真正参数应在目标模型、Scheduler 和任务上,用感知相似度、结构指标与人评共同选择。
完整版教学
1. 图生图不是直接修改像素
输入图通常先经过 VAE 编码,得到潜变量 z0。Pipeline 选择一个噪声时间步,把随机噪声混入 z0,然后按文本条件去噪。
因此输出同时受输入 latent、随机噪声、Prompt 和基础模型先验影响。strength 主要改变输入信息与模型先验之间的权衡。
2. strength 如何映射到时间步
常见实现先按总步数计算起始索引,再截取 Scheduler 时间步:
init_steps = min(int(num_steps * strength), num_steps)
t_start_index = num_steps - init_steps
timesteps = scheduler.timesteps[t_start_index:]
如果 num_steps=40、strength=0.25,可能只执行约 10 个逆向步骤。边界取整意味着很小参数变化可能没有任何效果,直到跨过下一个离散索引。
3. 为什么参数效果不是线性的
时间步与 SNR 非线性对应。strength 从 0.2 增至 0.4,不代表噪声方差恰好翻倍;具体取决于 ᾱ_t 或 sigma 网格。
更严谨的系统可以直接展示起始 SNR:
signal fraction = ᾱ_t
noise fraction = 1 - ᾱ_t
SNR = ᾱ_t / (1-ᾱ_t)
这比跨不同 Scheduler 比较同名 strength 更可靠。
4. strength=0 为什么也可能改变图片
图片经过 VAE encode/decode 是有损重建,小字、细线和颜色可能已经变化。有些 Pipeline 还会强制执行至少一个去噪步,或把 0 映射到最小非零时间步。
若业务要求像素级不变区域,应使用遮罩合成保留原像素,而不是指望低 strength 实现无损编辑。
5. strength=1 为什么不一定等于纯文生图
理论上最高噪声应接近纯高斯,但训练终端 SNR 可能不严格为 0,初始 latent 仍残留微弱信息;实现还可能没有选择真正的最大训练时间步。
若要文生图,应直接从标准噪声初始化。把 img2img 的 strength 拉满只适合近似比较,不应作为严格等价保证。
6. 与 Prompt 和 CFG 如何相互作用
低 strength 保留大量原图信号,Prompt 很难改变主体;高 strength 给文本更多控制权。CFG 过高又可能让输出过度追随文本、破坏输入结构。
| 目标 | strength | CFG 思路 | 辅助方法 |
|---|---|---|---|
| 轻度调色 | 低 | 中低 | 色彩后处理 |
| 风格迁移 | 中 | 中等 | 风格 LoRA/IP-Adapter |
| 换场景保人物 | 中高 | 适中 | 身份参考与分割遮罩 |
| 大幅重构 | 高 | 按文生图调 | ControlNet 保留几何 |
不能孤立调 strength,应把它放在完整控制组合中。
7. 与采样步数的耦合
许多实现把有效去噪步数设为 num_steps×strength。同样 strength=0.5,20 总步数可能只执行 10 步,50 总步数执行 25 步,质量和延迟都不同。
比较参数时要记录有效时间步序列,而不只是 UI 显示值。极少的有效步数可能造成残余噪声或细节不足。
8. 保结构时为什么需要额外条件
strength 只控制整体加噪,无法指定“保留姿态但改变衣服”。当噪声足以改变衣服时,也可能破坏姿态。
可使用边缘、深度、姿态 ControlNet,身份适配器或区域遮罩,把不同约束显式分离。结构要求越严格,越不应只靠一个全局标量。
9. 如何评测 strength 曲线
固定初始噪声、Prompt、Scheduler 和 CFG,扫描 0.1~0.9。对每个点记录:
LPIPS / SSIM:与输入的感知或结构相似
CLIP:与目标 Prompt 对齐
身份相似度:人物或产品是否保持
人评:编辑是否自然、是否满足意图
失败率:结构崩坏、伪影、文字损伤
理想选择通常在“输入保持”和“编辑成功”两条曲线的拐点,而不是某个通用默认值。
10. 常见误区与追问
- 误区:strength=0.3 表示保留 70% 像素。 它映射到噪声时间步,不是像素混合比例。
- 误区:相同 strength 在所有 Scheduler 中含义相同。 时间步与 sigma 网格不同,实际 SNR 会变化。
- 误区:strength=0 可以无损输出原图。 VAE 重建和最小步数仍可能改变像素。
- 误区:提高 strength 只改变风格。 高噪声会同时影响身份、构图和对象数量。
- 误区:固定 strength 后总步数可随意变化。 有效去噪步数通常随总步数改变。
- 追问:如何既换风格又保姿态? 使用中等 strength,并加入姿态、深度或边缘控制。
- 追问:如何跨实现对齐 strength? 比较实际起始 timestep、sigma 或 SNR,而不是只比较标量。
11. 加强记忆
- 流程:编码、加噪、从中间时间步去噪、解码。
- 含义:strength 决定起始噪声,不是像素保留率。
- 边界:0 有 VAE 误差,1 也未必等同纯文生图。
- 耦合:Scheduler、总步数、Prompt 和 CFG 会一起改变结果。
- 强约束:精确保结构要用遮罩、ControlNet 或参考条件。