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 人脸识别的主要任务及挑战

  • 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的整体架构如下
    FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering
  • 输入的Triplets经过一个Backbone网络后得到128维的特征,再通过L2 Normalization映射到统一尺度,得到最终的Embedding, 输入Triplet Loss进行最终损失的计算.

3.2 思考

  • 有没有办法直接学习到Embedding网络, 两个相同Label的样本的Embedding的距离小, 两个不同Label的样本的Embedding之间的距离大呢?
  • 有的(如下图所示,本文试图找到一种学习方式,以达到上面所提的 基于“比较” 的目标)
    FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering

3.3 Triplet Loss

  • Triplet Loss其定义如下所示

FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering
其中f()f()f()是embedding function,a是anchor sample,p是positive sample, n是negative sample,α\alphaα 是positive samples和negative samples之间的margin。

  • 如何理解三元损失函数里的Margin?
    可以结合支持向量机的Hinge Loss的话, 其实也挺好理解的. 在这里三元损失函数的Margin与SVM中的Margin的设计目标是一致的。在SVM中, 在决策边界范围外的样本的损失为0. 同样的, 在这里, 如果某个三元的区分度很明显的话, 那就不计算损失了.
  • 其代码实现可以为
    FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering

3.4 与Contrastive Loss的区别

  • Contrastive Loss的核心思想是随机从训练样本中选择两个样本,如果两者属于同一类,那么使他们的距离尽可能小,否则的话就是使他们的距离尽可能远。Loss function为:
    FaceNet论文笔记: A Unified Embedding for Face Recognition and Clustering
    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(N^{2})O(N2)或者O(N3)O(N^{3})O(N3)的, 当训练集很大时, 基本不可能遍历到所有可能的样本(或能提供足够梯度的样本), 所以一般来说需要很长时间拟合.
  • 最终效果与数据的Sample方式强相关,理想的Sample方式不仅能提升算法最后的性能,更能略微加快训练速度

实验部分 略

参考

[1] 谷歌人脸识别系统FaceNet解析 https://zhuanlan.zhihu.com/p/24837264

上一篇:TIA WinCC Unified入门经典


下一篇:用diff 生成patch文件的命令/方法