人脸识别系列(六):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 的验证准确率。

### Facenet 网络架构图解析 Facenet 是一种用于人脸识别的强大工具,其核心在于通过深度学习方法将面部图像映射成固定维度的空间向量(embeddings),使得同一个人的不同照片之间的距离尽可能小,而不同人的照片间的距离尽可能大。 #### 架构概述 网络的整体流程可以分为几个主要阶段: 1. **输入预处理** 输入是一批已经过裁剪和尺寸调整的人脸图片。这些图片被送入一个深层卷积神经网络中进行特征抽取[^2]。 2. **特征提取** 特征提取器通常是基于某种先进的CNN架构构建而成,比如最初的版本采用了经典的 Zeiler&Fergus 结构以及 Google 的 Inception V1;而在后续的发展中,则更多地转向了更深更复杂的模型如 Inception-ResNet-V2 或者 MobileNet 来提高性能并减少参数数量[^1]。 3. **L2 正则化** 提取出的高维特征会被进一步转换为单位长度的向量形式——即所谓的 embedding 向量。这一步骤对于保持输出空间的良好性质非常重要,它有助于确保相似样本间欧氏距离的有效性和稳定性。 4. **三元组损失 (Triplet Loss)** 为了训练这样的嵌入表示,FaceNet 使用了一种特殊的损失函数称为 triplet loss。该机制鼓励来自同一身份的数据点聚集在一起形成紧凑簇状分布,同时远离其他类别中心位置。具体来说就是选取一对正样本(相同个体) 和负样本(不同个体), 并最小化两者之间差异的同时最大化同类成员内部的一致性。 以下是简化版 FaceNet 架构示意代码: ```python import tensorflow as tf from tensorflow.keras import layers, models def create_facenet(input_shape=(160, 160, 3)): base_model = tf.keras.applications.InceptionResNetV2( include_top=False, weights='imagenet', input_tensor=None, input_shape=input_shape, pooling='avg' ) x = base_model.output embeddings = layers.Dense(128)(x) normalized_embeddings = tf.math.l2_normalize(embeddings) model = models.Model(inputs=base_model.input, outputs=normalized_embeddings) return model ``` 此段代码展示了如何利用 `InceptionResNetV2` 预训练权重来创建基础特征提取器,并最终获得 L2 归一化的 128 维度人脸特征向量。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值