赞
踩
在本文中,将介绍一种通过自定义框架构建和使用任何自定义人脸识别模型的简单方法。完成本教程后,你将学习如何使用预训练模型创建具有任意 CPU 的实时人脸识别系统。
官方将人脸识别定义为验证或识别图像中的人脸的问题。但通常有一个问题,我们如何准确识别图像中的人脸?
人脸识别过程可以分为多个步骤。下图是一个人脸识别管道的示例:
人脸识别流程步骤:
人脸检测——检测图像中的一张或多张脸;
特征提取——从图片中检测到的人脸中提取基本特征;
人脸匹配——将人脸匹配到锚人脸特征。
有很多方法可以实现人脸识别管道中的每个步骤。在本文中,我们将重点介绍使用第一个教程中介绍的 MediaPipe 人脸检测模型进行人脸检测的流行深度学习技术、使用 FaceNet 进行特征提取以及使用余弦或欧几里德距离进行人脸匹配。
让我们一步一步地完成这项任务。在每一步中,我们将学习不同的机器学习算法。我将向你展示每一个背后的主要思想。你将学习使用 MediaPipe 人脸检测器和 FaceNet 人脸特征提取器在 Python 中构建你的人脸识别系统。
我们人脸识别流程的第一步是人脸检测。我们需要先定位图像中的人脸,然后才能尝试将它们区分开!
人脸检测是当今大多数相机使用的一项很棒的功能。例如,当相机可以自动定位人脸时,它可以确保在拍照之前将所有人脸都对焦。
但现在,我们将把它用于另一个目的——找到面部区域,然后将其传递到管道中的另一个步骤“面部特征提取程序”。
这篇文章将使用超轻型 MedaPipe 探测器。但是假设你有兴趣应用提到的任何其他检测方法。
我探索了多个面部检测器。其中包括 MTCNN、Dlib、MediaPipe、pure CNN 以及最近发布的其他一些人脸检测器。
让我们开始吧!
FaceNet 与其他人脸识别模型类似,是一种用于提取人脸图像特征的深度神经网络。它由谷歌研究人员 Schroff 等人发表。
论文地址:https://arxiv.org/abs/1503.03832
FaceNet 以一张人脸图像作为输入,输出是一个由 128 个数字组成的向量,表示人脸的基本特征。这个向量被称为嵌入,因为来自面部图像的所有相关信息都嵌入到这个向量中。
基本上,FaceNet 采用人脸并将其压缩成 128 个数字的向量。但是如果我们只观察这个向量,我们不可能知道那个人的脸是什么样的。
如今,在机器学习中将高维数据(例如图像)与低维图像(向量嵌入)相关联已成为一种相当普遍的做法。
在一张没见过的图像中识别一个人物A的一种常见方法是,获取图像嵌入并计算与已知人脸A的图片的距离。我们通常使用余弦或欧几里得距离数学公式计算距离。如果计算出的人脸距离与人 物A 的嵌入足够接近,我们就假设这张脸是同一个人的。
听起来很容易,对吧?
’我们通过 FaceNet 输入图像,得到一个向量数,并检查计算出的距离是否足够接近我们拥有的任何已知人脸。
尽管如此,还是有一个问题,FaceNet 如何知道从人脸图像中提取什么东西呢?嵌入向量中的这些数字意味着什么?虽然这不是本教程的目的,但我们可以简要介绍一下,以便我们熟悉它。
为了训练一个人脸识别器,我们需要很多人脸图像。像每个机器学习问题一样,训练通常需要数千张不同的图像。当我们开始训练过程时,模型会为每张图像生成随机向量,这意味着图像是随机分布的。
学习步骤:
随机选择一个锚点图像;
随机选择同一个人的正样本图像作为基础图像;
随机选择与主图像不同的人的负样本图像;
调整 FaceNet 神经网络参数,使正样本比负样本更靠近锚点。
我们重复这四个步骤,直到不再需要更改或这些更改非常小以至于没有影响。训练完成后,同一个人的所有面孔在距离上都彼此靠近,而与不同的面孔相距很远。
你可能会问,嵌入向量中的数字是什么意思?事实上,我们不知道这些数字代表什么,也很难解释它们。我们知道这些特征对于人脸识别来说似乎是必不可少的,而且它确实有效。
如果你是软件开
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。