从来没做过人脸识别,决定好好学习学习。
1. Introduction
首先看看是一个怎样的流程:
这里有一个embedding嵌入到我们的网络当中,随后接了一个三元组损失。
我们使用一个embedding: f(x),将图像变换到一个128维的特征空间中,在这里存放所有脸之间的距离。
相同人脸的距离比较小,而不同人脸的距离比较大。
三元组由2个同一个人的face和1个其他人的face构成。
如:(mckee1,mckee2,jack1)
loss目的是通过距离将same与different区分开。
2. Method
2.1 triplet loss
我们要做到:
其中,a表示anchor,p表示positive,n表示negative
本文alfa = 0.2
损失函数为
当然,在这里,难例挖掘是至关重要的!!!
3.2 Triplet selection
应尽量选择一些hard examples,让网络学习到有用的东西,从而更好的更新
我们选择训练样本时,选择同一个人的两张脸差异度最大的正样本,选择不同人的两张脸差异度最小的负样本。
但是计算所有训练集的差异度是不可行的。
有以下两个方法:
(1)generate triplets offline: 每迭代n次,使用最近的model在数据的一个子集中来产生难例。
(2)generate triplets online: 在迭代的过程中,我们就在mini-batch中选择难例。
本文选择的是第二种。
3.3 Deep Convolutional Networks
两种结构,如图分别为ZF和Inception
ZF:
Inception:
可以看出,Inception参数量真是太太太少了!!!有木有?
4. Datasets and Evaluation
本文用了4个dataset:其中两个是 LFW 和 YouTube Faces
设置一个阈值来区分两张图片是否是一个人
我们将所有相同人物的pair放一起,称为P_same
所有不同人物构成的pair放一起,称为P_diff
评价指标是
其中,
TA表示正确分类的正样本数。
FA表示错误分类的负样本数。
5. 示例
将阈值设为1.1就可以正确进行识别了。