人脸识别演练--FaceNet
介绍
人脸识别是根据人脸图像来识别和验证人的任务。FaceNet 是谷歌研究人员 Florian Schroff、Dmitry Kalenichenko 和 James Philbin 于 2015 年在一篇题为《FaceNet:用于人脸识别和聚类的统一嵌入》的论文中开发的一套人脸识别系统。
要开发人脸识别系统,第一步是找到人脸位置的边界框。然后找到面部特征的空间点,例如眼睛的长度、嘴巴的长度、眼睛和鼻子之间的距离等。然后将人脸转换为正面,因为一个人的图像可以从不同的角度拍摄。从提取的面部特征创建嵌入并计算两个嵌入之间的距离。完整代码可以在这里找到。
人脸检测
I found 1 face(s) in this photograph.A face is located at pixel location Top: 36, Left: 76, Bottom: 126, Right: 165
面部特征检测
面部标志是人脸中的空间点。所选空间点的数量可能从 5 到 78 个点不等,具体取决于注释。面部标志也称为基准点、面部关键点或面部姿势。
上图的面部特征检测算法的输出如下所示。
I found 1 face(s) in this photograph.The chin in this face has the following points: [(86, 78), (87, 87), (89, 95), (92, 103), (95, 110), (101, 117), (108, 123), (117, 128), (128, 129), (138, 126), (146, 119), (154, 112), (159, 104), (162, 95), (163, 86), (163, 76), (162, 66)]The left_eyebrow in this face has the following points: [(89, 69), (92, 64), (97, 63), (103, 63), (108, 65)]The right_eyebrow in this face has the following points: [(125, 61), (131, 57), (138, 55), (144, 56), (150, 59)]The nose_bridge in this face has the following points: [(118, 72), (118, 78), (119, 84), (119, 90)]The nose_tip in this face has the following points: [(114, 95), (117, 96), (121, 96), (124, 95), (128, 93)]The left_eye in this face has the following points: [(96, 76), (100, 73), (105, 72), (110, 76), (105, 77), (100, 78)]The right_eye in this face has the following points: [(129, 73), (133, 68), (139, 67), (143, 69), (140, 72), (135, 73)]The top_lip in this face has the following points: [(109, 106), (113, 104), (119, 103), (122, 103), (126, 102), (132, 102), (139, 102), (137, 103), (126, 106), (123, 107), (119, 108), (112, 107)]The bottom_lip in this face has the following points: [(139, 102), (134, 109), (128, 112), (124, 113), (120, 114), (114, 111), (109, 106), (112, 107), (119, 107), (123, 107), (127, 106), (137, 103)]
面部对齐
可以使用基准点对齐人脸。这样做是为了使从不同角度点击的人脸图像直视前方。然后将提取的特征与模板进行匹配。对齐的人脸可用于比较。对齐的人脸是 MTCNN 的输出,并作为 FaceNet 的输入
使用 FaceNet 模型进行人脸识别
人脸识别是从数字图像或视频中识别人的过程。这是一个 1:K 匹配问题。一个用例可能是在员工进入大楼时通过在数据库中查找他们的人脸编码来标记员工的出勤情况。FaceNet 模型需要 160x160x3 大小的人脸图像作为输入,并输出长度为 128 的人脸嵌入向量。此人脸嵌入包含描述人脸重要特征的信息。然后,FaceNet 找到与目标人脸嵌入具有最小 L2 距离的训练人脸嵌入的类标签。它是 N 维空间(也称为欧几里得空间)中两点之间的最短距离
卷积神经网络模型使用 Triplet Loss 函数。此函数对相似的图像返回较小的值,对不相似的图像返回较大的值。FaceNet 网络的组件在以下部分中描述。
输入图像
训练集由从图片中裁剪成 160x160 大小的面部缩略图组成。除了平移和缩放之外,不需要对面部裁剪进行任何其他对齐。
深度 CNN
FaceNet 论文中描述了两种不同的架构:
- 基于 Zeiler 和 Fergus 网络架构的深度 CNN
- 基于GoogLeNet的Inception模型架构
这两种架构在使用的参数数量和每秒浮点运算次数 (FLOPS) 方面有所不同。FLOPS 是衡量需要浮点计算的计算机性能的标准。FLOPS 越大,模型准确率越高。FLOPS 较低的网络运行速度更快,消耗的内存更少,但准确率较低。
NN1:基于 Zeiler 和 Fergus 网络架构的深度 CNN
NN2:基于GoogleNet的Inception模型架构
NN3
它与 NN2 相同,只是输入尺寸为 160x160。
NN4
人脸嵌入
大小为 1×1×128 的人脸嵌入由深度 CNN 的 L2 归一化层生成。此嵌入用于人脸验证和人脸聚类
三重损失
三重选择
选择正确的图像对非常重要,因为会有很多图像对满足此条件。模型不会从中学到太多东西,因此也会收敛得很慢。为了确保快速收敛,选择违反三元组约束的三元组至关重要。
等式 (1) 表示给定人物 A 的锚图像,我们想要找到 A 的正图像,使得这两幅图像之间的距离最大。等式 (2) 表示给定锚图像 A,我们想要找到负图像,使得这两幅图像之间的距离最小。因此,我们在这里只选择硬正图像和硬负图像。这种方法有助于我们加快收敛速度,因为我们的模型会学习有用的表示。
FaceNet 的发明者使用了由 40 个正样本和随机选择的负样本组成的小批量。计算每个小批量的最小和最大距离以创建三元组。
人脸验证
人脸验证将所有训练图像的人脸嵌入与给定图像进行比较以查找匹配项。确定两幅图像是否属于同一个人是 1:1 映射。
人脸聚类
人脸聚类是将同一个人的图像分组到相册的过程。它回答了“是否有相似的面孔?”的问题。可以提取人脸的嵌入,然后使用 K-means 等聚类算法将同一个人的面孔分组在一起
结论
面部特征点可用于面部对齐、跟踪视频中的面部以及测量情绪。它们还有助于诊断医疗状况。MTCNN 用于裁剪面部并将其作为 FaceNet 的输入,FaceNet 为每个裁剪的面部图像创建一个 128 维向量。这两个向量之间的距离用于查找图像之间的相似性。即使人们戴着外科口罩,FaceNet 也可以识别面部
参考
- 使用多任务级联卷积网络进行联合人脸检测和对齐,张凯鹏、张展鹏、李志峰和乔宇,2018 年 8 月
- 计算机视觉深度学习,Rajalingappaa Shanmugamani,Packt Publishing,2018 年 1 月
- 使用 Tensorflow 进行人脸识别,David Sandberg,2018 年
- FaceNet:用于人脸识别和聚类的统一嵌入,Florian Schroff、Dmitry Kalenichenko 和 James Philbin,2015 年 6 月
- 使用 FaceNet 进行人脸识别,2019
- 三重损失,2017
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~