OpenCV 人脸识别 源代码
原文链接 https://hotdog29.com/?p=553
在 2019年7月6日 上张贴 由 hotdog发表回复
opencv 人脸识别在本教程中,您将学习如何使用 opencv 人脸识别 。为了构建我们的人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取人脸嵌入,在嵌入上训练人脸识别模型,然后用 OpenCV 识别图像和视频流中的人您当然可以换成自己的面部数据集!您需要做的就是按照我的目录结构插入您自己的面部
OpenCV人脸识别
在今天的教程中,您将学习如何使用OpenCV库执行面部识别。
您可能想知道本教程与我几个月前用dlib进行人脸识别时所写的教程有何不同?
好吧,请记住,dlib人脸识别帖子依赖于两个重要的外部库:
- dlib(显然)
- face_recognition(这是一组易于使用的面部识别实用程序,包含dlib)
虽然我们使用OpenCV来促进面部识别,但OpenCV 本身并不负责识别面部。
在今天的教程中,我们将学习如何将深度学习和OpenCV一起应用(除了 scikit-learn 之外没有其他库):
- 检测面部
- 计算128-d面部嵌入以量化面部
- 在嵌入之上训练支持向量机(SVM)
- 识别图像和视频流中的面部
所有这些任务都将通过OpenCV完成,使我们能够获得“纯粹的” OpenCV 人脸识别管道。
OpenCV的人脸识别是如何工作的
图1: OpenCV人脸识别管道概述。关键步骤是CNN特征提取器,可生成128维面部嵌入。(来源)
为了构建我们的OpenCV人脸识别管道,我们将在两个关键步骤中应用深度学习:
- 应用面部检测,其检测图像中面部的存在和位置,但不识别它
- 提取量化图像中每个面部的128维特征向量(称为“嵌入”)
我已经讨论过OpenCV的人脸检测之前是如何工作的,所以如果你以前没有检测到面部,请参考它。
负责实际量化图像中每个面部的模型来自OpenFace项目,这是一个Python和Torch实现的面部识别和深度学习。该实现来自Schroff等人的2015年CVPR出版物,FaceNet: 用于人脸识别和聚类的统一嵌入。
查看整个FaceNet实现超出了本教程的范围,但管道的要点可以在上面的图1中看到。
首先,我们将图像或视频帧输入到人脸识别管道。给定输入图像,我们应用面部检测来检测图像中面部的位置。
我们可以选择计算面部标志,使我们能够预处理和对齐面部。
顾名思义,面部对齐是(1)识别面部的几何结构和(2)基于平移,旋转和缩放来尝试获得面部的规范对齐的过程。
虽然可选,但已经证明面部对齐可以提高某些管道中的面部识别精度。
在我们(可选)应用面对齐和裁剪之后,我们通过深度神经网络传递输入面:
图2:深度学习人脸识别模型如何计算人脸嵌入。
FaceNet深度学习模型计算128-d嵌入,量化面部本身。
但网络如何实际计算面部嵌入?
答案在于培训过程本身,包括:
- 输入数据到网络
- 三重损失功能
为了训练具有深度学习的人脸识别模型,每个输入批量数据包括三个图像:
1, The anchor( 锚 )
2, The positive image
3, The negative image
锚是我们目前的脸,有身份的一个。
第二张图像是我们的正面图像 – 此图像还包含人物A的脸部。
另一方面,负面图像不具有相同的身份,可能属于人B,C甚至Y!
关键是锚和正图像都属于同一个人/面部,而负面图像不包含相同的面部。
神经网络计算每个面的128-d嵌入,然后调整网络的权重(通过三元组丢失函数),这样:
- 锚和正像的128-d嵌入更靠近在一起
- 与此同时,推动负面图像父亲的嵌入
以这种方式,网络能够学习量化面部并返回适合于面部识别的高度鲁棒且有区别的嵌入。进而,我们实际上可以重用为我们自己的应用程序OpenFace模型,而无需显式地训练它!
即使我们今天使用的深度学习模型(很可能)从未见过我们即将通过它的面部,模型仍然能够计算每个面部的嵌入 – 理想情况下,这些面部嵌入将足够不同的是,我们可以在面部嵌入的基础上训练“标准”机器学习分类器(SVM,SGD分类器,随机森林等),从而获得我们的OpenCV人脸识别管道。
如果您有兴趣了解有关三联体丢失的详细信息以及如何使用它来训练面部嵌入模型,请务必参考我之前的博客文章 以及Schroff等人。出版。
我们的人脸识别数据集
图3:使用OpenCV进行人脸识别的小型示例人脸数据集。
我们今天使用的数据集包含三个人:
- 我
- 特丽莎(我的妻子)
- “未知”,用于表示我们不知道并希望标记的人的面孔(这里我只是从我之前的帖子中使用的电影“ 侏罗纪公园”中采样- 你可能想要插入自己的“未知” “数据集”
每个类包含总共六个图像。
如果您正在构建自己的人脸识别数据集,理想情况下,我建议每个人想要识别10-20张图像 – 请务必参考“缺点,限制以及如何获得更高的人脸识别准确度”部分博客文章了解更多详情。
项目结构“下载”代码后,继续解压缩归档并导航到目录。
从那里,您可以使用 tree 命令在终端中打印目录结构
现在花点时间仔细阅读本节,以便熟悉当今项目中的所有文件。
我们的项目在根文件夹中有四个目录:
- dataset / :包含按名称组织到子文件夹中的面部图像。
- images / :包含三个测试图像,我们将用它们来验证模型的运行。
- face_detection_model / :包含OpenCV提供的预先训练的Caffe深度学习模型,用于检测 面部。该模型 检测并 定位图像中的面部。
- output / :包含我的输出pickle文件。如果您正在使用自己的数据集,则也可以将输出文件存储在此处。输出文件包括:
- embeddings.pickle :一个序列化的面部嵌入文件。已为数据集中的每个面计算嵌入并将其存储在此文件中。
- le.pickle :我们的标签编码器。包含我们的模型可识别的人员的名称标签。
- recognizer.pickle :我们的线性支持向量机(SVM)模型。这是一个机器学习模型而不是深度学习模型,它负责实际识别 面部。
让我们总结一下根目录中的五个文件:
- extract_embeddings .py :我们将在步骤#1中查看此文件,该文件 负责使用深度学习特征提取器生成描述面部的128-D向量。我们的数据集中的所有面将通过神经网络传递以生成嵌入。
- openface_nn4 .small2 .v1 .t7 :Torch深度学习模型,可生成128-D面部嵌入。我们将在步骤#1,#2和#3以及 奖金部分中使用这种深度学习模型 。
- train_model .py :我们的线性SVM模型将在步骤#2中通过此脚本进行训练 。我们将 检测面部, 提取嵌入,并使 我们的SVM模型适合嵌入数据。
- recognize .py :在 步骤#3中 ,我们将 识别图像中的面部。我们将 检测面部, 提