29

文章目录

  1. 引言
  2. 背景
  3. 正文
    1. 网络结构
    2. Triplet Loss
    3. 三元组的选择
    4. 深度卷积网路
    5. 实验及结果
      1. 不同网络结构的对比
  4. 结束语
  5. 引用

引言

本文中提出了一个非常著名的概念:triplet loss。使用该loss函数,作者提出了一个新的系统FaceNet,它可以学习一个从人脸图像到一个小的欧几里得空间的映射,并且在这个新的空间中像点之间的距离可以反映原本人脸图片之间的相似性。这类似于词嵌入(Word Embedding)的方法,只不过本文中实现的是人脸图片的嵌入。文中使用了卷积神经网络来直接优化Embedding,而没有使用之前的一些论文中常用的瓶颈层。

背景

之前基于深度网络的人脸识别算法基本上都是使用一个分类层来训练一些已知标识的人脸数据,然后使用其中的瓶颈层的数据作为原图片在低维空间中的特征表示。这种方法有两个缺点:

  1. 它是输入人脸图片的一种间接的表示。人们只能寄希望于他们训练好的网络可以泛化到新的没有标识的图片中。
  2. 它的效率不高。使用瓶颈层的数据作为输入图片的表征时,通常这种表征的维度非常大(比如:1000)。

在此背景之下,作者提出了基于triplet lossFaceNet,可以将输出表征的维数降低到128维。

正文

网络结构

FaceNet网络结构如下图所示:

FaceNet网络结构

输入数据经过CNN处理之后进行了L2归一化就可以得到图片的嵌入表征(Embedding),然后Triplet loss函数使用嵌入表征作为输入计算出loss值进行训练。

Triplet Loss

Triplet Loss的设计可以帮助寻找一个可以将图片$x$映射到特征空间$\mathbb{R}^n$的嵌入函数$f(x)$。这个嵌入函数$f(x)$独立于任何特定人物的样本,也就是说同一个人的人脸图片在$\mathbb{R}^n$中的平方距离小;不同人的人脸图片在$\mathbb{R}^n$中的平方距离大。

我们用$f(x) = \mathbb{R}^d$表示图片的嵌入。它将图片$x$嵌入到一个$d$维的欧几里得空间去。另外,所有的嵌入表示都在$\mathbb{R}^d$空间的一个球面上,也就是$\Vert f(x) \Vert_2 = 1$。Triplet loss希望可以确保一个人的图片可以距离同一人的所有其他图片近,而远离表示不同人的图片。用公式表示如下:

$$ \Vert f(x_i^a) - f(x_i^p) \Vert_2^2 + \alpha < \Vert f(x_i^a) - f(x_i^n) \Vert_2^2 , \\\ \forall (f(x_i^a), f(x_i^p), f(x_i^n)) \in T $$

其中$x_i^a$表示锚点图片,$x_i^p$表示与$x_i^a$同一人的图片,$x_i^n$表示不同人的图片。上式表示,不同人的图片之间的距离至少比相同人的图片之间的距离大$\alpha$。可以用如下示意图表示Triplet loss的学习过程:

Triplet loss 学习过程

可以看到学习后可以拉近同一标签的图片之间的距离,而拉大不同标签图片之间的距离。

那么loss函数可以定义如下:

$$ Loss = \sum_i^N max(\Vert f(x_i^a) - f(x_i^p) \Vert_2^2 - \Vert f(x_i^a) - f(x_i^n) \Vert_2^2 + \alpha, 0) $$

其中$\alpha$是一个超参数;$max$用于进行一定限制:某一标识图片到其它标识图片的距离比这个标识所有图片间的距离都至少大$\alpha$时,就无需再进行优化了。

三元组的选择

如何选择三元组$(x_i^a, x_i^p, x_i^n)$对于最后的模型性能表现以及训练过程的收敛速度都有很大影响。如果采用随机选择三元组,训练效果可能并不好。因为一般不同标识图片间的距离,很容易就可以被训练到比相同图片间的距离大很多。因此我们需要选择那些比较难困难的样本进行训练。困难可以体现在两个方面:

  1. 同一标识的,但是看起来很不一样的图片
  2. 不同标识,但是看起来很像同一个人的图片

我们如果尽量选择这样的三元组,那么应该可以达到我们想要的效果。

由于每次如果都从所有样本中选择最困难的三元组非常耗时,而且如果样本中存在一些噪音数据(比如标签打错了),那么就可能导致训练无法收敛。文中采用的一种产生三元组的方法是:首先随机采样出一个样本数量比较小的mini-batch,这个mini-batch需要确保包含一定数量的不同标识。论文中,将这个mini-batch中所有的相同标识的对都取出,然后从mini-batch中选择比较难以区分的不同标识的图片组成三元组。

深度卷积网路

文中使用了两种类型的优化器:

  1. 标准反向传播算法的SGD
  2. AdaGrad

一些实验设定如下:

  1. 初始学习率设置为0.05
  2. 模型参数随机初始化
  3. $\alpha$设置为0.2

实验使用了CPU集群训练了1000~2000个小时。在训练了500小时之后,loss下降速度明显下降,但是继续训练仍然可以显著改善模型性能。

文中使用了两类卷机神经网络,第一类在Zeiler&Fergus[2]的网络中加了一个$1\times 1 \times d$的卷积层。网络结构见下表:

网络1

第二类网络是基于GoogLeNet[3]的。

对这两种网络感兴趣可以去查看相应论文。

实验及结果

本小节给出论文中的一些实验结果。

不同网络结构的对比

网络结构对比

其中横坐标是False Accept Rate,纵坐标是Validation Rate。NN1就是第一类网络结构;NN2/NNS1/NNS2是第二类网络结构,从NN2->NNS1->NNS2,参数越来越少。

下面的表格中给出了不同的网络结构在$FAR=10^{-3}$时,VAL的情况:

VAL对比

文中还给出了其它一些有趣的结果,感兴趣的可以参考论文。

结束语

文中,模型训练输出为$128$个浮点数的向量,但是这128维的向量可以在不损失精度的情况下量化到128字节。并且更小的存储在损失一些精度的情况下也是可以实现的,这对于一些移动设备使用场景很重要。

引用

[1] Schroff, Florian, Dmitry Kalenichenko, and James Philbin. "Facenet: A unified embedding for face recognition and clustering." Proceedings of the IEEE conference on computer vision and pattern recognition. 2015.

[2] M. D. Zeiler and R. Fergus. Visualizing and understanding convolutional networks. CoRR, abs/1311.2901, 2013. 2, 3, 4, 6

[3] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions. CoRR, abs/1409.4842, 2014. 2, 3, 4, 5, 6, 10