欢迎访问装备制造资讯网!

装备制造资讯网

您现在的位置是: 首页 > 制造技术 >详情

制造人脸识别技术(制作自己的人脸识别系统)

发布时间:2024-02-26 06:13:51 制造技术 475次 作者:装备制造资讯网

SigureurSkúli。fastai深度学习社区译。

在Python中制作自己的简化版人脸识别系统

制造人脸识别技术(制作自己的人脸识别系统)

人脸识别是用户认证的最新趋势。苹果最近推出了新的iPhoneX,使用FaceID对用户进行身份验证。OnePlus5即将从OnePlus5T获得FaceUnlock功能。而百度则使用人脸识别代替身份证,让员工进入办公室。这些应用程序对许多人来说可能看起来很神奇。但在本文中,我们的目标是通过教您如何在Python中制作自己的简化版人脸识别系统来揭开这个主题的神秘面纱。

Github链接为那些不喜欢阅读和只想要代码的人准备。

https://github.com/Skuldur/facenet-face-recognition

背景

在介绍实现的细节之前,我想讨论一下FaceNet的细节。一个将在我们的系统中使用的网络。

FaceNet

FaceNet是一个神经网络,学习从人脸图像到紧凑的欧几里得空间的映射,其中距离对应于面部相似性的量度。也就是说,两幅面部图像越相似,它们之间的距离就越小。

TripletLoss

FaceNet使用称为TripletLoss的不同损失方法来计算损失。三重损失最小化了锚与包含相同身份的正面图像之间的距离,并最大化锚与包含不同身份的负面图像之间的距离。

·f(a)是指锚的输出编码

·f(p)是指正数的输出编码

·f(n)是指负数的输出编码

·alpha是一个常量,用于确保网络不会尝试向f(a)-f(p)=f(a)-f(n)=0进行优化。

·[...]+等于max(0,sum)

连体网络

FaceNet是一个连体网络。连体网络是一种神经网络架构,学习如何区分两个输入。这使他们能够学习哪些图像是相似的,哪些不是。这些图像可能包含面孔。

连体网络由两个相同的神经网络组成,每个网络具有相同的精确权重。首先,每个网络将两个输入图像中的一个作为输入。然后,每个网络的最后层的输出被发送到确定图像是否包含相同标识的功能。

在FaceNet中,这是通过计算两个输出之间的距离来完成的。

实施

现在我们已经澄清了这个理论,我们可以直接跳到实施步骤。

为了实现功能,我们要使用Keras和Tensorflow。另外,我们使用从deeplearning.ai的回购中获得的两个实用程序文件来提取与FaceNet网络的所有交互。

·fr_utils.py包含将图像提供给网络并获取图像编码的功能

·inception_blocks_v2.py包含准备和编译FaceNet网络的功能

编译FaceNet网络

我们要做的第一件事就是编译FaceNet网络,以便我们可以将其用于我们的人脸识别系统。

使用(3,96,96)的输入形状初始化我们的网络。这意味着红-绿-蓝(RGB)通道是馈送到网络的图像的第一个维度。并且所有送入网络的图像必须是96x96像素的图像。

接下来我们将定义TripletLoss函数。上面代码片段中的函数遵循我们在上一节中定义的TripletLoss方程的定义。

如果您不熟悉任何用于执行计算的Tensorflow函数,建议您阅读文档(为其添加了每个函数的链接),因为这样可以提高您对代码的理解。但是将函数与图1中的等式进行比较应该足够了。

一旦我们有了我们的损失函数,我们可以使用Keras编译我们的人脸识别模型。我们将使用Adam优化器来最小化由TripletLoss函数计算的损失。

准备一个数据库

现在我们编写了FaceNet,我们将准备一个希望我们的系统识别的个人数据库。我们将使用我们图像目录中包含的所有图像来存储个人数据库。

注意:我们只会在我们的实施中使用每个人的一个图像。原因是FaceNet网络足够强大,只需要一个人的图像来识别他们!

对于每个图像,我们将图像数据转换为128个浮点数的编码。我们通过调用函数img_path_to_encoding来做到这一点。该功能采用图像的路径并将图像输入到我们的人脸识别网络。然后,它返回来自网络的输出,恰好是图像的编码。

一旦我们将每个图像的编码添加到我们的数据库,我们的系统终于可以开始识别个人!

认出一张脸

正如背景部分所讨论的,FaceNet的训练是尽可能减少同一个人的图像之间的距离,并最大限度地提高不同个体的图像之间的距离。我们的实现使用这些信息来确定提供给我们系统的新图像最有可能是哪个人。

上面的函数将新图像输入到一个名为img_to_encoding的实用程序函数中。该功能使用FaceNet处理图像并返回图像的编码。现在我们有编码,我们可以找到图像最有可能属于的个人。

为了找到个人,我们通过我们的数据库,并计算我们的新形象和数据库中的每个人之间的距离。然后选择距离新图像最近的个体作为最可能的候选人。

最后,我们必须确定候选图像和新图像是否包含同一个人。由于我们的循环结束,我们只确定最有可能的个人。这是以下代码片段的作用。

·如果距离高于0.52,那么我们确定新图像中的个体不存在于我们的数据库中。

·但是,如果距离等于或低于0.52,那么我们确定他们是同一个人!

现在这个棘手的部分是0.52的价值是通过对我的具体数据集进行反复试验来实现的。最好的价值可能会低得多或略高,这将取决于您的实施和数据。我建议尝试不同的值,看看最适合你的系统!

使用人脸识别构建系统

现在我们知道了如何使用人脸识别算法来识别一个人的细节,我们可以开始有一些乐趣。

在本文开头部分,我链接到的Github存储库是一个使用笔记本电脑摄像头向我们的人脸识别算法提供视频帧的演示。一旦算法识别到框架中的某个人,演示将播放一条音频消息,欢迎用户在数据库中使用其图像的名称。图3显示了一个演示实例。

结论

现在,您应该熟悉面部识别系统是如何工作的,以及如何使用python中预先训练的FaceNet网络来制作简化的人脸识别系统!

如果你想玩在Github库中的演示,并添加你认识的人的图像,那么继续前进吧。

在演示中享受一些乐趣,并将精彩的脸部识别分享给您的所有朋友!