FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering
这篇笔记是对《FaceNet: A Unified Embedding for Face Recognition and Clustering》这篇经典论文的相关笔记。其中部分内容参考了深度之眼CV方向Paper班的PPT资料。论文下载地址 https://arxiv.org/abs/1503.03832
1. 引言
1.1 人脸识别的主要任务及挑战
- 识别: 确定出谁
- 验证: 确定是否为某人
- 聚类: 在海量面部数据中识别出与之相似的个体
- 主要挑战: 包括侧面脸问题、图像模糊问题、光照变化问题、部分遮挡问题以及形态变形问题。
1.2 人脸识别的开集与闭集问题
- 闭集(close-set) 的人脸识别问题:该类问题限定范围内的样本作为待识别目标,在测试过程中所选取的样本均为训练数据集中的一员。
- 开集(open-set) 的人脸识别问题:对于该类问题而言,在测试阶段使用的样本可能不在训练数据集中。
1.3 传统的处理方式
- 基于Softmax的方法:采用了中间表示层,并通过应用softmax函数获得最终分类结果。
- 中间过程具有间接性且效率较低(通常该表示层的空间维度较大)。
- 缺点在于其过程具有间接性且效率较低。
- 不足之处在于其过程具有间接性且效率低下(通常情况下该表示层的空间维度较大)。
Indirectness: 分类任务的任务并不能保证学习到的有效特征适合于识别任务。
Inefficiency: 原始用于分类的任务往往输出过高的维度(如1000维),导致计算效率低下。
1.4 论文的主要思想
- 基于Triplet-based损失函数(在后面将详细介绍)
- 将每张人脸图片通过深度学习技术映射至一个128维的欧氏空间向量
- 随后的人脸比对与识别过程直接比较不同图片对应的向量(类似于词嵌入方法,在图像领域可视为图像嵌入)
- 对应向量之间的距离(欧氏距离)越小,则两张图片越接近;反之亦然——两张图片来自同一人的概率越高
- 这样, 前面的Identify 问题转化为k-nearest neighbors算法的应用
- 同时,Verify 问题则转化为阈值决策问题
- 进而,Cluster 问题则可通过k-means或层次聚类方法解决
- 元组的选择至关重要——良好的选择有助于加速收敛过程
2 相关工作
神经网络部分主要基于Zeilei&Ferguson模型以及GoogLeNet模型(此外还可以采用其他更为优化的方式进行设计)
3 模型
3.1 模型结构
- FaceNet的整体架构如下

- 输入的Triplets经由Backbone网络处理后获得128维特征向量,并被L2归一化映射至同一尺度以生成最终嵌入表示。随后将Triplet Loss作为损失函数用于计算最终损失值。
3.2 思考
- 是否能够直接构建一个基于比较的学习框架?其中,在相同Label的样本之间其表示向量之间的距离较近,在不同Label之间则具有较大的差异性?
- 本文试图通过对比学习的方式实现上述目标(如图所示)

3.3 Triplet Loss
- Triplet Loss其定义如下所示

其中f()被称为embedding函数;a被视为锚定样本;p作为正样本,n作为负样本;\alpha 被视为positive样本与negative样本之间差距的 margins.
-
如何理解三元损失函数里的Margin?
可以结合支持向量机的Hinge Loss的话, 其实也挺好理解的. 在这里三元损失函数的Margin与SVM中的Margin的设计目标是一致的。在SVM中, 在决策边界范围外的样本的损失为0. 同样的, 在这里, 如果某个三元的区分度很明显的话, 那就不计算损失了. -
其代码实现可以为

3.4 与Contrastive Loss的区别
Contrastive Loss的基本概念在于随机选取一对样本,并根据它们的类别关系调整其间的距离:同类则希望最小化间距;异类则希望最大化间距。Loss function为:

y表示的是否是同一类别。
- 它的一个明显缺点在于必须为每一对非同类样本设定一个 margin 值,并且这个 margin 是固定的;这种做法会导致 embedding 空间的形态固定无法发生变化;相比之下 triplet loss 的 margin 是可变的。
- 对于 contrastive loss 来讲,
- 在优化过程中选择 hard example 能够更快地收敛。
- 对于 contrastive loss 来讲,
- contrastive loss 每次只能一对一地进行比较,
- 而 triplet loss 则能够同时比较两对样本;
- 其中包括正样本与负样本之间的关系。
- 而 triplet loss 则能够同时比较两对样本;
- 从实验结果来看,
- triplet loss 在性能上普遍优于 contrastive loss。
3.5 Triplet 选择
-
问题: 在实际应用中使用三元损失函数会面临较大的计算负担。具体而言,在处理包含大量样本的数据集时(例如包含1万张图片的集合),每个样本有10张图片的情况下(即每类包含约9千张图片),形成的triplet数量将高达约9千乘以8千乘以9万减去9千的结果。
-
解决方案: 首先需要明确的是,在这种情况下随机选取的triplet往往缺乏代表性。因此单纯依赖于计算所有可能的triplet不仅效率低下而且容易引入噪声干扰。为此建议采用一种基于启发式的triplet选择方法,在保证一定训练效果的前提下大幅减少triplet的数量。
-
对于Triplet Loss与Contrastive Loss而言, 合适的数据选择直接影响训练效果
-
简单地选择具有最大Loss值的triplet并非最佳策略. 这种方法容易受到数据噪声的影响并且在实际应用中难以实现对整个数据集的有效搜索
-
有两种Mining的方法:Offline和Online两种
Offline方法: 在每隔n个步骤中生成三元组,并基于最新型网络模型计算最小值与最大值。
Online方法: 通过从一个小型批量中选择难正难负的示例来生成三元组。
Inline方法通常需要手动操作较多,在线 Mining更为高效。
在模型训练初期阶段时,在选择高度具有挑战性的Sample时可能会导致Model Colapse。
Semi Hard Sample往往被认为是一种较为理想的选择。
Negative Samples通常被选择为与Anchor的距离位于Margin范围内。
3.6 总#### 3.6 结 Triplet Loss的缺点
在处理大规模数据时(如包含10,000名用户和约50万张亚洲图片的数据集),模型完成一次完整训练周期所需的时间约为一个月。由于Contrastive Loss和Triplet Loss等损失函数在计算过程中主要依赖于对成对(pair)或三元组(triplet)进行操作,在这种情况下潜在的有效样本公司数量为O(N²)或O(N³),其中N为数据集中实例的数量。因此,在面对大规模数据集时(尤其是无法涵盖所有可能组合且无法提供足够有效梯度支持的情况下),长时间拟合成为常见现象。
最终效果与数据之间的采样策略呈紧密关联关系,在理想状态下这一采样策略不仅能够提升整体算法表现的同时还能带来一定程度上的加速效果
实验部分 略
参考
[1] 谷歌人脸识别系统FaceNet解析 https://zhuanlan.zhihu.com/p/24837264
