05 人脸验证与二分类
05 人脸验证与二分类
05 人脸验证与二分类
一、核心思想
将 人脸验证(Face Verification) 问题转化为一个 监督学习的二分类任务:
- 输入:一对人脸图像 $(x^{(1)}, x^{(2)})$
输出:标签 $y \in {0, 1}$
- $y = 1$:两张图是同一个人
- $y = 0$:两张图是不同人
这与 Triplet Loss 方法不同,后者需要三元组(anchor, positive, negative),而本方法只需成对样本(pairwise data)。
二、Siamese 网络结构
- 使用 两个共享权重的卷积神经网络(即 Siamese 网络)分别处理输入图像 $x^{(1)}$ 和 $x^{(2)}$。
每个分支输出一个 嵌入向量(embedding) ,通常为 128 维(或更高维):
\[f(x^{(1)}) \in \mathbb{R}^{128}, \quad f(x^{(2)}) \in \mathbb{R}^{128}\]- 由于网络参数共享,两个分支的函数 $f(\cdot)$ 完全相同。
三、相似度度量与分类器设计
为了判断两张图是否属于同一人,需将两个嵌入向量转换为一个标量相似度分数,再通过逻辑回归(Logistic Regression)输出概率。
1. 绝对差特征(Absolute Difference Features)
最常用的方法是取两个嵌入向量各维度的绝对差作为特征:
\[|f(x^{(1)})_i - f(x^{(2)})_i|, \quad i = 1, 2, \dots, 128\]将这 128 个值作为逻辑回归的输入特征。
逻辑回归的预测为:
\[\hat{y} = \sigma\left( \sum_{i=1}^{128} w_i \cdot |f(x^{(1)})_i - f(x^{(2)})_i| + b \right)\]其中:
- $\sigma(z) = \frac{1}{1 + e^{-z}}$ 是 sigmoid 函数
- $w_i$ 和 $b$ 是可学习参数
✅ 这种方式让模型自动学习哪些维度的差异对身份判别更重要。
2. 平方相似度(Squared Similarity / Chi-Squared Distance)
另一种常见度量来自 DeepFace 论文(Taigman et al., 2014):
\[\chi^2(f(x^{(1)}), f(x^{(2)})) = \sum_{i=1}^{128} \frac{(f(x^{(1)})_i - f(x^{(2)})_i)^2}{f(x^{(1)})_i + f(x^{(2)})_i + \epsilon}\]其中 $\epsilon$ 是防止除零的小常数。
也可以直接使用 余弦相似度 或 欧氏距离平方:
\[d^2 = \| f(x^{(1)}) - f(x^{(2)}) \|^2_2\]然后将其作为逻辑回归的单一输入特征。
四、训练方式
- 训练数据:大量成对图像 $(x^{(1)}, x^{(2)})$ 及其标签 $y \in {0,1}$
损失函数:标准的 二元交叉熵损失(Binary Cross-Entropy Loss)
\[\mathcal{L} = - \left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right]\]- 优化:通过反向传播联合训练 Siamese 网络和顶部的逻辑回归层。
🔁 注意:Siamese 网络的两个分支 参数绑定(tied weights) ,即更新时同步更新。
五、部署优化:预计算嵌入(Embedding Precomputation)
在实际应用中(如门禁系统):
- 数据库中的员工图像:可预先计算并存储其嵌入向量 $f(x_{\text{db}})$
- 新来人员图像:实时通过 CNN 提取嵌入 $f(x_{\text{new}})$
- 然后与所有预存嵌入比较,计算相似度并分类
✅ 优势:
- 无需存储原始图像
- 大幅减少在线计算量(只需一次前向传播 + 快速相似度计算)
- 适用于大规模数据库
💡 此技巧不仅适用于二分类方法,也适用于 Triplet Loss 训练的模型。
六、与 Triplet Loss 方法对比
| 方法 | 输入形式 | 损失函数 | 训练难度 | 部署效率 |
|---|---|---|---|---|
| Triplet Loss | 三元组 (A, P, N) | $\max(|f(A)-f(P)|^2 - |f(A)-f(N)|^2 + \alpha, 0)$ | 较高(需挖掘难负样本) | 高(可预计算嵌入) |
| 二分类(Siamese + Logistic) | 成对图像 | 二元交叉熵 | 较低(标准监督学习) | 高(可预计算嵌入) |
两者都能有效学习身份不变的人脸嵌入,可根据数据和工程需求选择。
七、关键参考文献
- DeepFace:
Yaniv Taigman, Ming Yang, Marc’Aurelio Ranzato, Lior Wolf (2014).
DeepFace: Closing the Gap to Human-Level Performance in Face Verification
→ 提出使用 Siamese 架构 + 仿射变换对齐 + 逻辑分类器进行人脸验证。
✅ 总结要点
- 人脸验证 = 二分类问题:输入成对图像,输出是否同人。
- Siamese 网络:双分支、共享权重,输出嵌入向量。
- 相似度建模:可用绝对差、欧氏距离、卡方距离等作为特征。
- 逻辑回归:在嵌入差异上做最终判别。
- 部署高效:预计算数据库嵌入,仅实时计算新图像嵌入。
- 灵活替代 Triplet Loss:尤其适合有成对标注数据的场景。
本文由作者按照 CC BY 4.0 进行授权