在生图工作流里,角色脸部漂移通常不是单一因素造成的。有人习惯把问题归因于随机种子没有固定,于是把Seed抄下来重复使用,结果发现构图虽然稳住了,五官仍然会变。这个现象背后有两个独立的控制维度:随机噪声路径和参考图像约束。只固定Seed,等于只控制了前者;要让脸稳定,还需要让模型在采样过程中持续接收到参考脸的信息。

为什么只锁Seed不够
在扩散模型里,Seed决定的是初始噪声张量。推理时,模型从一个随机噪声开始,逐步去噪得到图像。固定Seed意味着每次的初始噪声完全相同,因此只要模型、提示词、采样器、步数和CFG等参数都不变,输出就能复现。这也是为什么很多人把固定Seed当成复现画面的第一步。
但问题在于,脸部属于高频细节区域,对去噪过程中的微小扰动非常敏感。当你修改提示词中的服装、背景或光线描述时,模型的注意力分布会发生变化,即使初始噪声相同,去噪轨迹也会在中后段分叉,导致五官位置、眼距、嘴型等出现漂移。更常见的情况是,你只是想给角色换一套衣服,结果脸部也一起变了。这说明Seed只能锁住整体构图和粗粒度结构,并不能独立锁住身份特征。
可以把Seed理解成相机底片,它决定了照片的大致取景和明暗结构,但被摄对象的脸长什么样,并不会因为底片相同就被固定下来。要让脸部稳定,还需要额外的条件约束。
参考图像权重如何把脸拉回来
参考图像权重是一类把参考图信息注入扩散过程的机制。它在不同工具里有不同叫法:在图生图里是strength或重绘幅度;在ControlNet里可以是Reference-only模式;在IP-Adapter里则表现为scale或权重参数。无论名称如何,它们做的事情类似:在每一步去噪中,把参考图经过编码得到的特征与当前潜空间特征进行融合,强度由权重控制。
强度并不是越高越好。以图生图为例,strength值越低,参考图的构图和姿势保留得越多,但如果你把参考图换成另一张角色脸,低强度会导致生成结果仍然贴近原图构图,脸部可能融合不到位;strength值越高,模型自由发挥的空间越大,但参考脸的特征也可能被冲淡。通常需要把身份注入和重绘幅度分开处理,避免用单一参数同时控制构图与脸部。
IP-Adapter的设计更贴近脸部一致性的需求。它通过交叉注意力模块把参考图的图像特征直接嵌入文本条件,因此可以在不改变原始提示词结构的情况下,让模型持续看到参考脸。权重一般设在0.6到0.9之间比较稳,低于0.5时身份会减弱,高于1.0时容易出现表情僵硬或风格污染。
参数组合与代码示例
下面用Python和diffusers库演示一个固定Seed的图生图流程。假设你已经有一张角色参考图,需要生成一张新图,同时保持脸部特征。
import torch
from diffusers import StableDiffusionImg2ImgPipeline
from PIL import Image
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe.to("cuda")
ref_image = Image.open("character_reference.png").convert("RGB").resize((512, 512))
generator = torch.Generator(device="cuda").manual_seed(20240817)
result = pipe(
prompt="1girl, silver hair, blue eyes, portrait, soft light",
image=ref_image,
strength=0.55,
guidance_scale=7.5,
generator=generator,
).images[0]
result.save("output_character.png")
这段代码中,manual_seed固定了初始噪声,strength决定了参考图被保留的力度。要强调的是,0.55这个值属于通用起点,适合参考图和目标图在构图、姿势上差别不大的情况。如果目标图需要较大幅度的姿势变化,应该把strength提高到0.7左右,并配合ControlNet的OpenPose或Reference模式,避免参考图过强地锁住原构图。
如果你使用的是WebUI而不是代码,可以把Seed参数固定,然后切换图生图页签,填入参考图并设置重绘幅度。对于更精细的脸部控制,建议安装ControlNet的Reference-only预处理器或IP-Adapter扩展。在IP-Adapter里,参考图像权重通常用weight或scale表示,控制的是图像特征进入交叉注意力的比例。它和strength并不冲突,可以叠加使用。
两步法操作流程
实际生成角色系列图时,不建议从零开始每张都调一堆参数。更稳妥的做法是两步法:先固定一组提示词和Seed,在文生图里生成一张满意的角色正面图,保存为角色基准;然后以这张基准图为参考图,进入图生图或IP-Adapter流程,再修改动作、服装、场景等提示词。这样脸部的锚点始终来自同一张图,变化范围会小很多。
两步法的好处是分工明确。第一步解决角色创建,把脸部特征、发型、瞳色等基础元素定下来;第二步解决变量扩展,在不破坏身份的前提下改变其他属性。例如生成同一个银发角色在不同场景中的图片时,保持参考图和Seed不变,只调整提示词里的背景和姿势描述,再配合ControlNet控制构图。
还需要注意,参考图不要频繁更换。如果你每张图都用前一张输出作为新参考,脸部会像传话游戏一样慢慢漂移。应该始终使用最初那张基准图进行图生图或IP-Adapter,避免误差累积。
常见翻车与调参建议
权重过高导致的典型问题是表情僵硬,尤其在使用Reference-only模式时,模型过度依赖参考图的像素分布,生成的脸看起来像是贴上去的。此时可以降低参考权重,或者提高采样步数,让模型有更多空间融合特征。另一个常见问题是固定了Seed但换了采样器,结果仍然变化明显。不同采样器的去噪路径不同,固定Seed只能保证同采样器下的复现,换采样器后需要重新锁定参数。
低步数也会放大脸部不稳定。脸部区域细节多,步数如果只有20步,去噪过程可能还没有充分收敛,导致五官位置出现随机偏移。建议在保持一致性的任务中把步数提高到30步以上,CFG控制在7到9之间。如果画面整体发灰或色彩偏差,可以微调CFG,但不要超过12,否则脸部会被过度锐化。
最后要注意,参考图像权重只解决身份注入,不能替代基础模型的质量。如果底模对人脸训练不充分,或者提示词里同时出现了互相冲突的发色、瞳色描述,即使参数正确,脸部仍可能漂移。保持提示词里角色特征描述的一致性,并且尽量使用同一底模,是稳定输出的前提。