上一篇讲的是风格参考:它给你一套味道,但没法只给你味道,内容会跟着一起过来。人物一致是更硬的一个要求——不是“味道像”,而是不管这个人换了姿势、换了场景、换了镜头,出来的还得是同一个人。
做系列图、做角色素材的人几乎都会撞上这堵墙:第一张图里的那张脸你很满意,第二张里她笑起来就不像了,第三张干脆换了一个人。这一篇把“脸为什么会漂”拆开,然后讲清三条能把身份钉住的路子,以及各自的代价。
模型里根本没有“这个人”可以调出来
第一篇讲过,扩散模型出图是从一团随机噪声开始,一步步去噪成图,种子决定这一抽落在分布里的哪个位置。这里要补的是:脸不是从某个档案里被调出来的,而是每一次去噪当场长出来的。
所以“固定种子 + 固定提示词”确实能让脸几乎不变,但它锁住的是整张图——连背景、姿势、光线一起锁住。你只要把姿势从站着改成坐着,去噪的轨迹整条变了,脸也跟着变。这不是模型忘了这个人,而是它从来没有记住过这个人。每次生成都是照着描述重新捏一张脸。
那为什么不干脆把脸写进提示词?因为文字的带宽不够。你可以写“二十多岁的女性,黑色短发,圆脸,单眼皮”,这些词描述的是一类人,对应的脸有成千上万张。文字编码器擅长的是类别和属性,不是“具体这一个”。InstantID 那篇工作里说得很直接:对身份保持来说,CLIP 这类图像表示的语义太粗4。
这一点正好接上上一篇的结论。上一篇说 CLIP 图像向量把颜色、质感、布局、主体全塞在一起,没有“只取风格”的干净接口。身份比风格还要细——它藏在五官的比例和细节里。你手上的每一个输入通道(文字、种子、风格参考),要么太粗,要么太杂。
需要的是一条“只管是谁”的窄通道
既然现成通道都不合适,那就得造一条专门传身份的通道,而且它必须满足一个条件:对姿势、表情、光线不敏感。同一个人侧过脸、皱起眉、走到暗处,通道传出来的东西要基本不变。
人脸识别模型就是被训练成这样的。这类模型(ArcFace 这一支,在开源工具里通常以 InsightFace 的形式出现)的学习目标是:同一个人的不同照片——正脸、侧脸、暗光、笑着的——在它输出的向量空间里尽量靠拢,不同人的脸尽量推开25。它输出的那个向量常被叫作 ID embedding,也就是身份向量。这个“靠拢”不是模型天生会做的事,是被训练目标逼出来的。正因如此,它比 CLIP 图像向量窄得多:CLIP 把颜色、质感、布局、主体全装在一起,而身份向量被逼着尽量只留下“这是谁”。
IP-Adapter-FaceID 走的正是这条路:把原来的 CLIP 图像向量换成身份向量,另外再训一个 LoRA 来提升一致度23。但它的文档也承认这一步不免费:身份向量比 CLIP 向量难学得多,而且 单独喂身份向量时结果不稳定,很容易被提示词带走。所以后来的 Plus 版本干脆把两样一起用——身份向量管“是谁”,CLIP 向量管“脸摆成什么结构”2。代价也很好预料:CLIP 那一路会把脸型、角度这些结构信息一起带回来,于是图片能改的东西变少了。
InstantID 换了个思路:身份向量照用,但空间约束只给五个面部关键点(两只眼睛、鼻子、嘴角),故意做得很弱——它不规定脸型,也不规定嘴张开还是闭上,所以表情和姿态还能改,脸的固定程度却上来了。它把身份向量送进一个改造过的 ControlNet,在这条支路里干脆不用文字提示,免得文字把别的属性混进来45。它的官方仓库给的调法直白得可以当操作口诀:想让结果更像本人,就把身份向量那一路和 IdentityNet 的权重一起调高;想让文字更说了算、方便改风格,就把身份那一路调低5。
另一条路:把这个人的身份训进模型
上面几条都是“外部通道”——每次生成时临时把身份向量塞进去。还有一条完全不同的路:训练。
DreamBooth 的做法是,给你 3 到 5 张某个主体的照片,微调模型,把这个主体绑到一个平时没人用的稀有词上,比如让 [V] 专指这只狗、这个人,然后用提示词 a [V] dog 生成新场景里的同一只狗6。它还要配一个“先验保持损失”,用意是防止模型训完之后忘了这一类东西长什么样——论文里管这个叫语言漂移:模型可能慢慢觉得“狗”就等于你这只狗6。
这条路的效果通常比外部通道更稳、对姿势和表情更宽容,代价是要准备一组多角度的照片并花时间训练。好消息是成本在降:LoRA 只训模型里很小一部分参数(产出的文件通常一百多 MB),后续工作已经能把针对人脸的个人化压到几十秒级别679。
落到具体参数上:--cref 和 --cw
Midjourney 里对应的是人物参考:--cref 后面接参考图地址。--cw 控制从参考人物身上取多少,取值 100 到 0,默认 100:100 会把脸、头发、衣服都带上;调到 0 就只管脸,官方说明这个档位适合换服装、换发型1。
这里有个容易和上一篇混淆的地方。上一篇的 --sw 是强度旋钮:调的是参考图整体影响多强,风格味道和内容残影一起浓淡。--cw 不是强度,是范围:它决定从参考人物身上取哪些部分。有使用教程把这一点总结成——把值调大是让 更多特征 变得相似,而不是让 每个特征 更像8。
同一条官方说明也列出了它的边界:它不会精确复制酒窝、雀斑、T 恤上的 logo;它不是为真实人物照片设计的,用真人照片容易走形;画面里有多个角色时它处理不好,往往让所有人都长成同一个18。它最擅长的输入,恰恰是 Midjourney 自己生成的图,而且可以和风格参考 --sref 叠着用。
稳定的是什么,不稳定的又是什么
第一,先想清楚你要哪种一致。 如果你要的是“这张图改一点点”,固定种子加固定提示词就够了。如果你要的是“同一个人换场景换姿势”,种子没用,必须有身份通道或训练。
第二,保真度和可编辑性是一对反向的力。 身份那一路给得越重,脸越像、越难漂,但姿势、表情、发型也越难改;想改就得把它调弱一点。InstantID 的权重建议和 --cw 的高低调法,本质上都是在拨这根杆。
第三,窄通道只保证“是谁”,不保证全部细节。 雀斑、疤、耳环、logo 这类细节不在身份向量里,这也是官方直接承认的精度上限。
第四,文字该写的还得写满。 身份通道只负责“是哪个人”,姿势、镜头、服装、光线这些还是你来写。你不写的部分,模型就自己填——上一篇里“腾出来的空间会被参考图灌进去”,在这里同样成立。