人脸识别系列(六):FaceNet

原文链接:FaceNet:A Unified Embedding for Face Recognition and Clustering

首先可以看一下最终的效果,数字表示两张图片经过Facenet提取的特征之间的欧式距离,可以直接表示两张图片的差异:

img

从图中可以看出,若取阈值为1.1,可以很轻易的区分出两张照片是不是同一个人。

网络结构:

img

上图是文章中所采用的网络结构,其中,前半部分就是一个普通的卷积神经网络,但是与一般的深度学习架构不一样,Facenet没有使用Softmax作为损失函数,而是先接了一个l2**嵌入**(Embedding)层。

所谓嵌入,可以理解为一种映射关系,即将特征从原来的特征空间中映射到一个新的特征空间,新的特征就可以称为原来特征的一种嵌入。

这里的映射关系是将卷积神经网络末端全连接层输出的特征映射到一个超球面上,也就是使其特征的二范数归一化,然后再以Triplet Loss为监督信号,获得网络的损失与梯度。

Triplet Loss也正是这篇文章的特点所在,接下来我们重点介绍一下。

Triplet Loss

什么是Triplet Loss呢?顾名思义,也就是根据三张图片组成的三元组(Triplet)计算而来的损失(Loss)。

其中,三元组由Anchor(A),Negative(N),Positive(P)组成,任意一张图片都可以作为一个基点(A),然后与它属于同一人的图片就是它的P,与它不属于同一人的图片就是它的N。

Triplet Loss的学习目标可以形象的表示如下图:

img

网络没经过学习之前,A和P的欧式距离可能很大,A和N的欧式距离可能很小,如上图左边,在网络的学习过程中,A和P的欧式距离会逐渐减小,而A和N的距离会逐渐拉大。

也就是说,网络会直接学习特征间的可分性:同一类的特征之间的距离要尽可能的小,而不同类之间的特征距离要尽可能的大。

意思就是说通过学习,使得类间的距离要大于类内的距离。

损失函数为:

img

其中,左边的二范数表示类内距离,右边的二范数表示类间距离,α是一个常量。优化过程就是使用梯度下降法使得损失函数不断下降,即类内距离不断下降,类间距离不断提升。

提出了这样一种损失函数之后,实践过程中,还有一个难题需要解决,也就是从训练集里选择适合训练的三元组。

选择最佳的三元组

理论上说,为了保证网络训练的效果最好,我们要选择hard positive
这里写图片描述

以及hard negative

这里写图片描述

来作为我们的三元组

但是实际上是这样做会有问题:如果选择最Hard的三元组会造成局部极值,网络可能无法收敛至最优值。

因此google大佬们的做法是在mini-batch中挑选所有的 positive 图像对,因为这样可以使得训练的过程更加稳固。对于Negetive的挑选,大佬们使用了semi-hard的Negetive,也就是满足a到n的距离大于a到p的距离的Negative,而不去选择那些过难的Negetive。

这里写图片描述

CNN结构

文中尝试了两个CNN结构,其参数如下:

网络1:Zeiler&Fergus architecture
这里写图片描述

网络2: GoogLeNet
这里写图片描述

实验

1. 不同的网络配置下的VAL(validation rate)。

img

2. 不同的训练图像数据集的大小。

img

3. 嵌入层特征的维度对VAL的影响:

img

4. 不同的图像质量下的VAL:

img

左边图表示jpeg图像的质量q对VAL的影响,显然质量越高,VAL越高,右边图表示图像的大小对VAL的影响。

LFW得分

在LFW上达到了98.87% +-0.15的验证准确率

如果预先使用更好的人脸检测算法来对齐人脸,最高可以达到99.63% +-0.09 的验证准确率。

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: FaceNet是一个用于人脸识别的深度学习模型,旨在实现高性能的人脸识别算法。在Keras中实现FaceNet模型需要遵循以下步骤: 1. 数据准备:数据集应该包含大量的人脸图像,每个图像应标记对应的人名或ID。数据集可以通过互联网或手动收集。 2. 数据预处理:数据需要进行预处理,包括图像重缩放、灰度或彩色转换、预处理图像增强等。 3. 构建模型:构建FaceNet模型可以适当使用预训练模型,包括VGG、ResNet等。该模型主要包括卷积层、Pooling层、全连接层等。其中,卷积层用于提取特征,全连接层用于将提取的特征向量映射到特定的实空间。 4. 训练模型:在数据集上对模型进行训练,并执行交叉验证以避免过拟合。 5. 评估性能:评估FaceNet模型的性能可以使用准确性、召回率、精确度等指标。 在keras中的实现,需要先导入相关的库,如keras、tensorflow等,然后在构建模型时逐层添加网络层。具体的实现,包括前向和后向传播,可以根据具体的模型来进行编程实现。 总之,FaceNet是一个优秀的人脸识别模型,Keras提供了方便的接口来实现该模型以及进行相关优化和改进。通过对FaceNet模型的建模和训练,可以实现高效的人脸识别,为安全管理、身份认证等领域奠定基础。 ### 回答2: Facenet是一种流行的人脸识别模型,它是通过深度神经网络实现的。最近,人们在Keras框架下实现Facenet模型,使其更便于使用和调试。 在Keras实现中,Facenet模型主要由三个部分组成:人脸检测、人脸对齐和人脸嵌入。 人脸检测部分使用一个卷积神经网络来检测图像中的人脸并确定它们的位置。这个网络训练的目的是检测一张图像中的每一个人脸,返回一个框定每个人脸位置和大小的边框。 人脸对齐是将检测到的人脸进行转换,使其风格和大小匹配,以便在嵌入步骤中获得更好的结果。这个部分的实现使用了一系列的仿射变换和三维对准技术,以确保每个人脸在变换后能够对齐。 人脸嵌入是将归一化后的检测图像映射为人脸向量,也是Facenet的核心部分。这个部分使用了一个具有三个等距卷积层的深度神经网络,并将每个人脸转换为一个128维的向量。这个向量的距离可以表示两张人脸之间的差异,从而实现识别功能。 值得注意的是,在Keras实现中,Facenet模型使用了Triplet Loss作为损失函数,它可以帮助提高嵌入向量的质量,并使得具有相同特征的人脸之间的距离尽可能小,同时使具有不同特征的人脸之间的距离最大化。 总之,通过使用Keras框架实现Facenet模型,可以方便地进行人脸识别和验证任务,为深度学习人脸识别应用提供了有效的实现方式。 ### 回答3: FaceNet是一种人脸识别模型,它可以将人脸图像转换为具有独特特征的向量。这个模型可以在Keras中实现。 Keras是一种用于构建神经网络的高级Python库,它提供了一种简单易用的API,使得用户可以集中精力于模型的构建和调优。在Keras中实现FaceNet采用深度学习的方法,结合了卷积神经网络和三元组损失函数。 具体来说,FaceNet模型通过卷积神经网络提取人脸图像的特征。在图像经过卷积层、池化层和全连接层之后,可以将其转换为一个固定长度的向量,该向量可以表示出不同人脸之间的差异。通过三元组损失函数,模型可以对这些向量进行训练。三元组损失函数是一种用于训练嵌入向量的度量学习函数,让嵌入向量之间的距离有明确的含义,可以识别出不同人脸之间的差异。 在Keras中实现FaceNet模型,需要使用以下库:tensorflow, numpy, matplotlib,和sklearn。这些库可以让用户在建模,训练和评估模型时使用特定函数和工具。 总之,采用Keras实现FaceNet模型能够实现准确、快速地对人脸进行识别,这可以开辟人脸识别应用程序的新前景。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值