论文地址: FaceNet: A Unified Embedding for Face Recognition and Clustering 

 

FaceNe t出自 google,它将 人脸 映射到 欧几里得空间,用空间距离 代表 人脸相似度,可用于 人脸识别(是谁)、人脸验证(是不是一个人)、人脸聚类;

FaceNet 在LFW数据集上,准确率为0.9963,在YouTube Faces DB数据集上,准确率为0.9512

 

核心原理

FaceNet 的基本思想 是 把 人脸 映射成 128维 空间向量,属于同一个人的 向量间距离很小,否则距离很大;

算法流程图

 

模型输入

输入为 脸部缩略图,所以如果原始图像包含人脸以外的东西,需 先用 人脸检测器如 mtcnn 抠出人脸;

并没有 进行 2d 3d 人脸对齐、缩放 等 预处理;    【人脸缩放容易变形,且真实场景中 人脸就是 有大有小,为了保持 输入尺寸一致,填充即可】

 

triplets loss

triplets 译为三胞胎,这里翻译为 三联子;

 

FaceNet 的思路 是把 人脸x 映射成 d维向量,即  f(x)=Rd

在该向量空间内,模型的目的是:假设  xa(anchor)  代表某人,那么 和他“同类”的人xp(positive) 距离近,和他“异类”的人xn(negative)距离远;如下图

 

这种思想表示成 loss 即为 triplets loss

其中 α 为常量,可以理解为 距离的临界值,大于该 距离 就不是同一个人,故 存在这样一个关系

[] 后面的 + 替代了上面的关系式,意思是 当 [] 内 大于 0 时,即关系不成立,显然这是不对的,需要通过训练 改变这种情况,L = [] 内的值,即 此时 产生了 loss;

当 [] 内 小于 0 时,即 关系成立,代表 此时 向量表示 效果很好,无需改正了,+会把 小于0 的值 强制变成 0,即 L=0,没有产生 loss;

 

triplets 筛选

这个 triplets 其实 就是 常规的模型训练的一个样本,也就是说 这里的一个 样本 有 3张人脸,2张属于一个人,另一张属于另一个人,从 loss 也可看出来, a p n 三张图;

triplets 筛选就是 如何 获取 这三张脸,为了 加速 模型收敛,这里 采用了 类似 hard sample 的思想,即 2张属于一个人的脸的 距离 尽可能大(困难样本),2张不属于一个人的脸 距离 尽可能小(困难样本);

 

在实际训练过程中,每个样本都这样生成,计算量太大,不现实,两种优化策略:

1. 每隔 n 步,计算一次 MxN 的矩阵,M 表示人数,N 表示 每个人的 照片数,M可取所有人

2. 在线生成 triplets,即在每个mini-batch中进行筛选positive/negative样本。

本文中,我们采用在线生成triplets的方法。我们选择了大样本的mini-batch(1800样本/batch)来增加每个batch的样本数量。每个mini-batch中,我们对单个个体选择40张人脸图片作为正样本,随机筛选其它人脸图片作为负样本。

负样本选择不当也可能导致训练过早进入局部最小。为了避免,我们采用如下公式来帮助筛选负样本

我们已知在梯度下降中需要对所有样本进行处理过后然后走一步,那么如果我们的样本规模的特别大的话效率就会比较低。
假如有500万,甚至5000万个样本(在我们的业务场景中,一般有几千万行,有些大数据有10亿行)的话走一轮迭代就会非常的耗时。这个时候的梯度下降叫做full batch。
所以为了提高效率,我们可以把样本分成等量的子集。 例如我们把100万样本分成1000份, 每份1000个样本, 这些子集就称为mini batch

传统的softmax loss相比,triplet_loss直接对距离进行度量和优化,效果更明显。根据其他工程人员经验,实际训练中,可以对softmax loss和triplet_loss进行加权,在线调整权值,达到最优

 

 

 

时间关系,废话就不写了

 

 

 

 

 

 

参考资料:

https://zhuanlan.zhihu.com/p/24837264  谷歌人脸识别系统FaceNet解析

https://zhuanlan.zhihu.com/p/70110691  人脸识别经典—FaceNet

 

// 那个可爱的研究生

https://www.bilibili.com/video/BV1E64y1C7V8?spm_id_from=333.337.search-card.all.click&vd_source=f0fc90583fffcc40abb645ed9d20da32  Pytorch 搭建自己的Facenet人脸识别网络(Bubbliiiing 深度学习 教程)  

https://blog.csdn.net/weixin_44791964/article/details/108220265  博客地址

https://github.com/bubbliiiing/facenet-pytorch   源码地址

 

https://github.com/davidsandberg/facenet