FaceNet 是谷歌发表在 CVPR 2015上的一篇文章。先前基于人脸识别的方法,无论是 DeepID 系列[1][2][2+][3]还是 DeepFace 均采用分类的方式进行训练。尽管精度不断提升,处理过程却越来越趋向复杂。3D人脸对齐或模型融合都不便于训练的展开。
与之相反,FaceNet 则显示出纯粹的数据驱动。其借助 Triplet Loss 令网络将人脸图像映射到低维空间,网络结构非常简明:
文章的创新性如下:
- FaceNet 学习从人脸图像到紧凑的欧几里德空间的映射,其中距离直接对应于面部相似性的度量。
- 输入数据集仅需要最小的对齐(面部区域周围的紧密裁剪)。
- 网络仅需128个字节就能表达人脸。
FaceNet 训练网络使得嵌入空间中的平方L2距离直接对应于人脸相似性:同一个人的人脸距离小,不同人的面部距离大。一旦产生了这种嵌入,则人脸验证仅涉及对两个嵌入之间的距离进行阈值处理;识别成为k-NN分类问题;并且可以使用诸如 K-means 或 Agglomerative clustering 等现有技术来实现聚类。
FaceNet 使用基于 LMNN 的三元损失函数。三元组由两个匹配的人脸图像和一个不匹配的人脸图像组成,并且损失旨在将正对与负对分开一段距离。它重复地将同一个人的图像拉到一起并同时将任何不同人的图像推开。人脸图像基于原图人脸区域进行紧密裁剪,除了缩放和平移之外,没有2D或3D对齐。
三元组的选取对于达到良好的性能至关重要。受 Curriculum Learning 的启发,文章提出了一种新的在线负样本挖掘策略,确保在网络训练时不断增加三胞胎的难度。为了提高聚类精度,文章还探索了正样本难例挖掘技术,该技术促进单个人嵌入的球形聚类。
方法
嵌入函数
f
(
x
)
f(x)
f(x) 将图像
x
x
x 映射到特征空间
R
d
\mathbb{R}^d
Rd,一个
d
d
d 维欧几里德空间中。另外,我们将这种嵌入限制在
d
d
d 维超球面上,即
∥
f
(
x
)
∥
2
=
1
\|f(x)\|_2=1
∥f(x)∥2=1。这种损失由[19]在最近邻分类的背景下提出。在这里,我们要确保特定人的图像
x
i
a
x_i^a
xia (anchor)较之任何其他人的任何图像
x
i
n
x_i^n
xin(negative),更接近同一个人的所有其他图像
x
i
p
x_i^p
xip(positive)。
即:
∥
f
(
x
i
a
)
−
f
(
x
i
p
)
∥
2
2
+
α
<
∥
f
(
x
i
a
)
−
f
(
x
i
n
)
∥
2
2
,
∀
(
f
(
x
i
a
)
,
f
(
x
i
p
)
,
f
(
x
i
n
)
)
∈
T
.
\begin{aligned} \|f(x_i^a) -& f(x_i^p)\|_2^2 + \alpha < \|f(x_i^a) - f(x_i^n)\|_2^2\;,\\ \:\forall&\left(f(x_i^a), f(x_i^p), f(x_i^n)\right)\in\mathcal{T}\;. \end{aligned}
∥f(xia)−∀f(xip)∥22+α<∥f(xia)−f(xin)∥22,(f(xia),f(xip),f(xin))∈T.
其中
α
\alpha
α 设定正负对之间的边界。
T
\mathcal{T}
T 是训练集中所有可能的三元组的集合,并且基数为
N
N
N。
需要最小化的损失为:
L = ∑ i N [ ∥ f ( x i a ) − f ( x i p ) ∥ 2 2 − ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 + α ] + . L = \sum_i^N\left[\left\|f(x_i^a)-f(x_i^p)\right\|_2^2 - \left\|f(x_i^a)-f(x_i^n)\right\|_2^2+\alpha\right]_+\;. L=i∑N[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]+.
生成所有可能的三元组将导致其中许多三元组很容易满足约束条件。这些三元组不会对训练有所贡献,但仍会通过网络传递,从而导致收敛速度变慢。选择活跃的难三元组有助于改进模型,因此至关重要。以下部分讨论了我们用于三元组选择的不同方法。
为了确保快速收敛,需要选择违反三元组约束的三元组。这意味着,给定 x i a x_i^a xia,我们想要根据 a r g m a x x i p ∥ f ( x i a ) − f ( x i p ) ∥ 2 2 \mathrm{argmax}_{x_i^p}\left\|f(x_i^a)-f(x_i^p)\right\|_2^2 argmaxxip∥f(xia)−f(xip)∥22 选择 x i p x_i^p xip(hard positive);类似地, a r g m i n x i n ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 \mathrm{argmin}_{x_i^n}\left\|f(x_i^a)-f(x_i^n)\right\|_2^2 argminxin∥f(xia)−f(xin)∥22 得到 x i n x_i^n xin (hard negative) 。
在整个训练集中计算 a r g m a x \mathrm{argmax} argmax 和 a r g m i n \mathrm{argmin} argmin 是不可行的。 此外,它可能导致训练不佳,因为错误标记和成像不佳的人脸将主导正负难例。有两个显而易见的选择可以避免这个问题:
- 每隔 n 步,使用最新的网络检查点并在数据子集上计算 a r g m a x \mathrm{argmax} argmax 和 a r g m i n \mathrm{argmin} argmin,生成三元组。
- 在线生成三元组。这可以通过从小批量中选择难正/负样本来完成。
在这里,我们致力于在线生成方法。使用几千个样本的大 mini-batch,并且只在 mini-batch 中计算 a r g m a x \mathrm{argmax} argmax 和 a r g m i n \mathrm{argmin} argmin。
为了有效地表示锚点与正样本的距离,需要确保每个 mini-batch 中每个ID 均有一定数量的样本。在实验中,我们对训练数据进行采样,使得每个 mini-batch 中每个 ID 选择大约40个人脸。此外,在每个 mini-batch 中添加随机抽样的负样本。
我们不是选择最难的正样本,而是在 mini-batch 中使用所有锚点-正样本对,同时选取难负样本。我们没有对选择难锚点-正样本对和使用所有锚点-正样本对进行并列比较。但是,我们在实践中发现训练初期选用所有锚点-正样本对更稳定并且收敛速度稍快一些。
我们还探索了三元组在线和离线生成的协同,这可能允许使用更小的批量,但实验尚无定论。
选择最难的负样本实际上可能会在训练早期导致糟糕的局部最小值,特别是它可能导致模型坍塌(例如
f
(
x
)
=
0
f(x)=0
f(x)=0)。为了规避这种情况,选择
x
i
n
x_i^n
xin 使得
∥
f
(
x
i
a
)
−
f
(
x
i
p
)
∥
2
2
<
∥
f
(
x
i
a
)
−
f
(
x
i
n
)
∥
2
2
.
\left\|f(x_i^a)-f(x_i^p)\right\|_2^2<\left\|f(x_i^a)-f(x_i^n)\right\|_2^2\;.
∥f(xia)−f(xip)∥22<∥f(xia)−f(xin)∥22.
我们称这些负样本为半难负样本,因为它们比正样本更远离锚点,但仍然很难,因为平方距离接近锚点与正样本的距离。这些负样本位于边界 α \alpha α 内。
如前所述,正确的三元组选择对于快速收敛至关重要。一方面,我们希望使用小 mini-batch,因为这些 mini-batch 倾向于在随机梯度下降(SGD)期间提高收敛性。另一方面,实施细节使得数十到数百个样本的批次更有效。然而,关于批量大小的主要限制是我们从小批量中选择难相关三元组的方式。在大多数实验中,我们使用的批量大小约为1,800个样本。
评估
给出一对人脸图像,平方 L 2 L_2 L2 距离阈值 D ( x i , x j ) D(x_i,x_j) D(xi,xj) 用于确定二者是 same 还是 different。所有相同身份的人脸对 ( i , j ) (i,j) (i,j) 用 P same \mathcal{P_\text{same}} Psame 表示,而所有不同身份对用 P diff \mathcal{P_\text{diff}} Pdiff。
我们将所有 true accepted 的集合定义为
T
A
(
d
)
=
{
(
i
,
j
)
∈
P
same
,
with
D
(
x
i
,
x
j
)
≤
d
}
.
\mathrm{TA}(d)=\{(i,j)\in\mathcal{P_\text{same}},\text{with}\,D(x_i,x_j)\leq d\}\;.
TA(d)={(i,j)∈Psame,withD(xi,xj)≤d}.
这些是阈值为
d
d
d 时正确分类为 same 的人脸对
(
i
,
j
)
(i,j)
(i,j)。类似地,
F
A
(
d
)
=
{
(
i
,
j
)
∈
P
diff
,
with
D
(
x
i
,
x
j
)
≤
d
}
\mathrm{FA}(d)=\{(i,j)\in\mathcal{P_\text{diff}},\text{with}\,D(x_i,x_j)\leq d\}
FA(d)={(i,j)∈Pdiff,withD(xi,xj)≤d}
是所有错误归类为 same(false accept)的集合。
然后将给定人脸距离
d
d
d 的验证率
V
A
L
(
d
)
\mathrm{VAL}(d)
VAL(d) 和误接受率
F
A
R
(
d
)
\mathrm{FAR}(d)
FAR(d) 定义为
V
A
L
(
d
)
=
∣
T
A
(
d
)
∣
∣
P
same
∣
,
F
A
R
(
d
)
=
∣
F
A
(
d
)
∣
∣
P
diff
∣
.
\mathrm{VAL}(d)=\frac{\left|\mathrm{TA}(d)\right|}{\left|\mathcal{P_\text{same}}\right|}\;,\quad \mathrm{FAR}(d)=\frac{\left|\mathrm{FA}(d)\right|}{\left|\mathcal{P_\text{diff}}\right|}\;.
VAL(d)=∣Psame∣∣TA(d)∣,FAR(d)=∣Pdiff∣∣FA(d)∣.
F A R < 1 0 − 4 \mathrm{FAR}<10^{-4} FAR<10−4 时 ROC 急剧下降表明测试数据中的标签噪声很大。在极低的错误接受率下,单个错误标记的图像会对曲线产生显着影响。
嵌入维度
应该注意的是,在训练期间使用了128维浮点矢量,但是它可以被量化为 128-bytes 而不会损失精度。因此,每个人脸由128维字节矢量紧凑地表示,这非常有利于大规模聚类和识别。在很小的精度损失下可以实现较小的嵌入,并且可以在移动设备上使用。
总结
初读 FaceNet 只记住了 TripletLoss,几个月后回顾方才注意到散落的细节。文章不仅仅提出一种算法,而是汇聚了实践的智慧。特征选择、课程学习(Curriculum Learning)、训练集中的低质量样本、ROC 上的断崖式下降、图像质量对结果的影响、用于移动端部署的网络、特征压缩、模型升级均在讨论范围之内。很难想象文章发表于人脸识别尚在实验室刷榜的年代。
参考资料: