FaceNet

本文介绍了一种用于人脸识别和聚类的端到端学习方法FaceNet。该方法通过Triplet Loss损失函数训练网络,实现人脸特征的有效提取。FaceNet能够在嵌入空间中使同类人脸的特征距离拉近,异类人脸的特征距离拉开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FaceNet: A Unified Embedding for Face Recognition and Clustering

Paper:

Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[C]//CVPR. 2015: 815-823.


概述:论文提出了一个端到端用于人脸识别的网络

这里写图片描述

Fig. 2 中L2表示L2 normalization ,之后是嵌入空间(将原向量映射到这个空间,向量的维数可能会发生变化)。损失函数使用Triplet Loss。

这里写图片描述

Fig 3. 表示: 训练的目的是训练网络,使得嵌入空间下Anchor与Postive的距离 小于Anchor与Negtive间的距离。其中Postive与Anchor样本中的人物身份相同,Negtive与Anchor样本中的人物身份不同。

目标是训练成式(1)所示:

这里写图片描述

hard positive定义:

这里写图片描述

hard negtive定义:

这里写图片描述

上面的αα表示margin ,

这里写图片描述

如果两幅图片在嵌入空间的距离<αα,那么判定为同一个人,否则不同。

α=1.1α=1.1时,可以很好的区分不同图片中人物的身份。


损失函数:

这里写图片描述

其中 xixi 表示输入样本,f(x)f(x)表示通过网络后嵌入空间的向量。 xaixia 表示anchor样本; xpixip表示positive 样本; xnixin表示negtive 样本。


三元组的选择:

正确的三元组选择对于快速收敛至关重要。

文中考虑的是在线选择方法。

首先对于所有样本,计算hardest postive 和hardest postitive是不可能的,这是由于样本数目太大。采取的办法是对于每一个mini-batch中的样本再来考虑三元组的选择。

为了使得Anchor-Positive距离有意义,首先必须保证每个mini-batch中任何一个身份的样本必须到达一定数量(否则没有Anchor-Positive距离)。

文中的选择是:40 faces per identity in a mini-batch.

对于每一个mini-batch,不是选择hardest Anchor-Positive 对,而是将所有Anchor-Positive对用来训练。文中说在实际过程中发现,这样做的效果比选用hardest Anchor-Positive对更加稳定而且在训练的初始阶段收敛更快。

实际过程中,选择hardest Anchor-Negtive 对,会导致网络陷入局部最优(特别地,会导致模式崩溃,比如f(x)=0f(x)=0)。

这里写图片描述

为了防止这种现象,选择semi-hard Anchor-Negtive 对,如式(3)所示。称它semi是因为所选Negtive样本到Anchor的距离 比 Positive样本到Anchor的距离大(所以也就没那么hard); 称它hard是因为Anchor-Negtive 比 Anchor-Positive的距离大不了多少。这些负样本在 margin αα 之内。

05-07
### Facenet 深度学习人脸识别库简介 Facenet 是一种由 Google 提出的人脸识别算法,其核心思想在于通过深度神经网络将人脸映射到一个欧几里得空间中的向量表示(即嵌入),使得同一个人的不同照片之间的距离更近,而不同人的照片之间距离更远。这种方法显著提高了人脸识别的准确性,并成为许多现代人脸识别系统的基石。 #### 工作原理 Facenet 使用三元组损失函数 (Triplet Loss) 来训练模型。具体来说,在训练过程中,模型会接收三个输入:锚点图片 (Anchor),正样本图片 (Positive),以及负样本图片 (Negative)。目标是最小化锚点与正样本之间的距离,同时最大化锚点与负样本之间的距离[^1]。这种机制确保了同一身份的照片在嵌入空间中更加接近,而不同身份的照片则被推得更远。 以下是实现 Facenet 的基本流程: ```python import tensorflow as tf def triplet_loss(y_true, y_pred, alpha=0.2): &quot;&quot;&quot; Implementation of the triplet loss function. Arguments: y_true -- true labels, required when you define a loss in Keras, not used here. y_pred -- python list containing three objects: anchor -- the encodings for the anchor images, shape (None, embedding_size) positive -- the encodings for the positive images, shape (None, embedding_size) negative -- the encodings for the negative images, shape (None, embedding_size) alpha -- margin parameter Returns: loss -- real number, value of the loss &quot;&quot;&quot; total_lenght = y_pred.shape.as_list()[-1] anchor = y_pred[:, 0:int(total_lenght * 1 / 3)] positive = y_pred[:, int(total_lenght * 1 / 3):int(total_lenght * 2 / 3)] negative = y_pred[:, int(total_lenght * 2 / 3):int(total_lenght)] pos_dist = tf.reduce_sum(tf.square(anchor - positive), axis=-1) neg_dist = tf.reduce_sum(tf.square(anchor - negative), axis=-1) basic_loss = pos_dist - neg_dist + alpha loss = tf.maximum(basic_loss, 0.0) return tf.reduce_mean(loss) ``` 此代码片段展示了如何定义三元组损失函数来优化 Facenet 模型的表现。 #### 数据预处理 为了使 Facenet 能够高效运行,数据预处理是非常重要的一步。通常情况下,需要对面部区域进行检测并裁剪,随后调整大小至固定尺寸(如 160&times;160 像素)。此外,还需要对图像像素值进行标准化处理以提高模型收敛速度和稳定性[^4]。 #### 集成到 Android 应用程序 如果计划将 Facenet 整合进 Android 平台上的应用程序,则可以考虑利用 TensorFlow Lite 或其他轻量化框架对其进行转换以便于部署。另外也可以参考 `Android-Face-Recognition-with-Deep-Learning-Library` 这样的开源项目作为起点[^4]。 ### 结论 综上所述,Facenet 不仅提供了强大的理论支持还具备实际操作可行性,对于希望深入研究或者应用人脸识别技术的人来说都是极佳的选择之一。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值