FaceNet

article/2025/8/27 16:58:17

摘要:
尽管人脸识别领域最近取得了重大进展[10,14,15,17],但大规模有效地实施人脸验证和识别对当前方法提出了严峻挑战。在本文中,我们提出了一个称为 FaceNet 的系统,它直接学习从人脸图像到紧凑欧几里得空间的映射,其中距离直接对应于人脸相似度的度量。一旦产生了这个空间,就可以使用将 FaceNet 嵌入作为特征向量的标准技术轻松实现人脸识别、验证和聚类等任务。我们的方法使用经过训练的深度卷积网络直接优化嵌入本身,而不是像以前的深度学习方法那样使用中间瓶颈层。为了训练,我们使用了使用一种新颖的在线三元组挖掘方法生成的大致对齐匹配/非匹配面块的三元组。我们的方法的好处是更高的表示效率:我们仅使用 128 字节的人脸就实现了最先进的人脸识别性能。在广泛使用的野外标记人脸 (LFW) 数据集上,我们的系统达到了 99.63% 的新记录准确率。在 YouTube Faces DB 上,它达到了 95.12%。与已发表的最佳结果 [15] 相比,我们的系统在两个数据集上都将错误率降低了 30%。

一、介绍
在本文中,我们提出了一个统一的系统,用于人脸验证(这是同一个人)、识别(这个人是谁)和聚类(在这些人脸中找到普通人)。 我们的方法基于使用深度卷积网络学习每个图像的欧几里得嵌入。 网络经过训练,使得嵌入空间中的平方 L2 距离直接对应于人脸相似度:同一个人的脸具有较小的距离,而不同人的脸具有较大的距离。

一旦产生了这种嵌入,那么上述的任务就变得直截了当:人脸验证只涉及对两个嵌入之间的距离进行阈值处理; 识别变成了一个k-NN分类问题; 聚类可以使用现成的技术来实现,例如 k-means 或凝聚聚类

先前基于深度网络的人脸识别方法使用分类层 [15]、[17] 对一组已知的人脸身份进行训练,然后将中间瓶颈层作为表示,用于泛化超出训练中使用的身份集的识别。 这种方法的缺点是它的间接性和效率低下:人们必须希望瓶颈表示能够很好地推广到新面孔; 并且通过使用瓶颈层,每个人脸的表示大小通常非常大(1000 维)。 最近的一些工作 [15] 使用 PCA 降低了这种维度,但这是一种线性变换,可以在网络的一层中轻松学习。

与这些方法相比,FaceNet 使用基于 LMNN [19] 的基于三元组的损失函数直接将其输出训练为紧凑的 128 维嵌入。 我们的三元组由两个匹配的人脸缩略图和一个不匹配的人脸缩略图组成,损失旨在将正对与负对分开一段距离。 缩略图是面部区域的紧密裁剪,除了执行缩放和平移外,没有 2D 或 3D 对齐。

选择使用哪些三元组对于实现良好的性能非常重要,并且受课程学习 [1] 的启发,我们提出了一种新颖的在线负样本挖掘策略,可确保随着网络训练而不断增加三元组的难度。 为了提高聚类准确性,我们还探索了难阳性挖掘技术,这些技术鼓励球形聚类用于单个人的嵌入。

作为我们的方法可以处理的令人难以置信的可变性的说明,请参见图 1。显示的是来自 PIE [13] 的图像对,以前被认为对于人脸验证系统来说非常困难。

本文其余部分的概述如下:在第 2 节中,我们回顾了该领域的文献; 3.1 节定义了三元组损失,3.2 节描述了我们新颖的三元组选择和训练过程; 在 3.3 节中,我们描述了使用的模型架构。 最后在第 4 节和第 5 节中,我们展示了嵌入的一些定量结果,并定性地探索了一些聚类结果。

二、相关工作
与最近使用深度网络 [15]、[17] 的其他作品类似,我们的方法是一种纯粹的数据驱动方法,它直接从人脸的像素中学习其表示。 我们没有使用工程特征,而是使用大量标记的人脸数据集来获得姿势、照明和其他变化条件的适当不变性。

在本文中,我们探讨了两种不同的深度网络架构,它们最近在计算机视觉社区中取得了巨大的成功。 两者都是深度卷积网络 [8]、[11]。 第一个架构基于 Zeiler&Fergus [22] 模型,该模型由多个交错的卷积层、非线性激活、局部响应归一化和最大池化层组成。 受 [9] 的启发,我们还添加了几个 1×1×d 卷积层。 第二种架构基于 Szegedy 等人的 Inception 模型,该模型最近被用作 ImageNet 2014 [16] 的获胜方法。 这些网络使用混合层,并行运行多个不同的卷积层和池化层,并将它们的响应连接起来。 我们发现这些模型可以将参数数量减少多达 20 倍,并且有可能减少可比性能所需的 FLOPS 数量。

有大量的人脸验证和识别工作。 回顾它超出了本文的范围,因此我们将仅简要讨论最近最相关的工作。

[15]、[17]、[23] 的工作都采用了一个多阶段的复杂系统,它将深度卷积网络的输出与用于降维的 PCA 和用于分类的 SVM 相结合。

振耀等人。 [23] 使用深度网络将人脸“扭曲”为规范的正面视图,然后学习 CNN,将每个人脸分类为属于已知身份。 对于人脸验证,网络输出上的 PCA 与一组 SVM 一起使用。

泰格曼等人。 [17] 提出了一种多阶段方法,将人脸与一般的 3D 形状模型对齐。 训练了一个多类网络以对四千多个身份执行人脸识别任务。 作者还尝试了一个所谓的连体网络,他们直接优化了两个面部特征之间的 L1 距离。 他们在 LFW (97.35%) 上的最佳表现源于使用不同对齐和颜色通道的三个网络的集合。 这些网络的预测距离(基于 χ2 核的非线性 SVM 预测)使用非线性 SVM 进行组合。

孙等人。 [14]、[15] 提出了一个紧凑的因此相对便宜的计算网络。 他们使用 25 个这些网络的集合,每个网络都在不同的面片上运行。 对于他们在 LFW 上的最终表现(99.47% [15]),作者结合了 50 个响应(常规和翻转)。 采用有效对应于嵌入空间中的线性变换的 PCA 和联合贝叶斯模型 [2]。 他们的方法不需要明确的 2D/3D 对齐。 通过使用分类和验证损失的组合来训练网络。 验证损失类似于我们使用的三元组损失[12],[19],因为它最小化了相同身份的人脸之间的 L2 距离,并在不同身份的人脸距离之间施加了一个边距。 主要区别在于只比较成对的图像,而三元组损失鼓励相对距离约束。

Wang 等人探讨了与此处使用的损失类似的损失。 [18]通过语义和视觉相似性对图像进行排序。

三、方法
FaceNet 使用深度卷积网络。 我们讨论了两种不同的核心架构:Zeiler&Fergus [22] 风格的网络和最近的 Inception [16] 类型的网络。 这些网络的细节在 3.3 节中描述。

给定模型细节,并将其视为黑盒(见图 2),我们方法中最重要的部分在于整个系统的端到端学习。 为此,我们采用了三元组损失,它直接反映了我们想要在人脸验证、识别和聚类中实现的目标。 即,我们努力将 f(x) 从图像 x 嵌入到特征空间 Rd 中,使得所有具有相同身份的人脸之间的平方距离(与成像条件无关)很小,而来自不同身份的人脸图像的一对人脸之间的平方距离的数量很大。
模型结构。 我们的网络由一个批量输入层和一个深度 CNN 组成,然后是 L2 归一化,这导致了人脸嵌入。 接下来是训练期间的三元组损失。
图2 模型结构。 我们的网络由一个批量输入层和一个深度 CNN 组成,然后是 L2 归一化进行人脸嵌入。 接下来是训练期间的三元组损失。

三元组损失最小化了anchor和positive之间的距离,两者具有相同的身份,并最大化anchor和不同身份的negative之间的距离。
图3 三元组损失最小化了两者具有相同的身份的anchor和positive之间的距离,并最大化anchor和不同身份的negative之间的距离。

虽然我们没有直接比较其他损失,例如等式2中使用正负对的方法,我们认为三元组更适合人脸验证。 动机是 [14] 的损失鼓励同一身份的所有面孔成为一个 AY 投影到嵌入空间中的单个点上。 然而,三元组损失试图在每对面孔之间从一个人到所有其他人脸强制执行一个边距。 这允许一个身份的面孔放在一个流形上,同时仍然加强距离,从而对其他身份进行区分。

以下部分描述了这种三元组损失以及如何大规模有效地学习它。

3.1 三元组损失
嵌入由 f(x)∈Rd 表示。 它将图像 x 嵌入到 d 维欧几里得空间中。 此外,我们将这种嵌入限制在 d 维超球面上,即∥f(x)∥2=1。 这种损失是在[19]中在最近邻分类的背景下引起的。 在这里,我们要确保特定人的图像 xai(锚点)更接近同一人的所有其他图像 xpi(正),而不是任何其他人的任何图像 xni(负)。 这在图 3 中可视化。
在这里插入图片描述
其中 α 是在正负对之间强制执行的边距。 T 是训练集中所有可能的三元组的集合,具有基数 N。
被最小化的损失是 L= 在这里插入图片描述
生成所有可能的三元组将导致许多容易满足的三元组(即满足等式(1)中的约束)。 这些三元组对训练没有贡献,并且会导致收敛速度变慢,因为它们仍然会通过网络。 选择活跃的硬三元组至关重要,因此有助于改进模型。 以下部分讨论了我们用于三元组选择的不同方法。

3.2. 三元组选择
为了确保快速收敛,选择违反方程式(1)中三元组约束的三元组至关重要。 这意味着,给定 xai,我们想要选择一个 xpi,使得 argmax xpi∥f(xai)-f(xpi)∥22
且选择一个xni,使得 argmin xni∥f(xai)-f (xni)∥22.

在整个训练集中计算 argmin 和 argmax 是不可行的。 此外,它可能会导致训练不佳,因为错误标记和图像不佳的人脸会主导正样本和负样本。 有两个明显的选择可以避免这个问题:

  • 每 n 步离线生成三元组,使用最近的网络检查点并在数据子集上计算 argmin 和 argmax。

  • 在线生成三元组。 这可以通过从小批量中选择硬正/负样本来完成。

在这里,我们专注于在线生成,并使用大约几千个样本的大型 mini-batchs,并且只计算 mini-batch 中的 argmin 和 argmax。

为了有意义地表示锚到正样本的距离,需要确保每个小批量中存在最少数量的任何身份的样本。在我们的实验中,我们对训练数据进行采样,使得每个小批量的每个身份选择大约 40 个人脸。此外,随机采样的负样本被添加到每个小批量中。

我们没有选择最合适的正样本,而是在一个小批量中使用所有锚-正样本对,同时仍然选择最难的负样本。我们没有对小批量中的锚-正对与所有锚-正对进行并排比较,但我们在实践中发现,所有的锚-正样本方法更稳定,收敛速度略快训练的开始。

我们还结合在线生成探索了三元组的离线生成,它可能允许使用较小的批量,但实验没有结论。

在实践中,选择最佳负样本可能会在训练早期导致局部最小值不佳,特别是它可能导致模型崩溃(即 f(x)=0)。 为了减轻这种情况,它有助于选择 xni 使得
在这里插入图片描述
我们称这些负样本为半硬样本,因为它们比正样本离锚点更远,但仍然很难,因为平方距离接近锚点正距离。 这些底片位于边距 α 内。

如前所述,正确的三元组选择对于快速收敛至关重要。 一方面,我们希望使用小型 mini-batch,因为它们往往会在随机梯度下降 (SGD) [20] 期间提高收敛性。 另一方面,实现细节使数十到数百个样本的批次更有效率。 然而,关于批量大小的主要限制是我们从小批量中选择硬相关三元组的方式。 在大多数实验中,我们使用大约 1,800 个样本的批量大小。

3.3. 深度卷积网络
在我们所有的实验中,我们使用带有标准反向传播 [8]、[11] 和 AdaGrad [5] 的随机梯度下降 (SGD) 来训练 CNN。在大多数实验中,我们从 0.05 的学习率开始,我们将其降低以最终确定模型。模型从随机初始化,类似于 [16],并在 CPU 集群上训练 1,000 到 2,000 小时。训练 500 小时后,损失的减少(和准确性的增加)急剧下降,但额外的训练仍然可以显着提高性能。余量 α 设置为 0.2。

我们使用了两种类型的架构,并在实验部分更详细地探讨了它们的权衡。它们的实际区别在于参数和 FLOPS 的不同。最佳模型可能因应用而异。例如。在数据中心运行的模型可以有很多参数,需要大量的 FLOPS,而在手机上运行的模型需要很少的参数,以便它可以放入内存。我们所有的模型都使用整流线性单元作为非线性激活函数。

第一类,如表 1 所示,在 Zeiler&Fergus [22] 架构的标准卷积层之间添加 1×1×d 卷积层,如 [9] 中所建议的那样,并产生 22 层深的模型。它总共有 1.4 亿个参数,每张图像需要大约 16 亿次 FLOPS。

我们使用的第二类是基于 GoogLeNet 风格的 Inception 模型 [16]。这些模型的参数减少了 20 倍(大约 6.6M-7.5M),FLOPS 减少了 5 倍(在 500M-1.6B 之间)。其中一些模型的尺寸(深度和过滤器数量)显着减小,因此它们可以在手机上运行。一,NNS 1,有 26M 参数,每张图像只需要 220M 110×110×64 FLOPS。另一个,NNS2,有 4.3M 参数和 20M FLOPS。表 2 详细描述了我们最大的网络 NN2。 NN3 在架构上是相同的,但输入大小减少了 160×160,NN4 的输入大小只有 96×96,从而大大降低了 CPU 需求(285M FLOPS 与 NN2 的 1.6B)。除了减小输入大小之外,它在较高层中不使用 5×5 卷积,因为那时感受野已经太小了。一般来说,我们发现 5×5 的卷积可以在整个过程中被移除,而准确度只有轻微的下降。图 4 比较了我们所有的模型。

表 1. NN1。 该表显示了我们基于 zeiler&fergus [22] 的模型的结构,其中卷积受 [9] 的启发。 输入和输出大小在中描述,内核指定为步幅,maxout [6] 池大小为 1×1rows×cols×#filtersrows×cols,p=2
在这里插入图片描述

四、 数据集和评估

我们在四个数据集上评估了我们的方法,除了野外的 Labeled Faces 和 YouTube Faces,我们在人脸验证任务上评估我们的方法。 Ĵ,即。 给定一对两张人脸图像,使用平方 L2 距离阈值 D(xi,xj) 来确定相同和不同的分类。 所有具有相同身份的人脸对 (i,j) 用 Psame 表示,而所有不同身份的人脸对用 Pdiff 表示。

在这里插入图片描述
表 2. NN2。 nn2 inception 化身的详细信息。 该模型与 [16] 中描述的模型几乎相同。 两个主要区别是使用 FFF 池而不是指定的最大池 (m)。 池化总是(除了最终的平均池化)并且与每个初始模块内的卷积模块并行。 如果在池化之后有降维,则用 p 表示,1,然后将池连接起来得到最终输出。 3×31×1,3×35×5L2

我们将所有真实接受的集合定义为:
在这里插入图片描述
这些是在阈值 d 被正确分类为相同的人脸对 (i,j)。 相似地
在这里插入图片描述
是被错误分类为相同(错误接受)的所有对的集合。

给定人脸距离 d 的验证率 VAL (d) 和错误接受率 FAR (d) 定义为

在这里插入图片描述
4.1.Hold-Out测试集
我们保留了一组大约一百万张图像,与我们的训练集具有相同的分布,但身份不相交。为了评估,我们将其分成五组不相交的图像,每组 20 万张图像。然后在 100k×100k 图像对上计算 FAR 和 VAL 率。在五个拆分中报告标准误差。

4.2.个人照片
这是一个与我们的训练集分布相似的测试集,但经过人工验证,标签非常干净。

它由三个个人照片集组成,共有约 12k 张图像。我们计算所有 12k 平方图像对的 FAR 和 VAL 率。

4.3.学术数据表
Labeled Faces in the Wild (LFW) 14×14×640 是事实上的人脸验证学术测试集 [7]。我们遵循不受限制的、标记的外部数据的标准协议,并报告平均分类准确度以及平均值的标准误差。

Youtube Faces DB [21] 是一个在人脸识别社区 [17]、[15] 中广受欢迎的新数据集。该设置类似于 LFW,但不是验证成对的图像,而是使用成对的视频。

五、实验

如果没有另外提及,我们使用 100M-200M 的训练人脸缩略图,其中包含大约 8M 不同的身份。 在每个图像上运行一个人脸检测器,并在每个人脸周围生成一个紧密的边界框。 这些人脸缩略图的大小被调整为相应网络的输入大小。 在我们的实验中,输入尺寸范围从 96×96 像素到 224×224 像素。

5.1 计算精度权衡

在深入了解更具体的实验 letaA 的细节之前。 Zs 讨论了特定模型所需的准确性与 FLOPS 数量之间的权衡。 图 4 显示了 x 轴上的 FLOPS 和 0.001 错误接受率 (FAR) 在我们的用户标记的测试数据集(第 4.2 节)上的准确度。 有趣的是,模型所需的计算量与其所达到的准确度之间存在很强的相关性。 该图突出显示了我们在实验中更详细讨论的五个模型(NN1、NN2、NN3、NNS1、NNS2)。
在这里插入图片描述
图 4.FLOPS。 精度权衡。 显示的是各种不同模型大小和架构的 FLOPS 和准确性之间的权衡。 突出显示的是我们在实验中关注的四个模型。

表 3. 网络架构。 该表比较了我们的模型架构在保留测试集上的性能(参见第 4.1 节)。 报告的是 10E-3 错误接受率的平均验证率 VAL。 还显示了五个测试拆分的平均值的标准误差。在这里插入图片描述
表 3. 网络架构。 该表比较了我们的模型架构在保留测试集上的性能(参见第 4.1 节)。 报告的是 10E-3 错误接受率的平均验证率 VAL。 还显示了五个测试拆分的平均值的标准误差。
在这里插入图片描述
我们还研究了与模型参数数量有关的准确性偏差。 但是,在这种情况下,情况并不那么清晰。 例如,基于 Inception 的模型 NN2 实现了与 NN1 相当的性能,但只有 20 个参数。 不过,FLOPS 的数量是可比的。 显然,如果参数数量进一步减少,性能预计会下降。 其他模型架构可能允许进一步减少而不损失准确性,就像 Inception [16] 在这种情况下所做的那样。
在这里插入图片描述
网络架构。 该图显示了第 4.2 节中我们的个人照片测试集上四种不同模型的完整 ROC。 loe-4 FAR 的急剧下降可以用 groundtruth 标签中的噪声来解释。 模型按性能排序为:nn2:224×224 input inception based model; nn1:基于 zeiler&fergus 的 1×1 卷积网络; nns1:只有 220M flops 的小型 inception 风格模型; nns2:只有 20M 触发器的小型初始模型。

5.2. CNN模型的效果

我们现在更详细地讨论我们选择的四个模型的性能。一方面,我们有基于 Zeiler&Fergus 的传统架构,具有 1×1 卷积 [22]、[9](参见表 1)。另一方面,我们有基于 Inception [16] 的模型,可以显着减小模型大小。总体而言,在最终性能中,两种架构的顶级模型的性能相当。然而,我们的一些基于 Inception 的模型,例如 NN3,仍然取得了良好的性能,同时显着降低了 FLOPS 和模型大小。

我们的个人照片测试集的详细评估如图 5 所示。虽然最大的模型与微型 NNS2 相比在精度上取得了显着提高,但后者可以在手机上运行 30ms/图像,并且仍然足够精确到用于人脸聚类。 FAR < 10-4 的 ROC 急剧下降表明测试数据中的标签有噪声。在极低的错误接受率下,单个错误标记的图像可能会对曲线产生重大影响。

5.3. 对图像质量的敏感度
表 4 显示了我们的模型在各种图像尺寸下的鲁棒性。 该网络在 JPEG 压缩方面出人意料地健壮,并且在 JPEG 质量为 20 时表现得非常好。对于 120×120 像素大小的面部缩略图,性能下降非常小,即使是 80×80 像素,它也显示可以接受 表现。 这是值得注意的,因为该网络是在 220×220 输入图像上训练的。 用较低分辨率的人脸训练可以进一步提高这个范围。

表 4. 图像质量。 左侧的表格显示了 10E-3 精度下不同 JPEG 质量对验证率的影响。 右边的一个显示了以像素为单位的图像大小如何影响 10E-3 精度的验证率。 这个实验是在我们的测试保留数据集的第一次拆分上使用 NNI 完成的。

在这里插入图片描述
表 5. 嵌入维度。 该表比较了我们的模型 nn1 的嵌入维度对第 4.1 节中的保留集的影响。 除了 10E-3 处的 VAL,我们还显示了跨五个拆分计算的平均值的标准误差。
在这里插入图片描述
5.4.嵌入维度
除了表 5 中报告的比较之外,我们探索了各种嵌入维度,并为所有实验选择了 128 个。人们期望较大的嵌入至少与较小的嵌入一样好,但是,它们可能需要更多的训练才能实现相同的准确性。也就是说,表 5 中报告的性能差异在统计上并不显着。

需要注意的是,在训练过程中使用了 128 维浮点向量,但它可以量化为 128 字节而不会损失精度。因此,每个人脸都由一个 128 维字节向量紧凑地表示,这是大规模聚类和识别的理想选择。较小的嵌入是可能的,但精度损失很小,并且可以在移动设备上使用。

5.5.训练数据量
表 6 显示了大量训练数据的影响。由于时间限制,此评估在较小的模型上运行;在更大的模型上效果可能更大。很明显,使用数以千万计的样本可以明显提高第 4.2 节中我们的个人照片测试集的准确性。与仅数百万张图像相比,误差相对减少了 60%。使用另一个数量级的更多图像(数亿)仍然会带来小幅提升,但改进会逐渐减弱。

在这里插入图片描述
图 6。LFW 错误。 这显示了在 LFW 上被错误分类的所有图像对。

表 6. 训练数据大小。 该表比较了具有 96×96 像素输入的较小模型在 700 小时训练后的性能。 模型架构类似于 nn2,但在初始模块中没有 5×5 卷积。
在这里插入图片描述
5.6. LFW 上的性能
我们使用标准协议评估我们在 LFW 上的模型,用于不受限制的、标记的外部数据。九个训练分割用于选择 L2 距离阈值。然后在第十个测试拆分上执行分类(相同或不同)。对于除八分之一 (1.256) 之外的所有测试拆分,选定的最佳阈值为 1.242。

我们的模型以两种模式进行评估:

修复了 LFW 提供的缩略图的中心裁剪。

专有的人脸检测器(类似于 Picasa [3])在提供的 LFW 缩略图上运行。如果它未能对齐面部(这发生在两个图像上),则使用 LFW 对齐。

图 6 给出了所有失败案例的概览。它在顶部显示错误接受,在底部显示错误拒绝。当使用 (1) 中描述的固定中心裁剪时,我们实现了 98.87%±0.15 的分类准确度,而在使用额外人脸对齐 (2) 时,我们达到了打破平均标准误差的 99.63%±0.09 的记录。这将 [17] 中 DeepFace 报告的错误减少了 7 倍以上,并且将 [15] 中 DeepId2+ 报告的先前最先进技术减少了 30%。这是模型 NN 1 的性能,但即使是更小的 NN3 也实现了在统计上没有显着差异的性能。

5.7. Youtube Faces DB 上的性能
我们使用人脸检测器在每个视频中检测到的前一百帧的所有对的平均相似度。这为我们提供了 95.12%±0.39 的分类准确率。使用前一千帧的结果是 95.18%。与同样评估每个视频一百帧的 [17] 91.4% 相比,我们将错误率降低了近一半。 DeepId2+ [15] 达到了 93.2%,我们的方法将此误差降低了 30%,与我们对 LFW 的改进相当。

5.8.人脸聚类
我们的紧凑嵌入有助于将用户的个人照片聚集到具有相同身份的人群中。与纯验证任务相比,聚类人脸所施加的分配约束会产生真正惊人的结果。图 7 显示了用户个人照片集中的一个集群,它是使用凝聚聚类生成的。它清楚地展示了对遮挡、照明、姿势甚至年龄的难以置信的不变性。

六、总结

我们提供了一种直接学习嵌入到欧几里得空间中进行人脸验证的方法。 这使它与其他使用 CNN 瓶颈层或需要额外后处理(例如多个模型和 PCA 的串联)以及 SVM 分类的方法 [15]、[17] 不同。 我们的端到端训练既简化了设置,又表明直接优化与手头任务相关的损失可以提高性能。

我们模型的另一个优点是它只需要最小的对齐(面部区域周围的紧密裁剪)。 [17],例如,执行复杂的 3D 对齐。 我们还尝试了相似变换对齐,并注意到这实际上可以稍微提高性能。 目前尚不清楚是否值得额外的复杂性。

在这里插入图片描述
图 7 人脸聚类。 显示的是一个用户的示例集群。 用户个人照片集中的所有这些图像都聚集在一起。

未来的工作将集中在更好地理解错误情况,进一步改进模型,以及减少模型大小和降低 CPU 需求。 我们还将研究改善目前极长的训练时间的方法,例如 我们的课程学习变体,批量较小,离线以及在线正负挖掘。


http://chatgpt.dhexx.cn/article/UlMX1Iqb.shtml

相关文章

【facenet】快速复现 实现 facenet-pytorch 人脸识别 windows上 使用cpu实现 人脸对比

目录 0 前言1 搭建环境与项目2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-pytorch 参考了&#xff1a; Pytorch 搭建自己的Facenet人脸识别网络&#xff08;Bubbliiiing 深度学习 教程&#xff09; https://gitee.com/xiaozhao123666/facenet-pytorch …

利用MTCNN和facenet实现人脸检测和人脸识别

利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单&#xff0c;先利用mtcnn的进行人脸检测&#xff0c;当然也可以使用其他的人脸…

facenet 总结一

Facenet是谷歌研发的人脸识别系统&#xff0c;该系统是基于百万级人脸数据训练的深度卷积神经网络&#xff0c;可以将人脸图像embedding&#xff08;映射&#xff09;成128维度的特征向量。以该向量为特征&#xff0c;采用knn或者svm等机器学习方法实现人脸识别。 CASIA-WebFac…

【人脸识别】FaceNet详解

论文题目&#xff1a;《FaceNet: A Unified Embedding for Face Recognition and Clustering》 论文地址&#xff1a;FaceNet 1、概述 FaceNet&#xff08;A Unified Embedding for Face Recognition and Clustering&#xff09;直接把输入图像变成欧式空间中的特征向量&#…

人脸识别系统FaceNet原理

1. 概述 近年来&#xff0c;随着深度学习在CV领域的广泛应用&#xff0c;人脸识别领域也得到了巨大的发展。在深度学习中&#xff0c;通过多层网络的连接&#xff0c;能够学习到图像的特征表示&#xff0c;那么两张人脸的图像&#xff0c;是不是可以通过深度学习判别其是否是相…

聪明的人脸识别3——Pytorch 搭建自己的Facenet人脸识别平台

聪明的人脸识别3——Pytorch 搭建自己的Facenet人脸识别平台 学习前言什么是Facenet源码下载Facenet的实现思路一、预测部分1、主干网络介绍2、根据初步特征获得长度为128的特征向量3、l2标准化4、构建分类器&#xff08;用于辅助Triplet Loss的收敛&#xff09; 二、训练部分1…

syscall()

1、syscall的定义 #include<unistd.h> #include<sys/syscall.h> / For SYS_xxx definitions /long syscall(long number, ...);syscall执行间接系统调用&#xff0c;使用该函数会执行一个系统调用&#xff0c;根据指定的参数 number 和所有系统调用的汇编语言接口…

linux systemctl命令详解

笔者在前文中概要的介绍了 systemd 的基本概念和主要特点。由于 systemd 相关的绝大多数任务都是通过 systemctl 命令管理的&#xff0c;所以本文将集中的介绍 systemctl 命令的用法。注意&#xff0c;本文以 ubuntu 16.04 进行介绍&#xff0c;文中所有的 demo 都在 ubuntu 16…

Linux常用命令——sysctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sysctl 时动态地修改内核的运行参数 补充说明 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff…

Linux之systemctl命令基本使用

文章目录 1. systemctl 管理指令2. systemctl 设置服务的自启动状态3. 应用案例&#xff1a;4. 细节讨论&#xff1a; 1. systemctl 管理指令 基本语法&#xff1a; systemctl [start | stop | restart | status] 服务名systemctl 指令管理的服务在 /usr/lib/systemd/system 查…

systemctl命令解析

原文链接如果有效&#xff0c;请点击原文链接查看。 原文&#xff1a;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 一、由来 历史上&#xff0c;Linux 的启动一直采用init进程。 下面的命令用来启动服务。 $ sudo /etc/init.d/apache2 start # …

Linux常用命令——systemctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) systemctl 系统服务管理器指令 补充说明 systemctl命令是系统服务管理器指令&#xff0c;它实际上将 service 和 chkconfig 这两个命令组合到一起。 任务旧指令新指令使某服务自动启动chkconfig --level 3 ht…

【Linux】之systemd与systemctl

文章目录 一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息 二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.…

【linux systemctl】Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…

Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…

idea 如何使用tomcat启动项目

1、首先对项目进行打包&#xff08;使用maven&#xff09; 2、打包成功后会有target 3、选择右侧的长条框&#xff08;如果没有tomcat&#xff0c;框是灰色的&#xff0c;这时你要自己手动加一个tomcat&#xff09;&#xff0c;选择Edit 4、如图所示、点击“”号&#xff0c;继…

Tomcat启动项目慢

原因是多方面&#xff0c;我遇到的情况有三种可能导致tomcat启动项目变慢 情况一&#xff1a;tomcat在启动过程中会检查jar&#xff0c;当有大量的jar被检测的时候&#xff0c;启动需要很长时间 解决办法&#xff1a;将catalina.properties文件中的这一行 tomcat.util.scan.S…

Eclipse配置Tomcat以及使用Tomcat启动项目

1、打开Peferences弹窗 Windeows--->Peferences : 2、输入Server&#xff0c;点击Runtime Enviroument&#xff0c;点击Add&#xff1a; 3、选择tomcat版本&#xff1a; 4、找到自己的tomcat的下载路径&#xff0c;点击finish&#xff1a; 5、顶级apply and close&#xf…

IDEA配置本地tomcat启动项目

1.确认tomcat本地安装是否成功 tomcat安装可以参考我之前写的内容,Windows下tomcat安装教程 2.idea启动tomcat设置 1.新建项目 2.点击Java Enterprise选项&#xff0c;并进行设置 ​ 服务器选择对应的Tomcat版本、JDK版本号要与Tomcat的版本号对应&#xff0c;不然可能出现…

Java项目部署到tomcat启动

Java项目部署到tomcat启动 1.选中项目右击进行打包2.把后缀war文件放入tomcat-->webapps下3.修改tomcat-->conf--server.xml文件4.修改tomcat-->bin-->startup.bat和 shutdown.bat文件5.启动startup.bat 1.选中项目右击进行打包 2.把后缀war文件放入tomcat–>we…