做角色一致性的人大概都遇到过同一个尴尬场面:提示词几乎没动,只把“坐在窗边”换成“站在街头”,出来的脸就换了个人。Stable Diffusion 本身没有“这个人是谁”的概念,它只认像素规律,所以你得额外告诉它一张脸的身份特征。ControlNet 负责管构图和姿态,InstantID 就是在 ControlNet 这条思路上专门解决人脸身份保持的一个方案——一张参考照片,不训练 LoRA,不微调模型,直接把人脸特征注入生成过程。这篇内容讲的是它在实际工作流里怎么装、怎么调、怎么排错,适合已经能跑通基础出图、想往角色设定、漫画分镜、电商模特替换这类场景走的同学,也适合被“脸崩”折磨过几轮、想搞清楚参数背后逻辑的人。
1. 先把问题拆开:人物一致性难在哪
很多人第一次接触人物一致性,直觉是“多喂几张图就行了”。实际跑下来会发现,喂十张图不如搞清楚一件事:模型在生成人脸时,到底依赖了哪些信息。它依赖提示词里的“年轻女性”“短发”,依赖 latent 里的随机噪声,依赖采样过程中每一步的去噪方向,唯独不依赖“这个人长什么样”。所以你要做的,是把身份信息变成一种可以参与去噪的额外条件,而不是指望模型自己记住。
这件事有三种主流做法,各自代价不一样。第一种是训练一个角色 LoRA,用十几到几十张图把身份“焊”进模型权重里。好处是稳定、可控、能和其他 LoRA 组合,坏处是每个角色都要单独训一次,几十分钟到一个小时起步,试错成本高,而且训练集质量直接决定上限。第二种是换脸后处理,先生成一张构图满意的图,再用换脸模型把人脸贴上去。它上手最快,但本质是“贴”,光影、肤色、透视对不上时一眼假,侧脸和大角度基本废掉。第三种就是 InstantID 走的路线:把身份特征作为条件注入采样过程,让模型在生成时就把脸“长”出来,而不是事后贴。
1.1 三条路线的横向对比
把三条路线摆在一起看,选择的逻辑就清楚了。InstantID 的定位很明确:零训练、单图参考、生成时注入。它不是要取代 LoRA,而是在“快速验证”“角色数量多”“不想训练”的场景里更划算。
| 对比维度 | 角色 LoRA | 换脸后处理 | InstantID |
|---|---|---|---|
| 准备成本 | 需 15-40 张高质量图,训练 30 分钟以上 | 零训练,装好就能用 | 零训练,单张参考图即可 |
| 身份相似度上限 | 高,训练充分时最稳 | 中,正脸好、大角度差 | 中高,正脸和四分之三侧脸表现最好 |
| 光影融合 | 原生融合 | 容易脱节,需二次修 | 生成时融合,过渡自然 |
| 多角色支持 | 每个角色一个 LoRA,可叠加 | 逐个换,效率低 | 单次一张参考图,多角色需分段处理 |
| 灵活度 | 角色固定,风格靠其他手段 | 构图完全自由 | 构图受 IdentityNet 一定约束 |
| 适合场景 | 长期复用的固定 IP | 单张图快速改脸 | 多场景角色设定、批量验证 |
我自己的判断标准是这样:如果一个角色要在几十上百张图里反复出现,而且风格统一,那还是老老实实训 LoRA;如果是临时接的需求、角色数量多、每个角色只需要十几张图,InstantID 的性价比高得多。换脸方案我现在基本只用在“图已经画得很满意,只差脸”这种补救场景。
1.2 InstantID 的双分支链路:身份特征加人脸关键点
理解它的结构,调参才不会瞎试。InstantID 实际上是两条支路并行工作,最后在 UNet 的交叉注意力层汇合。
第一条是身份支路。参考图先过一个人脸检测和对齐模型,裁出标准人脸,再送进人脸特征提取网络,得到一个 512 维的身份向量。这个向量通过一个专门训练的投影层,变成一组 token,注入到交叉注意力里。它管的是“像不像”,决定五官比例、脸型、眉眼间距这些辨识度最高的东西。
第二条是关键点支路。同一张参考图会被提取出人脸关键点,转成一张类似骨架图的条件图,交给 ControlNet 处理。它管的是“脸在画面的什么位置、什么朝向、多大”。这也是为什么 InstantID 必须搭配对应的 ControlNet 模型,缺了它,身份向量就不知道该往画面的哪个区域注入,结果往往是脸糊成一团或者五官错位。
关键理解:身份支路决定“是谁”,关键点支路决定“在哪”。两条路任何一条出问题,表现都是“不像”,但排查方向完全不同——前者查参考图和权重,后者查构图和人脸像素占比。
这个结构带来一个很实际的推论:最终效果的上限,很大程度由参考图决定。参考图里的人脸如果只有 200 像素宽,特征提取网络拿到的信息就那么多,你再怎么调权重也补不回来。所以后面讲准备工作时,参考图的筛选标准我会写得很细。
2. 环境与模型准备:少一个文件就跑不起来
这套东西的安装门槛不算高,但坑集中在两个地方:一是人脸分析模型放错目录,二是 ControlNet 模型拿错了版本。我见过不少人卡在“节点全绿但一运行就报人脸检测失败”,最后发现是 antelopev2 文件夹里只放了两个 onnx 文件。
2.1 ComfyUI 的最小节点组合
如果你用 ComfyUI,需要装 InstantID 的节点包。装完之后,工作流里最少需要四个核心节点串起来:
- InstantIDModelLoader:加载 ip-adapter 权重文件,也就是身份投影那一部分。
- InstantIDFaceAnalysis:加载人脸检测和特征提取模型,需要指定 provider,有独立显卡就选 CUDA,显存紧张或者报 onnxruntime 相关的错就退回 CPU,速度慢一些但稳。
- ApplyInstantID:核心节点,接收模型、身份分析器、ControlNet、参考图、正向和负向条件,输出打过补丁的模型和条件。参数里的 weight、start_at、end_at 都在这里。
- FaceKeypointsPreprocessor:可选节点,用于手动干预关键点提取和裁剪,遇到参考图人脸偏小、构图特殊时用它。
标准的连线顺序是:Checkpoint 加载器出模型,先经过 InstantIDModelLoader 和 ApplyInstantID 打补丁,再进 KSampler;ControlNet 模型单独加载,接到 ApplyInstantID 的 control_net 输入上;参考图同时进 ApplyInstantID 和 FaceAnalysis。这里有个容易忽略的点:ApplyInstantID 输出的 model 一定要接给 KSampler,而不是接原始模型,否则补丁白打。
WebUI 那边走的是扩展插件路线,安装后在界面里会多出一个 InstantID 面板,需要配合 ControlNet 扩展使用。参数命名略有差异,但对应的东西是一样的:InstantID Strength 对应身份权重,IdentityNet Strength 对应 ControlNet 权重。两边逻辑互通,调参思路可以直接搬。
2.2 模型文件放哪、缺一个会怎样
这部分我建议你按表格对照着检查一遍,比报错之后再翻文档快得多。
| 文件 | 大致体积 | 存放位置 | 缺失后的表现 |
|---|---|---|---|
| ip-adapter.bin | 约 1.5 GB | ComfyUI/models/instantid/ | 节点加载直接报错,找不到模型 |
| InstantID 专用 ControlNet | 约 2.5 GB | ComfyUI/models/controlnet/ | 能跑但人脸位置错乱,五官糊成一团 |
| antelopev2 整套 onnx | 约 350 MB | ComfyUI/models/insightface/models/antelopev2/ | 报人脸检测失败或返回 None |
| 底模 Checkpoint | 2-7 GB | ComfyUI/models/checkpoints/ | 常规报错 |
antelopev2 这个文件夹是最容易出问题的。它里面应该是五个文件:det_10g.onnx 负责检测人脸框,2d106det.onnx 和 1k3d68.onnx 负责关键点,genderage.onnx 做属性判断,w600k_r50.onnx 才是真正的特征提取网络。少任何一个都可能让流程在中途断掉。另外注意目录层级,很多人的错误是解压后变成了 antelopev2/antelopev2/xxx.onnx,多套了一层,程序按路径找不到就报错。
# 正确结构长这样,可以用这条命令自查 ls ComfyUI/models/insightface/models/antelopev2/ # 期望输出: # 1k3d68.onnx 2d106det.onnx det_10g.onnx genderage.onnx w600k_r50.onnx底模的选择也要注意版本匹配。官方主力是 SDXL 体系,配套的 ip-adapter 和 ControlNet 都是对应 SDXL 的。SD1.5 生态有社区移植版本,体积小、显存友好,但相似度和细节明显弱一档,尤其是侧脸和小尺寸人脸。我的建议是:显存 8GB 以上优先 SDXL,低于这个再考虑 1.5 版本,不要指望小模型能出大模型的效果。
2.3 参考图前处理:检测、裁剪、对齐
这一步决定了效果上限,但绝大多数教程一笔带过。我说几个实操里真正影响结果的点。
第一,人脸在参考图里的像素宽度,尽量不低于 512。低于这个数,特征提取网络相当于在看一张模糊的小图,提取出来的向量区分度很低,生成的脸会“像但又不太像”,怎么调权重都在某个上限附近打转。
第二,正脸或轻微侧脸(偏转 15 度以内)效果最稳。超过 45 度的侧脸,关键点检测本身就会偏差,身份向量也会掺入大量姿态信息而非身份信息,结果就是生成的脸跟着参考图的朝向走,你想要的正面构图出不来。
第三,光照均匀、无遮挡、无浓妆。眼镜、口罩、刘海遮眼、强烈侧光,都会污染身份特征。如果参考图本身是艺术照,磨皮很重,特征提取拿到的信息也会变少,出来的人脸容易“网红化”,失去辨识度。
第四,参考图里最好只有一个人。多人图会触发检测歧义,默认取面积最大的那张脸,但如果两张脸差不多大,结果就不确定了。遇到这种情况,先用 FaceKeypointsPreprocessor 或者外部工具裁出目标人脸,再喂进去。
提示:参考图分辨率和出图分辨率不是一回事。参考图 1024 是为了让特征提取吃得饱;出图 1024 是为了让人脸在 latent 里占够像素。两件事都要做,只做一件效果都会打折。
2.4 WebUI 侧的安装差异
如果你习惯用 WebUI,逻辑一样但会多一层依赖。插件本身依赖 insightface 这一套库,安装时最容易卡在编译环节,尤其是在 Windows 上,常常因为缺少构建工具或者 Python 版本不匹配而失败。我的经验是:优先用预编译好的 wheel 包,别硬编译;onnxruntime 和 onnxruntime-gpu 只能留一个,两个都装了会互相抢,表现是明明有显卡却只能跑 CPU,速度慢到无法接受。
装完之后先别急着出图,用一个最简单的提示词跑一张 512×512 的测试图,确认人脸检测能过、不报错,再往正式工作流里加。很多时候问题不是出在参数上,而是环境本身没跑通,但你误以为是权重没调好,白白浪费一晚上。
3. 参数调优:把“像不像”和“能不能用”分开拧
调 InstantID 最常见的误区,是一上来就把权重拉满,看到不像就继续加,最后得到一张“五官对了但整张图像贴上去的”图。正确的做法是把相似度和可用性拆成两件事,分别调,最后取平衡点。
3.1 权重、CFG、步数的联动关系
先明确几个参数各管什么。
weight控制身份向量的注入强度。太低(0.3 以下)基本等于没开,脸是模型随机生成的;太高(1.0 以上)会把参考图的纹理、光照、甚至表情都带过来,生成的人脸僵硬、缺乏表情变化,侧脸时尤其明显。0.7 到 0.9 是常用区间,具体取哪个值取决于参考图质量和底模风格。
start_at和end_at控制注入的时间窗口。默认从 0 开始到 1 结束。把 end_at 降到 0.6 到 0.8,意味着后期去噪阶段不再受身份约束,模型可以自由补细节,好处是光影融合更自然、皮肤质感更好,坏处是相似度会掉一点。我一般设置在 0.8,作为“相似度和自然度”的折中。
CFG 和 weight 会互相放大。CFG 拉到 7 以上,同时 weight 也在 0.9,结果往往是对比度过高、脸部塑料感强、背景发脏。这时候降 CFG 比降 weight 更有效。我的习惯是 CFG 固定在 4.5 到 5.5,用 weight 调相似度,用 end_at 调自然度,三个参数不要同时动。
步数方面,25 到 30 步足够。InstantID 的注入是在交叉注意力层完成的,步数太少(低于 20)时,身份信息来不及在多个尺度上生效,容易只影响五官轮廓而不影响细节;步数加到 40 以上收益很小,纯属浪费算力。
采样器建议用 dpmpp_2m 配 karras 调度,稳定、收敛快,对 ControlNet 类条件也比较友好。euler_a 也能用,但随机性偏大,批量出图时一致性会差一些。
3.2 IdentityNet 与 IP-Adapter 的分工再强调一次
底层两个支路的权重是分开的,这一点在调参时非常有用。ControlNet 那条(IdentityNet)管人脸的位置、大小、朝向,它的权重决定了“脸必须长在关键点位置”这件事有多强。调到 0.8 到 1.0,脸的构图会牢牢跟着参考图走;调到 0.5 以下,构图自由了,但脸容易跑偏、五官错位。
IP-Adapter 那条管身份特征,权重决定“像不像”。
实际操作里有一个很有效的排查方法:先只开 ControlNet,把 IP-Adapter 权重设成 0,看生成的人脸位置对不对。如果位置都不对,说明关键点提取有问题,回去查参考图;位置对了但不像,再往上加 IP-Adapter 权重。这样分段验证,比一次把所有参数拉满然后瞎猜要快得多。
| 症状 | 优先怀疑的支路 | 调整方向 |
|---|---|---|
| 脸的位置偏移、五官错位 | 关键点支路 | 提高 IdentityNet 权重,检查参考图人脸占比 |
| 脸在正确位置但不像 | 身份支路 | 提高身份权重,更换更清晰的参考图 |
| 像但画面僵硬、像贴图 | 身份支路过强 | 降低权重,把 end_at 提前到 0.7-0.8 |
| 侧脸崩坏 | 关键点 + 参考图姿态 | 换正脸参考图,降低 ControlNet 权重 |
3.3 负面提示词与构图约束
负面提示词在 InstantID 里的作用和普通出图略有不同,因为有身份注入,模型有时候会“过度忠实”参考图,把不该带的东西也带进来。我常用的负面词组合是这样的:
deformed face, asymmetrical eyes, cross-eyed, extra face, multiple faces, blurry, lowres, jpeg artifacts, plastic skin, overexposed, watermark, text注意不要在负面里写face或者portrait,那会和身份注入打架,导致生成的人脸被削弱,表现是“怎么调都不像”。这个坑我踩过,当时排查了两个小时,最后发现是负面词写太狠。
构图方面,给一个明确的景别描述能显著提升成功率。写close-up portrait、upper body shot、medium shot比什么都不写要稳,因为人脸在画面里占的像素比例越大,InstantID 的效果越好。全身远景图里人脸可能只有 100 像素宽,这时候什么参数都救不回来。
3.4 一套可以直接抄的参数起点
给一组我常用的起点,SDXL 底模,1024×1024 或 832×1216:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 采样器 | dpmpp_2m + karras | 稳定,对条件注入友好 |
| 步数 | 28-30 | 低于 20 效果明显打折 |
| CFG | 4.5-5.5 | 超过 7 容易塑料感 |
| 身份权重 | 0.8 | 0.6-0.9 之间微调 |
| ControlNet 权重 | 0.8 | 位置不对就加到 1.0 |
| start_at / end_at | 0.0 / 0.8 | end_at 提前可提升自然度 |
| 分辨率 | 1024×1024 | 人脸像素占比优先 |
先用这组参数跑三张,看基线。三张里如果有一张明显好于其他,直接把那张的种子固定下来做微调,比重新随机摸索效率高得多。
4. 完整实操:从一张照片到一组角色图
单张出图只是验证,真正有价值的是“同一角色的一组图”。这部分讲流程怎么搭、批量怎么保持、后期怎么补。
4.1 单图工作流的搭建顺序
按这个顺序搭,出问题容易定位。
第一步,只接底模和 KSampler,用一句简单提示词跑通,确认环境没问题。第二步,加 InstantIDModelLoader 和 FaceAnalysis,把参考图接进去,先不接 ControlNet,跑一张看是否报错。这一步主要验证 antelopev2 是否被正确加载,很多人在这里就会看到人脸检测失败。第三步,接上 InstantID 的 ControlNet 模型,权重设 0.8,跑一张看人脸位置是否正确。第四步,把 ApplyInstantID 的 model 输出接到 KSampler,权重设 0.8,正式出图。
这个顺序看起来啰嗦,但它把“环境”“检测”“位置”“身份”四件事拆开了。混在一起调,出问题只能靠猜。
有一个实际的小技巧:ApplyInstantID 节点会缓存参考图的人脸特征,同一次会话里重复用同一张参考图不会重复检测。如果你要批量跑几十张,把参考图节点固定住,别每次重新加载,能省不少时间。
4.2 批量一致性:种子、提示词模板、场景库
一组角色图能不能“像同一个人”,不只取决于 InstantID,还取决于你控不控得住变量。我的做法是固定三样东西。
固定种子。角色的一致性有一部分来自噪声分布的相似性。同一角色的一组图,用同一个种子起步,只改提示词里的场景描述,脸型的稳定性会明显好于完全随机。如果场景变化大(比如从室内到室外),可以固定种子后微调,或者用子种子偏移。
固定提示词模板。把提示词拆成四段:身份描述(年龄、性别、发型、脸型特征)、服装描述、场景描述、风格描述。前两段固定不变,只改后两段。这样模型在理解“这个人”时的上下文是一致的,不会因为风格词变化而重新解释身份。
建立场景库。把常用场景写成一组短句,比如standing on a city street at dusk、sitting by a window with soft daylight、walking in a park, autumn leaves。批量跑的时候按列表替换,出图效率高,也方便后期统一调色。
[身份段] a 28-year-old woman, short black hair, oval face, light freckles [服装段] wearing a beige knit sweater [场景段] sitting in a cafe near the window, warm afternoon light [风格段] cinematic photography, shallow depth of field, 85mm lens这套模板跑下来,一组十张图里通常有六七张能直接用,剩下三四张通过局部重绘修。比起每张都重新想提示词,效率差好几倍。
4.3 局部重绘:脸崩了不一定整张重来
构图满意但脸不对,是最常见的情况。整张重抽等于把构图也赌掉了,不划算。这时候用局部重绘,只修脸。
做法是把生成好的图送进 latent 遮罩或者图像遮罩节点,遮住人脸区域(可以稍微放大一点,把脖子和发际线也包进去,避免接缝),重绘幅度设在 0.4 到 0.55 之间,仍然挂着 InstantID 的条件。这个幅度足够改变五官细节,又不至于把脸型结构推翻。
重绘时有两个注意点。一是遮罩的边缘要羽化,硬边会留下明显的色块接缝;二是重绘幅度别超过 0.6,超过之后模型会重新“构思”这张脸,InstantID 的约束反而压不住,容易越修越不像。我一般 0.45 起步,不够再往上加 0.05,一点点试。
还有一个进阶用法:先用 InstantID 生成一张“标准正脸”作为角色基准图,后续所有场景图都用这张基准图做参考图,而不是用原始照片。这样相当于做了一次特征“提纯”,多人场景、不同角度的稳定性会好一些。
4.4 和 LoRA 叠加时的顺序问题
如果你已经训了角色 LoRA,可以和 InstantID 一起用,但要理解它们叠加时的关系。LoRA 影响的是模型权重本身,InstantID 影响的是注意力层的条件注入,两者不在一个层面,可以共存,但强度会互相抵消一部分。
实践上,LoRA 权重 0.6 到 0.8 配合 InstantID 权重 0.5 到 0.7,是比较稳的组合。两个都拉满,容易出现五官过度锐化、皮肤质感失真。另外 LoRA 的触发词要保留在正向提示词里,别因为加了 InstantID 就把它删掉,那是 LoRA 生效的前提。
如果两个一起用之后相似度反而下降,先降 InstantID 的权重试试。很多时候不是 InstantID 不够强,而是两套身份信息在打架,模型不知道听谁的。
5. 常见问题与排查实录
这一节是我踩过的坑和帮别人排查过的案例整理,按症状归类,方便对照。
5.1 人脸相似度始终不达标
这是最高频的问题。排查顺序建议这样走。
先看参考图。人脸像素宽度够不够 512?有没有遮挡?是不是大侧脸?光照是不是一边亮一边死黑?这四条里中任何一条,相似度都会明显打折。换一张正脸、清晰、光照均匀的照片重新跑,很多时候问题直接消失。
再看权重。0.8 是不是太低?往上加到 0.9 试试。但注意,加权重的同时把 CFG 降一点,否则容易过曝。
然后看出图分辨率。全身图里人脸太小,InstantID 的特征注入覆盖不到那么小的区域。改成半身或者特写,立刻见效。
最后看底模。有些二次元或者重度风格化的底模,对人脸特征的响应很弱,因为它本身的训练数据就偏离写实。换一个偏向写实、人像表现好的底模对比一下,差别会非常明显。
5.2 环境与运行报错速查
| 报错或现象 | 大概率原因 | 处理方式 |
|---|---|---|
| 人脸检测返回空 | antelopev2 缺文件或路径多套一层 | 检查五个 onnx 是否齐全,目录层级是否正确 |
| insightface 安装失败 | 缺构建工具或 Python 版本不匹配 | 换预编译 wheel,别硬编译 |
| 有显卡却跑在 CPU 上 | onnxruntime 和 onnxruntime-gpu 冲突 | 卸载多余的那个,只留 GPU 版 |
| 显存溢出 | 分辨率过高或批次过大 | 降到 1024 以内,批次数设 1 |
| 能出图但完全不像 | ApplyInstantID 的 model 输出没接给采样器 | 检查连线,别接原始模型 |
| 生成多张脸 | 画面里人脸占比小,或提示词含多人描述 | 提高分辨率、拉近景别、检查提示词 |
其中“能出图但完全不像”这条特别隐蔽,因为流程不报错,图也正常,只是没效果。我第一次遇到时以为是权重问题,调了半天才发现是连线接错了,补丁根本没生效。
5.3 显存与速度的取舍
SDXL 加 InstantID,显存占用比纯文生图高不少,因为要多加载一套 ControlNet 和一个人脸分析模型。8GB 显存跑 1024×1024 通常能过,但同时开高批次或者叠加其他 ControlNet 就容易崩。
几个实用的降显存手段:批次数设 1,用分次生成代替大批次;人脸分析模型的 provider 设成 CPU,虽然慢一点但不占显存;生成完一组图后重启一次进程,释放碎片化的显存。最后这条听起来土,但在长时间批量跑的时候确实有效,尤其是连续跑几十张之后速度明显变慢的情况。
速度方面,人脸检测和对齐是固定开销,每换一张参考图就要跑一次。批量任务里尽量复用同一张参考图,别在循环里反复加载不同的图。
5.4 几个容易被忽略的细节
第一,参考图的背景会被轻微带进生成结果。尤其是背景颜色饱和度高的时候,生成图的色调会偏。解决办法是提前把参考图背景抠掉,换成纯色。
第二,参考图的表情会被部分继承。如果参考图是微笑,生成中性表情时嘴角会不自然地上扬。想要严肃表情,最好用中性表情的参考图。
第三,同一个角色在不同光照下,肤色会有漂移。这是底模本身的特性,不是 InstantID 的问题。后期统一调色比在生成阶段死磕更划算。
第四,批量出图时记得给每张图记录种子和参数。角色一致性项目往往要反复回头调整某一版,没有记录就得从头试。
一个省时间的小习惯:每完成一个角色的设定,把参考图、提示词模板、关键参数、种子整理成一个文本文件存下来。下次要扩展这个角色,直接调用,不用重新摸索。
我在实际使用中的体会是,InstantID 这类工具最容易让人产生“参数万能”的错觉。真正决定成败的,是参考图质量和你对变量的控制程度。参数调优能把你从 60 分带到 80 分,但 80 分到 95 分那一段,靠的是把参考图选对、把提示词模板固定住、把后期修补流程跑顺。如果你现在正卡在某个角色的相似度上不去,不妨先把所有参数恢复默认,只换一张干净的正面参考图试一次,大概率比继续拧权重更有效。