本文是对人脸识别的经典论文《FaceNet: A Unified Embedding for Face Recognition and Clustering》的一些笔记。笔记主要是基于文章来的,也参考引用了深度之眼CV方向Paper班的PPT。
论文下载地址 https://arxiv.org/abs/1503.03832
1. 引言
1.1 人脸识别的主要任务及挑战
- Identification: 判断是谁
- verification: 判断是不是谁
- Clustering: 从大规模的脸数据集中找到相似的
- 主要挑战: 侧脸、模糊、光照、遮挡、形变
1.2 人脸识别的开集与闭集问题
- 闭集(close-set) 的人脸识别问题: 需要检测的人脸输入只在一定的范围内,测试的人脸全部都是train set 里的人,不会出现训练集之外的人。
- 开集(open-set) 的人脸识别问题: 用于测试的人脸不一定会在train-set里。
1.3 传统的处理方式
- 基于Softmax的方式: 使用一个间接的表示层,再通过softmax函数得到分类结果, 即中间层为人脸图像的向量映射,然后以分类层作为输出层。
- 缺点: 不直接且低效(表示层的维度通常很高, 如1000维)
Indirectness: 分类任务的Task并不能保证学习到的Feature适合于Recognition, 导致网络的泛化能力较弱
Inefficiency: 原始用于分类的网络往往输出的维度过大(1000维), 导致效率低下,而本文中的Facenet的Embedding只有128维.
1.4 论文的主要思想
- 基于Triplet-based损失函数(下面介绍)
- 把每张人脸的图片, 通过深度学习的方式映射到一个欧式空间的128维的向量,之后的人脸比对及识别的话,直接比对不同图片的对应的向量即可(类型于词嵌入,可以理解为图片嵌入)
- 对应向量的距离(欧式距离)越小, 那么两张图片就越接近,说明两张图片是同一个人的几率就更高,反之更低
- 这样,前面的Identification的问题,就成了k-nearest neighbors的问题, 而Verification的问题就成了Threshold Decision的问题,而Clustering的问题就可以使用k-means或者agglomerative聚类的方式来处理
- 元组的选择非常重要,选的好可以很快的收敛。
2 相关工作
神经网络部分基于Zeilei&Fergus模型/GoogLeNet模型(也可以用其它更优秀的模型来处理)。其它不重要,省略
3 模型
3.1 模型结构
- FaceNet的整体架构如下
- 输入的Triplets经过一个Backbone网络后得到128维的特征,再通过L2 Normalization映射到统一尺度,得到最终的Embedding, 输入Triplet Loss进行最终损失的计算.
3.2 思考
- 有没有办法直接学习到Embedding网络, 两个相同Label的样本的Embedding的距离小, 两个不同Label的样本的Embedding之间的距离大呢?
- 有的(如下图所示,本文试图找到一种学习方式,以达到上面所提的 基于“比较” 的目标)
3.3 Triplet Loss
- Triplet Loss其定义如下所示
其中f()是embedding function,a是anchor sample,p是positive sample, n是negative sample,α 是positive samples和negative samples之间的margin。
- 如何理解三元损失函数里的Margin?
可以结合支持向量机的Hinge Loss的话, 其实也挺好理解的. 在这里三元损失函数的Margin与SVM中的Margin的设计目标是一致的。在SVM中, 在决策边界范围外的样本的损失为0. 同样的, 在这里, 如果某个三元的区分度很明显的话, 那就不计算损失了. - 其代码实现可以为
3.4 与Contrastive Loss的区别
- Contrastive Loss的核心思想是随机从训练样本中选择两个样本,如果两者属于同一类,那么使他们的距离尽可能小,否则的话就是使他们的距离尽可能远。Loss function为:
y表示的是否是同一类别。 - 它的缺点很明显,就是需要为每对非同类样本指定margin,而且这个margin是固定的,这就导致embedding空间是固定的,不能发生畸变(distortion)。triplet loss的margin是不固定的。这样的话,对于contrastive loss来说,选择hard example通常会更快地收敛。
- Contrastive Loss每次只可以一对一的比较, 而Triplet Loss它每次可以比较两对样本,包括正样本和负样本。
- 实验上,Triplet Loss普遍上也是Contrastive Loss要好些.
3.5 Triplet 选择
- 问题: 三元损失函数在计算上是很麻烦, 计算复杂度很高, 如 10000张图片,每个人10张,这样的话, 三元组就有 1000 * (1000 – 1) * (10000 – 1000)。
- 解决方案: 很多样本都是没有什么代表性的, 如果计算,反而可能还会引起扰动. 可以使用启发式的样本查找方式,找出比较有代表性的三元组,计算损失, 这样, 既可以减少计算时间,又可以避免不必要的扰动.
- 对于Triplet Loss与Contrastive Loss, 训练样本的选择至关重要
- 选择Loss最大的Triplet并不是一个好主意
这样选择出来的数据往往被噪声所左右
搜索整个数据集的实际操作也不可行 - 有两种Mining的方式,Offline和Online
Offline方式: Generate triplets offline every n steps, using the most recent network checkpoint and computing the argmin and argmax on a subset of the data.
Online方式: Generate triplets online. This can be done by selecting the hard positive/negative exemplars from within a mini-batch.
Offline方式需要频繁手工操作, 普遍选择Online Mining. - 在训练初始阶段,如果选择过于Hard的Sample会导致Model Colapse.
- Semi Hard Sample往往是比较好的选择.
选择与Anchor距离在Margin之间的Negative Sample.
3.6 总#### 3.6 结 Triplet Loss的缺点
- 拟合时间过长
10000人,500000张左右的亚洲数据集中的训练时间一个月
contrastive loss和triplet loss的训练样本都基于pair或者triplet的, 可能的样本数是O(N2)或者O(N3)的, 当训练集很大时, 基本不可能遍历到所有可能的样本(或能提供足够梯度的样本), 所以一般来说需要很长时间拟合. - 最终效果与数据的Sample方式强相关,理想的Sample方式不仅能提升算法最后的性能,更能略微加快训练速度
实验部分 略
参考
[1] 谷歌人脸识别系统FaceNet解析 https://zhuanlan.zhihu.com/p/24837264