本文是对人脸识别的经典论文《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聚类的方式来处理
- 元组的选择非常重要,选的好可以很快的收敛。