本文目录导读:

计算人脸相似度,本质上是比较两张人脸图片在特征空间中的距离或相似程度,现代主流方法都基于深度学习。
以下是目前最常用、最有效的计算流程和核心原理:
核心流程:三步走
无论使用哪种具体算法,流程基本一致:
- 人脸检测与对齐:在图片中找到人脸的位置(坐标框),并关键点(眼睛、鼻子、嘴巴)将其校正为正面、归一化的标准脸。
- 特征提取:将预处理后的人脸图像输入一个预训练的深度学习模型(如 FaceNet, ArcFace, CosFace),输出一个固定长度的特征向量(例如512维或128维的浮点数数组),这个向量被称为“人脸嵌入向量”。
- 相似度计算:计算两个特征向量之间的距离或相似度,数值越小(距离越小)或越大(相似度越高),说明两个人脸越像。
常用的相似度计算方法
在得到两个特征向量后,通常使用以下两种数学方法:
余弦相似度 (Cosine Similarity)
- 原理:计算两个向量之间夹角的余弦值,值越接近1,说明方向越一致(越相似)。
- 公式: [ \text{similarity} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|} ]
- 特点:对向量的绝对长度不敏感,更关注方向,这是最常用的方法,尤其在 FaceNet、ArcFace 等模型中默认使用。
- 判定:通常设定阈值,比如相似度 > 5 认为是同一个人(非标准值,具体取决于模型和任务)。
欧几里得距离 (Euclidean Distance)
- 原理:计算两个点在多维空间中的直线距离,数值越小,表示越相似。
- 公式: [ \text{distance} = \sqrt{\sum_{i=1}^{n} (A_i - B_i)^2} ]
- 特点:对向量的位置和长度都敏感,通常在模型的嵌入向量被 L2归一化(即模长为1)后,余弦相似度与欧几里得距离在数学上是正相关的(只是顺序相反)。
- 判定:设定阈值,如距离 < 0 认为是同一个人。
其他方法
- 皮尔逊相关系数:实际上是数据中心化后的余弦相似度,也常用。
- 曼哈顿距离 / 汉明距离:在某些老旧算法或二值化特征(如 FaceNet 的量化版本)中会用。
主流深度学习模型如何得到特征向量?
这些模型不是直接算“长相”,而是通过大量数据训练,学会提取最具区分度的特征。
- Loss函数(核心):如 ArcFace 或 CosFace,它们在训练时,让同一人的特征向量在空间中尽可能聚集(类内距离小,如0.5),不同人的特征向量尽可能分散(类间距离大,如1.5),这样训练出来的模型对姿态、光照、角度、遮挡具有鲁棒性。
- 输出:模型中间层或最后一层全连接层之前(去掉分类层)的输出就是128维或512维的特征向量。
实际应用中的注意事项
- 图像质量是关键:光照差、模糊、大角度侧脸、分辨率过低都会大幅降低相似度,所以很多系统会先做质量筛选。
- 阈值调整:阈值不是固定的,不同模型、不同数据集、不同安全等级需求(如金融支付 vs 门禁),阈值需要根据测试集的FAR(误识率) 和 FRR(拒识率) 曲线来调节。
- 低阈值(如0.3):容易放行,但可能误判为同一人。
- 高阈值(如0.8):安全性高,但可能拒绝了本人。
- 活体检测:仅凭人脸相似度是不够的,还需要配合活体检测(眨眼、张嘴、光线变化等)防止照片或视频攻击。
| 方法 | 核心思想 | 常用场景 | 输出范围 |
|---|---|---|---|
| 深度学习特征 + 余弦相似度 | 提取固定维度的“人脸数字指纹”,计算方向一致性 | 绝大多数现代系统 | [ -1, 1 ] (>0.5 视为同一人) |
| 深度学习特征 + 欧几里得距离 | 计算“人脸数字指纹”在空间中的绝对距离 | 配合L2归一化后,与余弦等价 | [0, +∞) (<1.0 视为同一人) |
| 传统方法 (如LBP, HOG等) | 手工特征 + 相似度距离 | 基本被淘汰,在极低算力场景偶用 | 取决于具体特征 |
一句话回答:现在最主流的方法是,先用深度学习模型(如ArcFace)将两张人脸各自转换成一个512维的特征向量,然后计算这两个向量的余弦相似度,数值越接近1说明越像。