同一张脸,两个扫脸工具为什么给出不同分数
一张照片丢进两个扫脸 App,分数能差二十点。差别来自关键点数量、归一化分母、训练数据和滤镜,文末给一套在家就能跑的对比方法。
先说结论
同一张照片,丢进两个扫脸 App,分数差二十点很正常。两个 App 都没坏。分数不是你脸上的某种属性,而是一条流水线的输出,而流水线的每一段都埋着选择题。选择题换了答案,数字就变了。
其中三个选择决定了大部分差距:量的是脸上哪些点、这些测量值除以什么、以及得到的比值落在 App 自己那把尺子的哪个位置。还有第四个,大多数人根本不会想到——它发生在 App 看到画面之前。
1. 它们量的不是同一批点
扫脸模型都建立在关键点方案上,而这些方案彼此并不通用:
- 68 点——dlib 和早期 OpenCV 的经典布局。下颌轮廓、两条眉、鼻梁和鼻底、两个眼眶、内外唇线。
- 98 点——WFLW 标注方案,不少研究模型在用。思路一样,但眼周和唇形更密。
- 468 点——MediaPipe Face Mesh,一张覆盖整张脸的密集网格,连脸颊和额头都算进去。
- 478 点——同一张网格,外加 10 个虹膜点,每只眼 5 个。
差别在哪儿?拿鼻宽举例。68 点方案里只有两个鼻翼点和一段距离;468 点网格上,鼻子附近有好几对候选点,公式挑哪一对,量出来的宽度就差几个百分点。下颌宽同理:密集网格最外侧的那个脸颊点,和 68 点方案里的下颌角,根本不是同一个解剖位置。两个 App 都可以老老实实写着"下颌宽",量的却是你脸上不同跨度的两段。
点多不等于更准。网格越密,公式可选的余地越大,也就越容易和隔壁工具对不上。
2. 每个比值都需要分母,而它们挑的分母不同
像素距离本身没有意义——分辨率一变、离镜头远近一变、裁剪切法一变,数字就跟着变。所以所有工具都会把原始距离除以某个东西,变成比值。常见的分母有四种:
| 分母 | 表现 |
|---|---|
| 瞳距 | 跨裁剪稳定,但对眼角检测很敏感 |
| 包围盒宽度 | 受头发、耳朵和背景抠图影响 |
| 颧骨宽 | 最接近"脸宽",但这个点本身很软、会漂 |
| 眉到下巴的高度 | 随表情和下颌姿态变化 |
两个 App 可以量出完全相同的鼻翼跨度,却报出不同的"鼻宽比",原因只是一个除以颧骨宽、另一个除以包围盒。如果包围盒把你的头发也算进去,分母变大,所有比值一起变小——整齐地变小。这就是为什么你什么都没变,整张脸的分数却掉了。
有个好用的判别法:换发型数字会动、换表情数字不动,那它多半用的是包围盒当分母。
3. 训练数据不是中立的
关键点模型是从标注照片里学出来的,学过哪些照片,决定了它在哪些脸上准。Google 公开的 Face Mesh 说明里提到训练集约三万张图像。不管具体构成如何,没有任何一个数据集能同等代表所有人群。这个领域公认的薄弱环节也很一致:极端头部角度、暗光、眼镜/胡须/头发遮住面部,以及在标注集里出现较少的肤色。
落到实际使用中,就是一个你看不见的误差。下颌角偏两三个像素,在预览里根本看不出来,但换算成比值就是实打实的变化,而这个比值后面会被映射到 0–100,斜率还挺陡。输入端一点点错,输出端一大截差。
同一个 App、同一个人,换盏灯分数就变,也是这个道理。那不是"状态不好",是检测器置信度在动。
4. 模型跑之前,画面已经被改过一遍
多数手机摄像头在任何 App 拿到画面之前就已经处理过一帧:磨皮、色调映射,有的还会直接重塑脸型。这带来两个后果。
第一,磨皮抹掉了关键点模型用来找边缘的纹理梯度——唇线、双眼皮褶、鼻翼两侧。关键点开始漂。
第二,重塑改变了几何形状本身。模型随后测的是被重塑过的那张脸,而且测得很准。它没错,只是喂给它的输入已经不是你。
一个读原始相机缓冲的 App,和一个读已经处理过的预览画面的 App,就算算法一模一样,结果也会不一样。
5. 最后一步是设计出来的,不是测出来的
就算关键点相同、分母也相同,数字还是会不同,因为把比值变成分数是一次设计决策。常见写法是:取比值 r,夹在最小值与最大值之间,线性映射到 0–100。端点一挪,所有分数跟着挪。
A 工具的 70 分可能意味着"区间中段、略高于平均";B 工具的 70 分可能意味着它自己样本里的前 10%。这些端点没有对齐任何外部标准,只是让分布在一两百张测试图上看起来合理。
所以绝对分数没法跨 App 比较。排序稍微能比一点,但也只在相似的一小撮脸之间成立。
一套你真的能跑起来的对比
诀窍是把自己这个变量去掉。一张打印出来的照片是物理常量:几何一样、光线一样,每一次都一样。
- 选一张清晰的正脸照,用哑光纸打印,高度约 15 厘米。
- 贴在墙上,与眼睛同高。用一盏灯从正面打光,拉上窗帘。
- 用每个工具扫这张打印件,间隔十分钟扫两次,两个数字都记下来。
- 再用真人自拍重复一遍:距离 60 厘米,镜头与眼睛同高,关掉滤镜。
- 列一张表:工具、打印件分数、自拍分数、差值。
怎么读这张表:
- 打印件稳定、自拍乱跳——这个工具对输入敏感,不是对脸敏感。它的波动来自光线和姿态。
- 同一个工具上,打印件分数和自拍分数差很远——它在做重度预处理。打印件没有皮肤纹理可磨,两种输入对它并不等价。
- 两个工具对五张打印脸的排序一致——它们在用不同的尺子量相似的东西。
- 排序对不上——它们量的根本是两回事,标签在替它们圆场。
拿五张脸比排序,是唯一能跨过"刻度不同"这道坎的比法。绝对数字不通用,排序有时通用。
如果你发现波动主要来自自己这一端,先把输入固定下来:自拍角度指南 讲了距离、镜头高度和光线;脸型分析器 则适合用来验证——同一张照片连传两次,看同一条流水线会不会自己跟自己打架。
那你拿到的分数该怎么看
以上这些不会让测试变得不好玩,只会让它变得可读。两个 App 对你的脸意见不一致时,这个不一致是关于 App 的事实——它们的关键点、分母、训练集、刻度——不是关于你的事实。在认真对待一张截图之前,知道这一点挺重要。
常见问题
同一张照片,为什么两个 App 分数不同?
关键点方案不同、同一个比值用了不同分母、训练数据不同、最终刻度的端点不同。其中任何一条,都足够让分数差出十分。
分数高的那个更准吗?
不是。这里根本没有一个"真值"可供对准。分数高通常只说明它的刻度锚点更低,或者它的公式正好奖励了你身上的某个特征。
哪种关键点数量最准?
没有统一答案,要看任务。68 点成熟、便宜;468 或 478 点覆盖密集,适合做形状分析。准确度主要来自训练集和它跟你拍摄条件的匹配程度,而不是点数本身。
试试免费的扫脸测试
15 个纯娱乐测试。上传一张自拍拿到分数,然后按它值得被认真的程度对待它。
打开测试