Deep Learning (13) - Face Recognition
本章讨论的是目标检测的一个特殊用例——人脸识别。所谓人脸识别,就是输入一张照片,或者现场采集头像照片,并匹配数据库中的数据,来翻译成身份信息。通常一个人脸识别算法可以分作两步:
- Face verification
- Face recognition
前者输入照片和ID信息,判断是否匹配。后者输入照片信息,与数据库中已有的照片集进行匹配。当前者算法精确度足够高时,就可以应用到后者中。
One Shot Learning
Face recognition首要解决的就是One Shot Learning问题。例如公司的门禁系统,通常每个员工只上传一张个人照片,那么这个系统就要能够正确识别该员工。即便所有的员工都上传了照片,其实这个样本集的数量级仍然不会很高。怎么在一个小样本集上有效训练来达到比较好的效果,这就是One Shot Learning需要解决的问题。后面提到的Siamese网络就是One Shot Learning的一种解决方案。
Siamese Network
Siamese就是下图这样的一个网络。它包含2个或者更多个完全一样的网络分支。每个分支将输入数据映射成最终的activation向量输出。然后通过比较这两个向量的相似度,来度量两幅图片的相似度。
其中两路输出的difference用下式来表明:
上面是训练好所有权重后,如何使用一个Siamese网络来得到图片异同的预测。那么如何训练一个Siamese网络呢?要训练一个网络,首先我们需要模型的损失函数J,其次我们需要满足训练的样本集。
Triplet Loss
要训练一个Siamese网络,它的输入样本可以这样选择
一共3张图片,分成两组,训练的目标是左边一组输出的difference函数要小于右边一组输出的difference函数。考虑随机噪声,再添加一些margin,可以得到损失函数如下:
- 就是margin
- A代表Anchor,P代表Positive,N代表Negative
- m是mini-batch中的样本数
如果有1k个人的10k张图片,可以生成很多个这样APN的样本组。生成时,最好不要采用随机算法,因为如果是随机生成APN的话,导致AN很有可能图片本身差别就很大,所以就很容易满足,这样的样本就是无效样本。在生成样本时,尤其是挑选AN对时,尽量挑选比较相似的,以进行有效训练。
通过对该损失函数J进行前向传播和反向传播,来运行Gradient descent算法,迭代得到最终Siamese网络的模型参数。
参考文献
- Siamese Network: Taigman et. al., 2014, DeepFace closing the gap to human level performance.
- Triplet Loss: Schroff et. al., 2015, FaceNet: A unified embedding for face recognition and clustering.
- Siamese Network & Triplet Loss