Notes on FaceNet

FaceNet 是 google 在 2015 年提出的基于深度学习的一个用于人脸识别, 人脸验证和人脸聚类的系统. 在 FaceNet 中, google 直接学习了一个从人脸到欧几里得空间的一个映射关系, 在欧几里得空间中点的距离就表示人脸的相似程度. 因此, 只要该映射学习的好, 那么, 使用欧几里得空间中的特征向量进行各种有关人脸的任务就可以得到一个很好的效果. FaceNet 学习的是每张图片在欧几里得空间中的表示, 从而, 在欧几里得空间中的距离就是人脸的相似性. 学习到人脸在欧几里得空间的表示之后, 其他的关于人脸的任务就变得很简单, 例如, 人脸验证就是比较两张人脸图片的距离, 人脸识别可以看成是一个简单的 K 近邻聚类, 人脸聚类直接在欧几里得空间中进行 K 均值聚类等. FaceNet 在 LFW 数据集上面的准确率为 \(99.63\%\).

之前的使用深度学习技术进行人脸识别的方法一般过程是:

  1. 在人脸数据集上面训练一个深层神经网络
  2. 在该深层神经网络中, 选取 intermediate bottleneck 作为representation. 然后使用该 representation 做其它的任务.

这些方法有两个缺点:

  1. bottleneck representation 在新的数据上面不一定 work
  2. representation 通常非常大.

为了解决以上问题, FaceNet 做法是:

FaceNet 的输出为一个 D 维的表示, 直接使用 triplet-based loss function 去优化网络, 学习该 D 维表示.

由此可见, FaceNet 中最重要的点就是如何定义该triplet-based loss function 以及如何优化该网路. 下面首先解释如何定义该 loss function 然后说明如何优化该网络.

Triplet-Based Loss Function


Triplet Loss 的基本思想就是最小化类内距离, 同时要最大化类间距离. 网络的目标是学习一个从 \(x\) 到特征空间\(R^d\) 的 embedding \(f(x)\), 从而, 使得所有人脸图片的类内距离最小同时类间距离最大. 该描述可以表示为:
\[ \left\|f\left(x_i^a\right)-f(x_i^p) \right\|_2^2+\alpha < \left\| f\left(x_i^a\right)-f\left(x_i^n\right) \right\|_2^2 \]
其中, \(f(x) \in R^d\) 是人脸图片 \(x\) 到特征空间 \(R^d\) 的映射. \(x_i^a\) 是某个人脸图片(anchor), \(x_i^p\) (positive) 是和 anchor 同类的人脸图片, \(x_i^n\) (negative) 是和 anchor 不同类的人脸图片.


由以上描述, 可以得到Loss Function:
$$ L=\left\|f\left(x_i^a\right)-f\left(x_i^p\right)\right\|_2^2+\alpha - \left\|f\left(x_i^a\right)-f\left(x_i^n\right)\right\|_2^2 $$

如果把训练集中的所有三元组全部找出来, 然后根据上述的 Loss Function 进行优化, 那么, 符合类内距离小于类间距离这一条件的三元组非常多, 显然, 这些三元组对于网络的训练是没有任何帮助的. 为了加快网络的收敛速度, 必须要找到一种寻找有效三元组的方法.

Triplet Select

所谓的有效三元组意思是, 该三元组的类内距离大于了类间距离. 给定一个人脸图片 \(x_i^a\), 需要找到一个 hard positive \(x_i^p\), 使得 \(argmax_{x_i^p}\left\|f\left(x_i^a\right)-f\left(x_i^p\right)\right\|_2^2\), 相应的, hard negative \(x_i^n\), \(\text{argmin}_{x_i^p}\left\|f\left(x_i^a\right)-f\left(x_i^n\right)\right\|_2^2\).
在整个训练集上面计算 argmin 和 argmax 显然是不切实际的做法. 实际应用中, 常用的做法有两种:

  1. 离线的状态下生成 triplets.
  2. 在线生成 triplets, 在每一个 Minibatch上面选择 hard positive 和 hard negative.

为了使minibatch生成的triplet更加合理, 生成minibatch的时候, 保证每个minibatch中每一个人平均有40张图片, 然后随机加一些negative sample 进去, 在生成 triplet 的时候, 找出所有的 anchor-positive, 然后对每个anchor-positive找出其 hard negative. 另外, 实验中还选择了一些 semi-hard 的sample:
\[ \left\|f\left(x_i^a\right)-f\left(x_i^p\right)\right\|_2^2 < \left\|f\left(x_i^a\right)-f\left(x_i^n\right)\right\|_2^2 \]

总结

  1. 三元组的目标函数是这个工作的重点
  2. 提供了一个新的思路, 也就是说并不是所有的输出都要是 softmax
  3. FaceNet 得到的结果直接是 Feature Vector, 可用来直接计算距离. 优化目标更直接, 效果也更好.