# 人物一致性为什么难：同一张脸怎样才能不跑偏

从“模型里没有存着这张脸”讲起，说清身份向量、InstantID 与 DreamBooth 各自怎么把身份钉住，以及保真度和可编辑性为什么互相拉扯

> 人物一致性 · 身份向量 · LoRA · 约 7 分钟 · 09 月 29 日

## 本篇要点

1. 模型里没有存着某个人的脸，脸是每次生成时当场长出来的，所以改姿势、改场景会连带换脸，这不是“忘了”，而是从来没有记住过。
2. 固定种子只在提示词也几乎不变时有用，因为它锁住的是整张图，不是单张脸。
3. 文字提示的带宽不足以指定具体一张脸：能写清楚的是类别和属性，成千上万张脸都符合这些词。
4. 稳定身份需要一条对姿势、表情、光线不敏感的窄通道；人脸识别模型靠训练目标做到这一点，它输出的身份向量比 CLIP 图像向量窄得多。
5. IP-Adapter-FaceID 用身份向量替换 CLIP 图像向量并加 LoRA，但它自己的文档承认只用身份向量时结果不稳定，所以 Plus 版本把 CLIP 向量一起用，代价是可编辑性变差。
6. InstantID 把身份向量和五个面部关键点的弱空间约束合起来用，不需要针对某个人做训练、一张参考图即可；官方调法是想要更像就调高身份相关权重，想要文字更管用就调低。
7. DreamBooth 是另一条路：用 3 到 5 张照片把主体绑到一个稀有词上微调模型，并用先验保持损失防止模型忘掉整个类别，LoRA 让这件事的成本降到可以接受。
8. Midjourney 的 --cw 控制的是从参考人物身上取哪些部分（100 连头发衣服一起，0 只管脸），不是强度；这与调整体强弱的 --sw 是两种不同的旋钮。
9. 身份通道越强，脸越稳但越难改；雀斑、耳环、logo 这类细节本来就不在身份向量里。

---

上一篇讲的是风格参考：它给你一套味道，但没法只给你味道，内容会跟着一起过来。人物一致是更硬的一个要求——不是“味道像”，而是不管这个人换了姿势、换了场景、换了镜头，出来的还得是同一个人。

做系列图、做角色素材的人几乎都会撞上这堵墙：第一张图里的那张脸你很满意，第二张里她笑起来就不像了，第三张干脆换了一个人。这一篇把“脸为什么会漂”拆开，然后讲清三条能把身份钉住的路子，以及各自的代价。

## 模型里根本没有“这个人”可以调出来

第一篇讲过，扩散模型出图是从一团随机噪声开始，一步步去噪成图，种子决定这一抽落在分布里的哪个位置。这里要补的是：**脸不是从某个档案里被调出来的，而是每一次去噪当场长出来的。**

所以“固定种子 + 固定提示词”确实能让脸几乎不变，但它锁住的是整张图——连背景、姿势、光线一起锁住。你只要把姿势从站着改成坐着，去噪的轨迹整条变了，脸也跟着变。这不是模型忘了这个人，而是它从来没有记住过这个人。每次生成都是照着描述重新捏一张脸。

那为什么不干脆把脸写进提示词？因为文字的带宽不够。你可以写“二十多岁的女性，黑色短发，圆脸，单眼皮”，这些词描述的是一类人，对应的脸有成千上万张。文字编码器擅长的是类别和属性，不是“具体这一个”。InstantID 那篇工作里说得很直接：对身份保持来说，CLIP 这类图像表示的语义太粗[4]。

这一点正好接上上一篇的结论。上一篇说 CLIP 图像向量把颜色、质感、布局、主体全塞在一起，没有“只取风格”的干净接口。身份比风格还要细——它藏在五官的比例和细节里。你手上的每一个输入通道（文字、种子、风格参考），要么太粗，要么太杂。

## 需要的是一条“只管是谁”的窄通道

既然现成通道都不合适，那就得造一条专门传身份的通道，而且它必须满足一个条件：**对姿势、表情、光线不敏感**。同一个人侧过脸、皱起眉、走到暗处，通道传出来的东西要基本不变。

人脸识别模型就是被训练成这样的。这类模型（ArcFace 这一支，在开源工具里通常以 InsightFace 的形式出现）的学习目标是：同一个人的不同照片——正脸、侧脸、暗光、笑着的——在它输出的向量空间里尽量靠拢，不同人的脸尽量推开[2][5]。它输出的那个向量常被叫作 ID embedding，也就是身份向量。这个“靠拢”不是模型天生会做的事，是被训练目标逼出来的。正因如此，它比 CLIP 图像向量窄得多：CLIP 把颜色、质感、布局、主体全装在一起，而身份向量被逼着尽量只留下“这是谁”。

IP-Adapter-FaceID 走的正是这条路：把原来的 CLIP 图像向量换成身份向量，另外再训一个 LoRA 来提升一致度[2][3]。但它的文档也承认这一步不免费：身份向量比 CLIP 向量难学得多，而且**单独喂身份向量时结果不稳定，很容易被提示词带走**。所以后来的 Plus 版本干脆把两样一起用——身份向量管“是谁”，CLIP 向量管“脸摆成什么结构”[2]。代价也很好预料：CLIP 那一路会把脸型、角度这些结构信息一起带回来，于是图片能改的东西变少了。

InstantID 换了个思路：身份向量照用，但空间约束只给五个面部关键点（两只眼睛、鼻子、嘴角），故意做得很弱——它不规定脸型，也不规定嘴张开还是闭上，所以表情和姿态还能改，脸的固定程度却上来了。它把身份向量送进一个改造过的 ControlNet，在这条支路里干脆不用文字提示，免得文字把别的属性混进来[4][5]。它的官方仓库给的调法直白得可以当操作口诀：想让结果更像本人，就把身份向量那一路和 IdentityNet 的权重一起调高；想让文字更说了算、方便改风格，就把身份那一路调低[5]。

```mermaid
flowchart LR
  A["参考脸"] --> B["人脸识别模型"]
  B --> C["身份向量：尽量只保留身份"]
  D["文字提示：姿势、镜头、服装、光线"] --> E["注意力层"]
  C --> E
  F["几个面部关键点做弱约束"] --> E
  E --> G["换场景换姿势后的同一个人"]
```

## 另一条路：把这个人的身份训进模型

上面几条都是“外部通道”——每次生成时临时把身份向量塞进去。还有一条完全不同的路：**训练**。

DreamBooth 的做法是，给你 3 到 5 张某个主体的照片，微调模型，把这个主体绑到一个平时没人用的稀有词上，比如让 `[V]` 专指这只狗、这个人，然后用提示词 `a [V] dog` 生成新场景里的同一只狗[6]。它还要配一个“先验保持损失”，用意是防止模型训完之后忘了这一类东西长什么样——论文里管这个叫语言漂移：模型可能慢慢觉得“狗”就等于你这只狗[6]。

这条路的效果通常比外部通道更稳、对姿势和表情更宽容，代价是要准备一组多角度的照片并花时间训练。好消息是成本在降：LoRA 只训模型里很小一部分参数（产出的文件通常一百多 MB），后续工作已经能把针对人脸的个人化压到几十秒级别[6][7][9]。

## 落到具体参数上：--cref 和 --cw

Midjourney 里对应的是人物参考：`--cref` 后面接参考图地址。`--cw` 控制从参考人物身上取多少，取值 100 到 0，默认 100：**100 会把脸、头发、衣服都带上；调到 0 就只管脸**，官方说明这个档位适合换服装、换发型[1]。

这里有个容易和上一篇混淆的地方。上一篇的 `--sw` 是强度旋钮：调的是参考图整体影响多强，风格味道和内容残影一起浓淡。`--cw` 不是强度，是范围：它决定从参考人物身上取哪些部分。有使用教程把这一点总结成——把值调大是让**更多特征**变得相似，而不是让**每个特征**更像[8]。

同一条官方说明也列出了它的边界：它不会精确复制酒窝、雀斑、T 恤上的 logo；它不是为真实人物照片设计的，用真人照片容易走形；画面里有多个角色时它处理不好，往往让所有人都长成同一个[1][8]。它最擅长的输入，恰恰是 Midjourney 自己生成的图，而且可以和风格参考 `--sref` 叠着用。

## 稳定的是什么，不稳定的又是什么

**第一，先想清楚你要哪种一致。** 如果你要的是“这张图改一点点”，固定种子加固定提示词就够了。如果你要的是“同一个人换场景换姿势”，种子没用，必须有身份通道或训练。

**第二，保真度和可编辑性是一对反向的力。** 身份那一路给得越重，脸越像、越难漂，但姿势、表情、发型也越难改；想改就得把它调弱一点。InstantID 的权重建议和 `--cw` 的高低调法，本质上都是在拨这根杆。

**第三，窄通道只保证“是谁”，不保证全部细节。** 雀斑、疤、耳环、logo 这类细节不在身份向量里，这也是官方直接承认的精度上限。

**第四，文字该写的还得写满。** 身份通道只负责“是哪个人”，姿势、镜头、服装、光线这些还是你来写。你不写的部分，模型就自己填——上一篇里“腾出来的空间会被参考图灌进去”，在这里同样成立。

## 术语表

- 身份向量（ID embedding）：人脸识别模型对一张脸输出的数字表示，被训练成只留下“这是谁”，对姿势、光线、表情不敏感。
- 人脸识别模型／ArcFace：专门判断“是不是同一个人”的模型，训练目标就是让同一个人的不同照片靠拢、不同人的脸被推开。
- 窄通道：只承担一项任务的条件输入（这里是身份），相对于 CLIP 图像向量那种什么信息都装的宽通道。
- 人物参考与 --cw：Midjourney 里指定人物长相的功能；--cw 取 0 到 100，决定从参考人物身上取哪些部分，0 只管脸，100 连头发和衣服一起。
- LoRA 微调：只训练模型里极少量参数就能让模型学会“这个词等于这个人”，训练快、产出文件小。
- DreamBooth：用同一个人或物体的 3 到 5 张照片微调模型，把主体绑到一个稀有标识符上，再用这个标识符生成新场景。
- 保真度与可编辑性的权衡：身份信号给得越强，人物越稳定，但姿势、表情、服装越难按提示词改动。

## 来源

1. [Midjourney 官方发布说明：--cref 与 --cw 的含义、默认值和已知限制](https://updates.midjourney.com/character-refs/)
2. [IP-Adapter-Face 设计说明：身份向量难学、为何要引入 LoRA 与 CLIP 向量](https://github.com/tencent-ailab/IP-Adapter/wiki/IP%E2%80%90Adapter%E2%80%90Face)
3. [IP-Adapter-FaceID 模型卡与局限声明](https://huggingface.co/h94/IP-Adapter-FaceID)
4. [InstantID 论文：CLIP 语义对身份保持过粗，IdentityNet 与弱空间约束的设计](https://arxiv.org/abs/2401.07519)
5. [InstantID 官方仓库：身份权重与文字控制之间的调节建议](https://github.com/instantX-research/InstantID)
6. [DreamBooth 论文：3 到 5 张照片绑定稀有标识符，先验保持损失与语言漂移](https://arxiv.org/abs/2208.12242)
7. [diffusers 的 DreamBooth/LoRA 训练文档](https://huggingface.co/docs/diffusers/main/en/training/dreambooth)
8. [使用教程：--cw 不同取值的实际效果与限制](https://www.whytryai.com/p/midjourney-consistent-characters)
9. [HyperDreamBooth 论文：人脸个人化训练的时间成本已大幅下降](https://openaccess.thecvf.com/content/CVPR2024/papers/Ruiz_HyperDreamBooth_HyperNetworks_for_Fast_Personalization_of_Text-to-Image_Models_CVPR_2024_paper.pdf)

---

原文：https://pangzhengboyin.com/articles/why-character-consistency-is-hard-c414bae2

> **庞征博引** · 想学的，慢慢都会
>
> 庞征博引是把想学的东西写成连载的 AI 学习工具。说出想学什么，它会先了解你的基础，再把主题写成一篇篇 5–10 分钟能读完的文章；边读边问，接下来学什么跟着你走。这篇就是这样写出来的。
>
> 开始你自己的连载 → https://pangzhengboyin.com
