https://github.com/seasonSH/Probabilistic-Face-Embeddings
Probabilistic Face Embeddings
Abstract
嵌入(embedding)方法通过在潜在语义空间中比较人脸特征,取得了成功的人脸识别。然而,在完全不受约束的人脸设置中,通过嵌入模型学习到的人脸特征可能是模糊的,甚至可能不存在于输入人脸中,导致噪声表征。我们提出了Probabilistic Face Embeddings (PFEs),它在潜在空间中以高斯分布表示每个人脸图像。分布的均值估计最可能的特征值,而方差表示特征值的不确定性。利用不确定性信息,可以自然地推导出匹配和融合PFEs的概率解。通过对不同基线模型、训练数据集和基准的实证评估表明,该方法通过将确定性嵌入转换为PFEs,可以提高确定性嵌入的人脸识别性能。PFEs估计的不确定性也可以作为潜在匹配精度的良好指标,这对于风险控制的识别系统非常重要。
1. Introduction
当人们被要求描述一张人脸图像时,他们不仅给出了面部特征的描述,还给出了与之相关的置信度。例如,如果图像中眼睛模糊,一个人会将眼睛的大小作为不确定的信息,并关注其他特征。此外,如果图像被完全损坏,无法识别任何属性,受试者可能会回应说他/她无法识别这张脸。这种不确定性(或置信度)估计在人类决策中是常见且重要的。
另一方面,在最先进的人脸识别系统中使用的表征通常都是置信度无关的。这些方法依赖于一个嵌入模型(例如深度神经网络),在潜在特征空间中为每个人脸图像给出一个确定的点表征[27,35,20,34,4]。潜在空间中的一个点代表了模型对给定图像中人脸特征的估计。在估计误差有一定限制的情况下,两点之间的距离可以有效地度量相应人脸图像之间的语义相似度。但是在低质量输入的情况下,在图像中预期的面部特征是模糊的或不存在的,嵌入点的大偏移是不可避免的,导致错误识别(图1a)。
考虑到人脸识别系统已经在相对受限的人脸识别基准上得到了较高的识别精度,例如LFW[10]和YTF[37],其中大多数面部属性可以清楚地观察到,近期人脸识别的挑战已经开始考虑更多无约束的场景,包括监控视频[12,18,23](见图2)。在这些任务,任何类型和程度的变化都可能存在面对图像,其中大多数由特征模型学习的期望的面部特征可能是有缺陷的。由于信息的缺乏,不太可能找到一个特征集总是能够准确地匹配这些面孔。因此,在LFW上获得超过99%准确性的最先进的人脸识别系统在IARPA Janus基准上的性能大幅下降[18,23,12]。
为了解决上述问题,我们提出了Probabilistic Face Embeddings(PFEs),它对每个输入人脸图像在潜在空间中进行分布估计,而不是点估计(图1b)。分布的均值可以被解释为最可能的潜在特征值,而分布的跨度则表示这些估计的不确定性。PFE可以从两个方面解决无约束人脸识别问题:(1)在匹配(人脸比较)过程中,PFE惩罚不确定的特征(维度),而关注置信度高的特征。(2)对于低质量输入,PFE估计的置信度可用于拒绝输入或主动请求人工协助以避免错误识别。此外,可以推导出一种自然的解决方案,将一组人脸图像的PFE表征集合为一个新的具有较低不确定性的分布,以提高识别性能。PFE的实现是开源的。本文的贡献总结如下:
1. 一种感知不确定性的概率人脸嵌入(PFE)方法,它将人脸图像表示为分布而不是点。
2. 一种基于PFE的人脸匹配和特征融合的概率框架。
3.一种将现有确定性嵌入转换为PFEs的简单方法,无需额外的训练数据。
4. 综合实验表明,该方法能够提高确定性嵌入的人脸识别性能,有效滤除低质量的输入,增强人脸识别系统的鲁棒性。
2. Related Work
为了提高判别深度神经网络(DNNs)的鲁棒性和可解释性,深度不确定性学习受到越来越多的关注[14,5,15]。不确定性主要有两种类型:模型不确定性和数据不确定性。模型不确定性是指训练数据给定后,模型参数的不确定性,可以通过收集额外的训练数据来降低[22,24,14,5]。数据不确定性解释了输出的不确定性,其主要来源是输入数据的固有噪声,因此不能用更多的训练数据[15]来消除。本文研究的不确定度可分为数据不确定度。尽管技术已经发展到能在不同的任务中估计数据不确定性,包括分类和回归[15],他们不适合我们的任务,因为我们的目标空间没有明确地给定标签(虽然我们给定了身份标签,他们不能直接作为潜在特征空间中的目标向量)。变分自编码器[17]也可以看作是估算数据不确定性的一种方法,但它主要用于生成。对于人脸识别,一些研究[6,16,45]利用模型的不确定性进行人脸表征的分析和学习,但据我们所知,我们是第一个利用数据的不确定性(有些文献中也使用了术语“数据不确定性”去解决别的问题[40]))来做识别任务的。
Probabilistic Face Representation 将人脸建模为概率分布并不是一个新想法。在人脸模板/视频匹配领域,有大量的文献将人脸建模为概率分布[29,1]、子空间[3]或特征空间中的manifolds[1,11]。然而,这种方法的输入是一组人脸图像,而不是单一的人脸图像,他们使用分布之间的相似度或距离度量,例如KL-divergence,用于比较,但是这种方法不会惩罚不确定性。同时,也有研究[19,9]试图利用人脸parts的特征建立给定人脸的模糊模型。相比之下,所提出的PFE将每一张人脸图像表示为DNNs编码的潜在空间中的分布,我们使用感知不确定性的对数似然分数来比较这些分布。
Quality-aware Pooling 与上述方法相比,最近关于人脸模板/视频匹配的工作旨在利用深度CNN嵌入的显著性(saliency),将所有人脸的深度特征聚合成一个单一的紧凑向量[41,21,39,7]。在这些方法中,一个单独的模块学习去预测图像集中每个人脸的质量,然后归一化为特征向量的加权池。我们证明了在我们的框架下可以自然地推导出一个解决方案,这不仅为质量感知的池化方法提供了概率解释,而且还得到了一个更一般的解决方案,其中图像集也可以建模为PFE表征。
3. Limitations of Deterministic Embeddings
在本节中,我们从理论和经验两方面解释确定性人脸嵌入的问题。使用表示图像空间,
表示
维的潜在特征空间。一个理想的潜在空间
应该仅编码身份显著的特征,并从与身份无关的特征中解耦出来。如此,每个身份就应该有一个独一的本质的编码
,能够最好地表示这个人,且每个人脸图像
是从
采样的observation。训练人脸嵌入的过程可以看作搜索这样一个潜在空间
和学习反向映射
的关联过程。对于确定性嵌入,反向映射是一个Dirac delta函数
,其中
是嵌入函数。很明显,对于任何空间
,给定x中噪音的可能性,要恢复精确的z值是不现实的,低质量输入的嵌入点不可避免地会偏离其固有z值(不管我们有多少训练数据)。
问题是这种偏移是否有界,使得我们的类内距离小于类间距离。然而,这对于完全不受约束的人脸识别是不现实的,我们进行了一个实验来说明这一点。让我们从一个简单的例子开始:给定一对相同的图像,一个确定性的嵌入将总是映射到相同的点,因此他们之间的距离将永远是0,即使这些图像不包含一个脸。这意味着“两张相似甚至相同的图片并不一定意味着它们属于同一个人的可能性很高”。
为了证明这一点,我们进行了一个实验,通过手工降低高质量图像,并可视化他们的相似度评分。我们从LFW数据集[10]中随机选择每个受试者的高质量图像,并手动向人脸插入高斯模糊、遮挡和随机高斯噪声。特别地,我们线性增加高斯核的大小,遮挡比和噪声的标准差来控制退化程度。在每个退化级别,我们使用64层CNN(trained on Ms-Celeb-1M [8] with AM-Softmax [33])去提取特征向量,该模型可与最先进的人脸识别系统相媲美。将特征归一化到超球面嵌入空间。然后,报道了两种类型的余弦相似度结果:(1)原始图像对与各自退化图像之间的相似度,(2)不同身份的退化图像之间的相似度。如图3所示,对于所有三种类型的退化结果,真正的相似度分数下降到0,而impostor相似度分数收敛到1.0!这表明,在完全不受约束的情况下,即使模型非常自信(非常高/低的相似度分数),也可能出现两种类型的错误:
(1) false accept of impostor low-quality pairs and
(2) false reject of genuine cross-quality pairs.
(左图的意思就是,在原始的确定性模型中,当属于同一个人的清晰图和模糊图对比时,模糊程度越大,两者的相似度越低(蓝线表示),即越容易被判别为不是同一个人;而当不属于同一个人的清晰图和模糊图对比时,模糊程度越大,两者的相似度越高(红线表示),即越容易被判别为是同一个人)
为了证实这一点,我们在IJB-A数据集上测试模型,发现impostor/genuine图像对分别对应最高/最低分数。这种情况与我们假设的完全一样(见图4)。我们将其称为Feature Ambiguity Dilemma,即当确定性嵌入被强制估计模糊人脸的特征时,就会出现这种情况。实验还暗示存在一个模糊输入映射到的dark space,且其距离度量是扭曲的。
4. Probabilistic Face Embeddings
为了解决上述由数据不确定性引起的问题,我们建议将不确定性编码到人脸表征中,并在匹配时加以考虑。具体来说,我们不是建立一个在潜在空间中进行点估计的模型,而是在潜在空间中估计一个分布来表示一个人的面孔的潜在外观(following the notations in Section 3)。具体说来,我们使用了多元高斯分布:
其中和
都是第i个输入图像
通过网络预测得到的D维向量。这里我们只考虑了一个对角协方差矩阵去减少人脸表征的复杂度。该表征应该有如下的特性:
- 中心
应该应该编码输入图像最重要的人脸特征
- 不确定性
应该编码每个特征维度的模型置信度
此外,我们希望使用单个网络来预测分布。考虑到训练人脸嵌入的新方法仍在开发中,我们的目标是开发一种方法,可以将现有的确定性人脸嵌入网络以一种简单的方式转换为PFEs。接下来,我们首先展示了如何比较和融合PFE表征来展示它们的优势,然后提出了我们学习PFEs的方法。
注1:由于篇幅的限制,我们在补充材料中提供了以下所有命题的证明。
4.1. Matching with PFEs
给定一对图像的PFE表征,我们可以直接测量他们是同一个人(共享相同的潜在编码)的"可能性":
,其中
。具体说明:
实际上,我们喜欢使用对数似然方法,所以解决方案将变为:
其中,
表示
的第
维,
表示
的第
维
注意,这个对称的度量可以被视为一个输入以另一个输入为条件的潜在编码的似然期望,也就是说
因此,我们称之为mutual likelihood score(MLS)。与KL-divergence不同,这个分数是无界的,不能被视为距离度量。可以证明,平方欧式距离等价于MLS中所有不确定度都相同的一种特殊情况:
Property 1. 如果对于所有数据
来说是一个固定值,且维度为
,MLS就等价于scaled and shifted负平方欧式距离。
此外,当不确定度允许不同时,我们注意到MLS有一些有趣的性质,使其不同于距离度量:
1. 注意机制:公式(3)中括号中的第一项可以看作是一个加权距离,它将更大的权重赋予更小的不确定维度。
2. 惩罚机制:式(3)中括号内第二项可视为惩罚项,惩罚具有较高的不确定性的维度。
3.如果或
有大的不确定性,不管他们的均值之间的距离是多少,MLE的值都会比较低(因为惩罚)
4.只有当输入和
有着小的不确定性,且他们的均值很接近,MLE才会高
最后的两个特性暗示了如果网络能够有效地估计,PFE就能够解决feature ambiguity dilemma
代码实现:
import tensorflow as tf def negative_MLS(X, Y, sigma_sq_X, sigma_sq_Y, mean=False): with tf.name_scope('negative_MLS'): if mean: D = X.shape[1].value #size为[batch_size, embedding_size] Y = tf.transpose(Y) #[embedding_size, batch_size],转置才能实现输入i-j XX = tf.reduce_sum(tf.square(X), 1, keep_dims=True) #对维度1求和,keep_dims=True维持了维度1, [batch_size, 1] YY = tf.reduce_sum(tf.square(Y), 0, keep_dims=True) #对维度0求和,keep_dims=True维持了维度0,因为Y转置了,所以是维度0, [1, batch_size] XY = tf.matmul(X, Y) #[batch_size, batch_size] diffs = XX + YY - 2*XY #会自己广播扩维计算 sigma_sq_Y = tf.transpose(sigma_sq_Y) #[embedding_size, batch_size] sigma_sq_X = tf.reduce_mean(sigma_sq_X, axis=1, keep_dims=True) #[batch_size, 1] sigma_sq_Y = tf.reduce_mean(sigma_sq_Y, axis=0, keep_dims=True) #[1, batch_size] sigma_sq_fuse = sigma_sq_X + sigma_sq_Y #[batch_size, batch_size] diffs = diffs / (1e-8 + sigma_sq_fuse) + D * tf.log(sigma_sq_fuse) return diffs else: D = X.shape[1].value #embedding_size X = tf.reshape(X, [-1, 1, D]) #[batch_size, 1, embedding_size] Y = tf.reshape(Y, [1, -1, D]) #[1, batch_size, embedding_size] sigma_sq_X = tf.reshape(sigma_sq_X, [-1, 1, D]) #[batch_size, 1, embedding_size] sigma_sq_Y = tf.reshape(sigma_sq_Y, [1, -1, D]) #[1, batch_size, embedding_size] sigma_sq_fuse = sigma_sq_X + sigma_sq_Y #[batch_size, batch_size, embedding_size],就能够得到所有i、j交叉求和的结果 diffs = tf.square(X-Y) / (1e-10 + sigma_sq_fuse) + tf.log(sigma_sq_fuse) #等式(3) return tf.reduce_sum(diffs, axis=2) #返回[batch_size, batch_size] def mutual_likelihood_score_loss(labels, mu, log_sigma_sq): with tf.name_scope('MLS_Loss'): batch_size = tf.shape(mu)[0] diag_mask = tf.eye(batch_size, dtype=tf.bool) non_diag_mask = tf.logical_not(diag_mask) sigma_sq = tf.exp(log_sigma_sq) loss_mat = negative_MLS(mu, mu, sigma_sq, sigma_sq) #返回的size为[batch_size, batch_size],每个位置ij的值表示batch_i对batch_j的结果 label_mat = tf.equal(labels[:,None], labels[None,:]) label_mask_pos = tf.logical_and(non_diag_mask, label_mat) #得到类相同的mask loss_pos = tf.boolean_mask(loss_mat, label_mask_pos)#得到类相同的两个输入计算得到的loss return tf.reduce_mean(loss_pos)#然后计算他们的均值得到最后的损失结果