十个人的合影,AI为什么总是拍不好

你有没有试过用AI帮你生成一张多人合影?

比如你想要一张自己和九个朋友的聚会照片,结果生成出来的图里,有两张脸长得一模一样,有个人的胳膊接错了身体,还有个人明明给了照片却根本没出现在画面里。

这不是个例。事实上,就连目前最强的商业模型之一Nano Banana Pro,官方给出的上限也只是七个人。而大部分学术界的开源方法,处理的是一到五个人的场景。这篇来自复旦大学、腾讯混元实验室和香港大学团队的论文,把目标直接定在了五到十个人,并且在一个专门构建的测试集上,做到了比GPT-Image 2、Nano Banana系列、Seedream系列都更好的身份还原效果。

这篇论文的题目叫《WithEveryone》,翻译过来大概是"与每个人在一起"。它想解决的问题很朴素:既然真实世界里的合影经常是五个人、八个人甚至十个人一起入镜,为什么AI生成多人合影这件事到现在还做不好?

人一多,AI就开始"脸盲"

先说说这件事到底难在哪。

论文里提到一个业内公认的现象:随着参考人脸数量增加,生成图像里每个人的身份相似度会明显下降。这不是猜测,而是多篇此前的研究反复验证过的结果。想想看,如果你让一个模型同时记住并区分十张脸,它比只记住两三张脸要吃力得多,这符合直觉。

但这篇论文更深一层的洞察在于:问题不只是"记不住",还有"配不对"和"摆不好"。

配不对指的是身份错位,比如你给了甲乙丙丁四张脸,生成出来的图里甲的脸出现在了丙应该站的位置。摆不好指的是构图和姿势的问题,比如人物之间的手臂穿模、身体比例错乱、有人被完全挤出画面。

论文提出,这三个问题背后有一个共同的技术根源,那就是当训练一个身份保持模型时,通常需要一个"身份损失函数",用来告诉模型"生成的这张脸和参考的这张脸像不像"。

身份损失(ID Loss):训练时用来衡量生成图像中人脸与参考人脸相似程度的一种监督信号,通常通过人脸识别模型提取特征后计算相似度得到。

这套机制在只有一两个人的时候运作得很好,因为很容易判断"生成图里的这张脸"对应"参考图里的哪张脸"。但当画面里有五到十张脸挤在一起,尤其是在训练过程中,模型还在生成的中间状态里,这些脸往往都长得差不多、糊成一团时,现有方法只能靠"人脸特征匹配"这种方式,去猜哪张生成的脸对应哪个参考身份。

这就好比你让一个人去五个新生儿病房里,凭模糊监控画面猜哪个婴儿是谁家的。婴儿长得都很像,监控画质又不清楚,猜错的概率非常高。如果这时候还硬要用这个猜错的结果去"纠正"某个孩子的成长记录,那纠正的方向本身就是错的,反而会把记录搞得更乱。论文原话是"每一个配对错误的脸都会把一个身份拉向另一个身份,让本该锐化个体差异的监督信号自己把自己抵消掉了"。这正是现有身份损失函数在群体场景下失效的核心原因。

解法一:给每个人发一张"身份证",而不是塞进一堆照片里

WithEveryone的第一个关键设计,是把每个参考身份变成一个可以被"点名"的token(词元),而不是让模型自己从一堆参考图里去猜谁是谁。

具体做法是,对每一个被选中的参考人物,团队提取一个512维的ArcFace人脸特征向量,通过一个轻量的多层感知机(MLP)把它映射到模型的隐藏维度,然后作为一个专属的"ID token"插入到模型的序列里。

ArcFace:一种广泛使用的人脸识别模型,能够把一张人脸图片转换成一串数字(特征向量),两张脸越像,对应的两串数字就越接近。

这里有一个很值得琢磨的设计理由。论文类比了ViT和VAE两种不同层次的图像特征表示,认为参考图像本身提供的是"低层次"的像素级信息,而这个专门提取的ID token提供的是"高层次"的身份专属信息,两者是互补的,不是谁替代谁。

但光把这张"身份证"塞进模型的输入序列,并不代表模型在生成的时候真的会去看它。

论文指出一个很现实的问题:整个输入序列有一万到两万个token,一个身份就只对应其中一个token,这个token很容易被淹没在噪声里,注意力会变得很分散。

这就像你参加一个几百人的大型招聘会,你的简历只是桌上厚厚一沓资料里的一张纸。如果不做点什么,招聘官很可能压根没翻到你那页就把整沓资料合上了。如果不专门设计一个机制让模型"记得回头看"这张身份证,那这张身份证放进去和不放进去,效果可能相差无几,因为模型的注意力根本没有机制被强制引导过去。

为了解决这个问题,团队引入了一个叫做ID Representation Forcing(身份表征强制)的机制。

具体来说,在生成目标图像之前,模型要为每一个被选中的参考身份,先"预测"一次它应该长什么样,用一个专门的表征token去计算,然后拿这个预测结果去和真实的ArcFace特征向量做余弦相似度比对,构成一个损失函数强迫模型对齐。

这有点像考试前的"抽查提问"。老师不会等到最后交卷才发现你根本没记住知识点,而是在做题过程中随堂点名让你复述一遍这道题涉及的关键公式。如果答不上来,说明你没有真正把这个知识点放进脑子里,得当场纠正。这个"随堂提问"环节逼着模型在正式画图之前,先确认自己有没有真的把每个身份的信息调取出来。

论文的消融实验显示,单独加入ID token能带来一些提升,尤其是在"生成人数是否正确"这个指标上从0.771提升到了0.827。再加上Representation Forcing之后,身份相似度又进一步提高,Sim(Ref)从0.351涨到0.364,Sim(Tgt)从0.313涨到0.328。团队还专门去看了注意力图,发现在被监督的身份预测位置上,模型确实会优先关注对应的那个ID token,对角线上的注意力权重明显高于其他不相关身份,这说明这个机制确实在起作用,只是提升幅度不算特别惊人。

解法二:先"画草图"再"上色",把排版决策挪到理解阶段

多人合影另一个大麻烦是构图。

十个人站在哪里、谁挨着谁、谁的手搭在谁肩上、每个人摆什么姿势,这些空间和肢体关系,人数一多就会变成组合爆炸的问题。论文里说得挺直白:一个人站错位置,会像多米诺骨牌一样把周围的构图全带崩,导致重叠、肢体错乱、画面拥挤。

WithEveryone的解决思路,是把这部分"排版决策"从生成图像这个环节,提前挪到模型的"理解"和"推理"阶段去做。

这个设计叫做Layout Chain of Thought,简称Layout CoT(布局思维链)。

Layout CoT:模型在真正生成图像之前,先用文字加坐标的形式,一步步推理并写出这张合影里应该有几个人、每个人的脸和身体应该出现在画面的哪个位置、摆出什么姿势、以及每个位置对应哪个参考身份,最后把这份"计划书"渲染成一张草图,作为条件图像交给生成模块。

从论文展示的例子看,这个过程非常具体。模型会先用自然语言推理"这是一个轻松的自拍合影,重点表现靠近和探出头的动态感",然后逐步给出每张脸的坐标框、每个身体的坐标框、骨骼关键点,还要写清楚哪个参考身份绑定到哪个位置编号,甚至连"背景里有个没有参考图的路人"这种细节都会考虑进去,并且标注为不需要绑定身份。

这套流程最后会有一个专门的渲染步骤,把这份文字加坐标的计划,变成一张实际的画布图像,画上脸部框、身体框、骨架线,把预先粘贴好的参考头像也摆上去,再交给生成模型作为视觉条件。

这就好比装修房子之前先出一份施工图纸。图纸上标好了每面墙、每扇窗户、每根管线的位置,施工队照着图纸干活,而不是走一步看一步现场发挥。如果没有图纸,让十个工人各自凭感觉去砌墙,那大概率会出现墙体对不齐、水管走位冲突这类问题。论文的消融实验证实了这一点:加入模型自己预测的布局后,人数准确率(Count)从0.771提升到0.828,身份覆盖率(Coverage)从0.741提升到0.813。

更有意思的是,如果直接给模型一份"标准答案"级别的布局(也就是从真实目标图像里反推出来的完美布局),身份相似度还能进一步提升到0.412,几乎每一项指标都在涨。这说明布局质量本身对最终的身份还原效果有实打实的贡献,而模型自己预测的布局和这份"完美答案"之间还有差距,这个差距也就成了论文里明确指出的、当前系统还没解决好的短板。

解法三:用画好的框,而不是用猜的脸,来做身份监督

如果说前两个设计解决的是"记住谁、摆在哪",那么这篇论文里被认为贡献最大的一个改动,解决的是"生成过程中怎么盯住每个人的脸不放"。

这就是Layout-Grounded ID Loss,简称LG-ID Loss(布局锚定身份损失)。

前面提到过,现有的身份损失函数依赖"猜哪张生成的脸对应哪个参考身份",人数一多就容易猜错。这篇论文没有去改进这个"猜"的算法,而是干脆绕开了猜测这一步。

因为在训练数据里,每个参考身份原本就有一个明确标注好的、对应到目标图像里的脸部坐标框。既然这份标注本来就存在,那为什么还要靠猜?直接从这个已知位置去裁剪、去比对不就行了。

具体来说,在训练过程中,模型对当前这一步的噪声图像做一次"一步预测",估算出一张接近完成的清晰图像,然后按照标注好的坐标框,把预测图像和目标图像里对应位置的人脸裁剪下来,两两配对送进ArcFace编码器算相似度。因为这个坐标框是提前标注好的,所以每一对裁剪出来的脸必然是同一个人,不存在猜错的可能。

这就好比开学分班的时候,与其让老师凭印象去猜哪个学生该坐哪个位置(认错人的概率不低),不如直接按照提前排好的座位表来对号入座。座位表上写清楚了三号位置是张三,那张三就该坐在三号位,不需要老师现场辨认。

这个设计带来的效果非常显著。在消融实验里,单独加入这个损失函数,身份相似度Sim(Ref)从0.339直接跳到0.506,Sim(Tgt)从0.304跳到0.435,这是所有单项改动里提升幅度最大的一个。而且很有意思的是,这个损失函数不只是让脸更像了,它还顺带把构图也理顺了:人数准确率从0.771涨到0.845,身份覆盖率从0.741涨到0.947。

论文对此给出的解释是,因为每个身份是在它自己标注好的框内被监督的,所以模型要想降低这个损失,唯一的办法就是把正确的人放在正确的位置上,这个损失函数天然携带了空间信息,不只是身份信息。

不过这个设计也有一个隐藏前提。裁剪预测图像里某个标注区域时,得假设生成的脸真的落在了那个区域附近,否则裁出来的就是背景或者别的东西,监督也就失效了。论文里提到,这个前提能够成立,是因为flow matching过程本身会较早地让构图收敛,也就是说布局这件事本身,是比身份精修更早达成一致的,这个观察也呼应了前面Layout CoT部分提到的"规划"和"执行"的分工。

flow matching(流匹配):一种训练图像生成模型的技术路线,通过学习如何把随机噪声逐步转变为目标图像的"速度场"来实现生成,是目前主流图像扩散模型背后的数学框架之一。

值得一提的是,这个损失函数只在噪声水平低于某个阈值时才生效,论文里定的这个阈值是0.85。原因很直接:噪声太大的时候,那个"一步预测"出来的图像压根看不出是张脸,这时候硬要去比对相似度,监督信号本身就是错的,不如干脆不算。

数据说话:五到十人场景下,它比谁都稳

团队专门构建了一个包含210个真实合影样本的测试集,覆盖五到十个参考身份,并且确保这些身份和训练集完全不重叠,测的是模型对陌生人脸的泛化能力,而不是死记硬背。

在这个测试集上,WithEveryone对比了三类模型:学术界的身份保持方法(比如WithAnyone、UMO)、开源通用模型(比如Qwen-Image-Edit、BAGEL)、以及商业系统(GPT-Image 2、Nano Banana系列、Seedream系列)。

| 模型 | Sim(Tgt)身份相似度 | Copy-Paste拷贝痕迹 | Coverage覆盖率 | Dup重复率 |

|---|---|---|---|---|

| GPT-Image 2 | 0.462 | 0.169 | 0.905 | 0.075 |

| Nano Banana 2 | 0.451 | 0.045 | 0.884 | 0.099 |

| Seedream 5.0 Pro | 0.436 | 0.114 | 0.913 | 0.065 |

| WithAnyone | 0.405 | 0.096 | 0.957 | 0.045 |

| **WithEveryone** | **0.499** | **0.055** | **0.973** | **0.028** |

Sim(Tgt):生成的人脸与其在目标场景中真实呈现效果的相似度,衡量的是"这张脸在这个语境下像不像本人",而不是简单粗暴地和原始参考照片比对。

这里有一个特别值得展开说的指标,叫Copy-Paste(拷贝痕迹)。

Copy-Paste拷贝痕迹:衡量生成的人脸是不是显得像直接把参考照片"贴"上去的,而没有根据新场景的光线、角度、表情做出自然调整。数值越高,说明越像生硬的复制粘贴。

GPT-Image 2的身份相似度Sim(Ref)其实是所有模型里最高的,达到0.583,但它的Copy-Paste分数也是最高的,0.169,比WithEveryone的0.055高了三倍还多。这说明什么?说明GPT-Image 2那种"高相似度",很大一部分是靠生硬地把参考照片怼进画面里实现的,而不是真正理解了这张脸在新场景里该怎么呈现。

这就好比拼贴画和写生画的区别。拼贴画把照片剪下来贴到新画布上,五官轮廓当然和原图一模一样,但衣服褶皱、光影方向、脸部朝向都对不上背景。写生画是画师重新看着模特、结合当前光线画出来的,可能不是每个细节都跟照片分毫不差,但整体看起来更自然、更像"这个人真的在这个场景里"。WithEveryone想追求的就是后者。

再看覆盖率(Coverage)和重复率(Dup)这两项,这两个指标反映的是"要求的人有没有都出现,出现的人有没有撞脸"。WithEveryone覆盖了97.3%的参考身份,重复率只有2.8%,两项都是所有对比模型里最好的。相比之下,很多开源通用模型的覆盖率甚至不到42%,论文解释说这些模型倾向于只编辑提示词里明确提到的少数几个人,而不是把整个团体都画出来。

人越多,掉分越慢

论文还专门做了一个很扎实的分析,把身份相似度按参考人数从五到十分别拆开看。

结果显示,随着人数增加,WithEveryone的分数从五人时的0.629降到十人时的0.571,降幅是0.058。而GPT-Image 2从0.593降到0.496,降幅是0.097。UMO从0.412降到0.330,降幅是0.082。

也就是说,人越多,WithEveryone掉分掉得最慢,而且分布也更集中,不像GPT-Image 2那样忽高忽低的情况更明显。

团队接着追问了一个更深的问题:这个掉分是不是纯粹因为人多了,每张脸占的画面比例变小了,识别起来自然更难?

他们专门做了一个控制实验,把人脸在画面中的相对大小单独拎出来分析。结果发现,几个商业模型的身份相似度和人脸尺寸强相关,人脸每缩小一个百分点,相似度就掉0.016到0.019左右。而WithEveryone几乎不受人脸尺寸影响,斜率接近于零,只有负0.002。

这意味着,即便把人脸尺寸这个因素控制住了,GPT-Image 2和Seedream的掉分大部分能被"人脸变小"解释掉,但WithEveryone本身的掉分幅度基本不变。换句话说,WithEveryone的这点掉分,不是因为脸小了看不清,而可能来自别的因素,比如身份之间的相互干扰、遮挡、构图复杂度的提升。这也是论文自己坦承还没完全解决的问题。

有意思的是,当人脸在112像素这个特定尺寸(这正好是ArcFace编码器的标准输入尺寸)以下时,WithEveryone的优势最明显。112到150像素区间内,WithEveryone达到0.611,同区间GPT-Image 2只有0.561,Seedream 5.0 Pro只有0.388。这个规律很实用:小脸场景,恰恰是WithEveryone最擅长的地方,而这也正是十人合影里最常出现的情况,因为人越多,每张脸自然就越小。

规划得好不好,比执行得好不好更重要

论文的最后一部分分析很值得单独说一说,因为它诚实地指出了这个系统目前最大的瓶颈在哪。

团队设计了一个叫Plan IoU(计划执行度)的指标,专门衡量"生成出来的图像,有没有忠实执行模型自己规划好的布局"。

Plan IoU:把模型预测的人脸位置框和最终生成图像里检测到的实际人脸框做重叠度比对,重叠度越高,说明生成过程越忠实地按照计划来执行。

结果发现,如果用模型自己预测的布局,Plan IoU能达到0.773,这个数字已经相当高了,说明生成这一步基本上很听话,会按照规划去执行。但如果换成"标准答案"级别的完美布局,身份相似度和覆盖率还能进一步大幅提升。

这个对比说明了什么?说明瓶颈不在"执行"这一步,而在"规划"这一步。模型已经很擅长照着自己写的施工图去盖房子了,问题是这份施工图本身,还没画到最好。

这就像一个学生已经养成了认真按照大纲复习的好习惯,大纲写什么他就学什么,执行力没问题。真正拖后腿的,是大纲本身还有遗漏,某些该考的重点没写进去。补课的重点不该放在"逼他更认真执行大纲",而应该放在"帮他写一份更完整的大纲"。

论文里还有个细节佐证了这个判断:在训练过程中,"执行计划"这项能力收敛得比"身份保持"更早,说明生成模块很快就学会了乖乖听话,真正需要打磨的是理解侧那份规划能力。

写在后面

读这篇论文的过程中,最触动我的其实不是任何一个具体的技术模块,而是它反复强调的一个判断:身份保持在多人场景下失效,根本原因往往不是"记不住脸",而是"配不上号"。

这个洞察挺反直觉的。大部分人第一反应会觉得,AI画不好多人合影,是因为它"脑容量不够",装不下那么多张脸。但论文告诉我们,真正的瓶颈可能是配对机制本身在噪声环境下会失灵,导致本该精准的监督信号自己把自己搅乱了。这就好比你以为一个人记性不好,其实是他每次记东西的时候都被人在旁边故意打乱顺序。

另一个让我反复琢磨的地方是LG-ID Loss这个设计的哲学。它没有去优化"猜测"这件事本身,而是直接质疑了"为什么非要猜"。这种思路在工程问题里其实很常见,很多时候我们花大量精力去优化一个环节,却没意识到这个环节本身根本不该存在,答案早就摆在那里,只是没人愿意直接用。

这篇论文也留了一个挺诚实的口子没关上:当用户给的提示词本身就很模糊的时候,比如只说"给我们拍张合照",却没说谁站左边谁站右边,那么理论上存在无数种同样合理的排布方式。这时候"布局对不对"这个问题该怎么评判,论文自己也承认目前还没有很好的答案。

如果一张合影本来就没有唯一正确的构图,那"规划能力"这件事,最终追求的究竟是逼近某个标准答案,还是学会在无数种合理可能里,选出一种让所有人看着都舒服的那一种?这个问题,可能比论文里任何一个技术模块都更难回答。

Q&A

Q1:WithEveryone是什么?

A:WithEveryone是由复旦大学、腾讯混元实验室和香港大学团队提出的一个统一多模态框架,能够根据五到十张参考人脸生成一张连贯的多人合影。它的核心创新是把身份识别、布局规划和图像生成放进同一个模型的一次推理过程里完成,而不是拆成几个独立模块分别处理。

Q2:WithEveryone和GPT-Image 2、Nano Banana比谁更强?

A:在论文构建的210个样本、五到十人的测试集上,WithEveryone的目标场景身份相似度(Sim(Tgt))达到0.499,高于GPT-Image 2的0.462;拷贝痕迹分数只有0.055,远低于GPT-Image 2的0.169;身份覆盖率达到97.3%,是所有对比模型中最高的。

Q3:LG-ID Loss解决了什么问题?

A:传统的身份损失函数需要先"猜测"生成图像里哪张脸对应哪个参考身份,人一多、图像噪声大的时候这个猜测经常出错,反而会把监督信号搞乱。LG-ID Loss直接利用训练数据里已经标注好的人脸坐标框来做裁剪比对,跳过了猜测这一步,是论文里带来身份提升最大的单项改动。

作者声明:作品含AI生成内容
举报/反馈
分享到: 微博 QQ 空间
对本文内容有合作意向?
我们将在 1 个工作日内与您联系
留言咨询