我最早入坑 AI 绘画的时候,花最多时间做的事不是调提示词,而是"追同一张脸"。

我用 Midjourney 精心生成了一个自己非常满意的角色——一个穿深色大衣、微卷短发的东方女人,构图、光影、氛围全都对了。然后我把场景描述从"城市街头"改成了"雪地"。出来的那个女人……完全变了一个人。五官不对,脸型不对,连眼神都变了。
我当时的反应和大多数人一样:是我的提示词写得不详细。于是我在提示词里加上"瓜子脸、高鼻梁、丹凤眼"。结果呢?出来的是另一个人。再改,又是一个人。那段时间我一度怀疑自己的中文水平不够好。
直到后来我开始认真研究图像生成的原理,才突然想明白:问题不在你的文字功夫,而是文字这套符号系统,压根就装不下一张脸。
一张脸的信息量,文字装不下
你凭一段文字能确认一个陌生人的长相吗?"三十多岁的中国男人",这句话在全中国有上亿个对应个体。你以为你在描述一个人,实际上你只是圈出了一个人群范围。
扩散模型生成图像时,文本提示词先被编码成词向量,再通过交叉注意力去影响图像特征。词向量的抽象级别太高了。"三十多岁的男人"这个词向量,指向的是一个"平均概念",而不是一张具体的脸。模型从平均概念出发,配合随机噪声,每次只能"掷"出一个符合大方向的样貌。掷出来的是谁,跟你是谁没有任何关系。
不信你做个实验:拿起你手机里某个朋友的照片,尝试用文字描述到让另一个人能认出来的程度。"圆脸、单眼皮、鼻梁不高、嘴唇略厚"够吗?远远不够。真正决定一张脸的是那些细节的排列组合:眉眼距、颧骨宽度、下颌角度、皮肉包着骨头的纹理。这些信息文字表达不了。
所以人物一致性的第一层难题,是扎在底层范式上的:身份的语义粒度,远小于一张脸的粒度。文本提示这条路,从根上就不具备锁定身份的能力。
DreamBooth 与 LoRA:把身份焊进模型参数
文字不行,那就让模型"看图"。
2022 年,Google Research 和波士顿大学提出了 DreamBooth。思路非常暴力:你给模型 3 到 5 张同一个人的照片,配上一个特殊标记词(比如 "sks person"),然后把扩散模型微调一遍。训练完之后,模型的参数里就刻进了这个人的长相。下次输入 "sks person",它就能以这个人为主角生成新画面。
效果确实惊艳。这是一条完全不同的路径:身份不再依赖任何即时条件,直接被写进了模型本身。代价也随之而来:每换一个新角色,都得重新训练一个模型。你想生成十个角色,就要训练十个模型,每个都要花几分钟到几十分钟的 GPU 时间,还要准备足质量的照片。
LoRA 的做法更轻一些。它不修改原模型,而是在旁边加一条低秩的小路,只更新这条小路的参数。一个角色一个 LoRA 文件,几十 MB,训练也快得多。但本质没变——每一个角色都需要一次独立的训练过程。
这条路在离线创作场景还能接受,到了产品场景就卡死了:你不可能让用户上传三张自拍,然后排队等 15 分钟,只为了让 AI"记住"他的脸。产品要的是"上传一张图,立刻能用"。
IP-Adapter:参考图来了,但脸没进来
于是有了图像提示的思路:生成的时候直接丢给模型一张参考图,让它边看边画。
IP-Adapter 是这类方法的代表。它在扩散模型里加了一条独立的图像分支:参考图被编码成一个全局图像嵌入,然后在交叉注意力层单独注入,不再跟文本提示混在一起。文本管场景,图像管参考,思路干净漂亮。
但你如果真的用 IP-Adapter 去做人物一致性,会发现一个问题:它生成的画面风格很贴近参考图,但图中那个人的脸,不像。
原因出在编码器上。IP-Adapter 用的是 CLIP 的图像编码器。CLIP 是为了对齐图像和文本训练的,它理解的是"这张图的整体语义"——人物、场景、构图、风格。它不会专门去抠一张脸的五官比例和骨相。结果就是:参考图的信息进来了,但人脸的信息被淹没在全局语义里,并没有真正进来。
后来社区也意识到了这一点,于是出现了 FaceID 之类的变体——把参考图换成人脸识别模型提取的人脸嵌入再喂进去。效果立刻上了一个台阶。这其实暗示了一件事:想锁住身份,你需要的人脸特征,必须来自专门学"人脸识别"的模型。
InstantID:替身份修一条专用车道
2024 年初,InstantID 把这个思路系统化了。它把参考图像拆成了两路:
- 一路用类似 ArcFace 的人脸识别模型提取身份向量。这是一个 512 维的"身份指纹",同一个人的不同照片得到的向量非常接近,不同人的向量离得很远。
- 另一路用人脸关键点检测提取五官结构——眼睛、鼻子、嘴的位置,头部朝向,脸型轮廓。这部分信息交给 ControlNet,控制生成图里人物的姿态和位置。
文本提示词则在旁边单独描述场景、服装、光线。三路条件各自独立,最后在扩散模型的注意力层汇合。单次生成大致是这样运行的:
- 参考图过一遍人脸识别模型,得到身份向量;向量经过一个小映射网络,变成注意力模块能认得的 "ID token"。
- 参考图再过一遍关键点检测,抽出五官位置和头部姿态;这些结构信息交给 ControlNet,决定人物在画面里的位置和姿势。
- 文本提示词单独负责场景、服装、动作、光线——回答"他在哪、在干嘛"。
- 三个条件在注意力层汇合,逐层去噪,最终生成一张长着这张脸、摆着这个姿势、待在这个场景里的图。
这个设计最妙的地方,是把"他是谁"和"他在哪、他什么姿势"彻底拆开了。ArcFace 的身份向量只负责脸的长相,关键点只负责摆姿势,文本只负责布置场景,互不干扰。
同一时期,腾讯的 PhotoMaker 走了另一条路:允许传多张参考图,把多张图里的人脸嵌入"堆叠"成一个更浑厚的 ID 表示。几张图的信息可以互补——一张正脸、一张侧脸、一张带表情的,合成后的身份表示比单张更稳。
我把这条技术演进路线拉成一张表:
| 方案 | 身份信息来源 | 需要训练? | 身份保持能力 |
|---|---|---|---|
| 纯文本提示 | 文字描述 | 否 | 极弱,只能给出"人群方向" |
| DreamBooth | 微调后的模型参数 | 是,每个角色重新训练 | 强,但成本极高 |
| LoRA | 低秩权重增量 | 是,每角色一个 LoRA | 较强,成本明显更低 |
| IP-Adapter | CLIP 全局图像嵌入 | 否 | 弱,风格像了但脸不像 |
| InstantID | 人脸识别向量 + 结构关键点 | 否 | 强,单参考图即可 |
| PhotoMaker | 多图身份嵌入堆叠 | 否 | 强,多图更稳 |
还是很难,四个绕不过去的坎
现在你可能会说:问题不是已经被解决了吗?那你用 InstantID 连出 10 张图试试。第一张冷静,第二张微笑,第三张就变形了。真实使用中,人物一致性依然摇摇晃晃。原因有四个。
第一个坎,数据。同一个普通人的多视角图片,在互联网上几乎不存在。公开训练集里,"同人多图"数据大多来自娱乐圈——同一个艺人被拍了成千上万张照片。所以你拿明星测试,效果总是很好;拿自己手机拍的普通照片测试,效果立刻掉一截。不是模型偏爱明星,而是训练数据里"身份一致性"的信号,本身就主要由名人贡献。
第二个坎,身份和属性的边界。参考图里戴了副眼镜,模型很可能把眼镜当成身份的一部分。换成场景后眼镜被原样保留,或者生硬地消失。胡子、耳环、刘海、发色,这些边缘案例每天都在发生。对扩散模型来说,"这是天生的骨相"和"这是暂时的装扮"之间没有一条干净边界。它只能靠统计规律去猜,猜不中就崩。
第三个坎,保持与变化天然拧巴。一方面要"像",另一方面要"变"——换场景、换姿态、换表情。这两个信号在像素层面是对抗的。身份条件加得重,脸是稳了,但姿态僵硬、场景缺乏变化;身份条件减得轻,姿态和场景活了,但脸开始漂移。所有现有方法都只是在两个方向之间找一个折中点,没有谁能真正打破这个对抗。这也解释了为什么那种"同一角色连续出现在不同画面里"的长图,至今还是翻车重灾区。
第四个坎,评估指标会骗人。现在论文里衡量人物一致性,最常用的指标是 ArcFace 相似度。我最早也被这个指标骗过:跑实验,相似度 0.8,心想"稳了"。点开图一看,完全是另一张脸。为什么?因为 ArcFace 是做人脸识别的,它的任务是区分不同的人,找的是"最容易把两个人分开的特征",而不是你眼睛在意的所有脸部细节。
ArcFace 的 512 维向量到底在编码什么?
ArcFace 的训练目标可以概括为:把同一个人的两张脸向量拉近,把不同人的向量推远,并在角度空间里留出一个 margin。经过海量人脸数据的训练,这 512 维空间成了一个可靠的身份度量空间。但它的设计目标是"区分身份",而不是"还原一张脸的完整外观"。这就是为什么相似度分数高,不代表生成结果一定像。
下一波突破口,我押在 2D 之外
那现状的边界到底在哪?说句公道话:单张参考图、正面或轻微偏侧、光照正常的条件下,今天的工具已经能做得相当好。稍微大角度一点、表情夸张一点、或者要求角色左右转头,2D 方法的破绽就出来了——每一帧都是从零开始猜的,模型并没有一个稳定的"三维里的这个人"作为底子。
接下来两股力量,我判断都会来自 2D 之外。第一股是 3D:用三维人脸表征把身份真正"锁"在空间里,再换角度渲染,身份一致是天然的,不用每帧去猜。第二股是视频:一段连续视频本身就包含同一个人的大量视角、表情和姿态变化,这是比静态图文下标高质量得多的自动标注数据,足以训练出更稳的身份条件。
最后说点掏心窝的话。人物一致性生成之所以难,不是模型不够大、算力不够强,而是"身份"这个变量在当前的生成范式里,没有一个真正独立的位置。它要么被压缩在文本里,要么被混在参考图的全局语义里,直到我们用人脸识别模型替它修了一条专用车道,问题才被推进了一大截。这条车道会不会被 3D 重建和视频模型全面替代,我还没法下结论。但有一件事我已经确信了很久:只要你还在用文本生成图像,你就得接受——一个词,装不下一张脸。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/657.html