OpenCV 人脸识别 源代码

请直接查看原文 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中 ,我们将 识别图像中的面部。我们将 检测面部, 提取嵌入并 查询 我们的SVM模型以确定 图像中的人物。我们将在面部周围绘制框并用名称注释每个框。
recognize_video .py :介绍如何 识别谁是就像我们在视频流的帧 第3步的静态图像。
让我们继续第一步吧!

步骤#1:从面部数据集中提取嵌入
现在我们了解了人脸识别的工作原理并审查了我们的项目结构,让我们开始构建我们的OpenCV人脸识别管道。

打开 extract_embeddings .py 文件

我们在第2-8行导入我们所需的包 。您需要 安装OpenCV和 imutils。要安装OpenCV。可以参考我的教程 pip 安装 opencv 我的imutils软件包可以用pip安装

1 $ pip install --upgrade imutils
接下来,我们处理命令行参数:

– dataset :面部图像输入数据集的路径。
– embeddings :输出嵌入文件的路径。我们的脚本将计算我们将序列化到磁盘的面嵌入。
– detector :OpenCV基于Caffe的深度学习人脸探测器的路径,用于实际定位图像中的人脸。
– -embedding-model :OpenCV深度学习Torch嵌入模型的路径。该模型将允许我们 提取128-D面部嵌入向量。
– -confidence :过滤周面检测的可选阈值。
现在我们已经导入了包和解析的命令行参数,让我们从磁盘加载面部检测器和嵌入器

在这里我们加载面部检测器和嵌入器:

探测器 :通过26-29号线加载 。我们使用基于Caffe的DL人脸检测器来定位图像中的面部。
嵌入器 :装在 33号线上。该模型基于Torch,负责通过深度学习特征提取提取面部嵌入。
请注意,我们正在使用相应的 cv2 。dnn 用于加载两个单独的模型。在OpenCV 3.3 之前,dnn模块不能像这样提供,但我建议您在此博客文章中使用OpenCV 3.4.2或更高版本。

继续前进,让我们抓住我们的图像路径并执行初始化

基于第37行构建的 imagePaths列表 包含数据集中每个图像的路径。我已经通过 imutils function, paths.list_images 简化了

我们的嵌入和相应的名称将保存在两个列表中: knownEmbeddings 和 knownNames (第41和42行)。

我们还将通过名为total的变量 (第45行)跟踪我们处理的面数 。

让我们开始在图像路径上循环 – 这个循环将负责从每个图像中找到的面中提取嵌入

我们开始 在第48行上循环遍历 imagePath。

首先,我们 从路径中提取人的 名字(第52行)。要解释这是如何工作的,请在我的Python shell中运行以下示例

请注意如何使用 imagePath 。拆分 并提供拆分字符(OS路径分隔符 – 在unix上为“/”,在Windows上为“\”),该函数生成一个文件夹/文件名(字符串)列表,它沿着目录树向下走。我们抓住倒数第二个索引, 人名 ,在这种情况下是 ‘adrian’ 。

最后,我们通过加载图像 并将其调整为已知宽度(第57和58行)来 包装上面的代码块。

让我们检测并定位面孔

在 62-64行,我们构造了一个blob。要了解有关此过程的更多信息,请阅读 深度学习:OpenCV的blobFromImage如何工作。

从那里我们通过将imageBlob 传递到探测器网络来 检测图像中的 面部(第68和69行)。

让我们处理 检测

该 检测 列表包含概率和坐标图像中的定位面。

假设我们至少有一个检测,我们将进入if语句的主体(第72行)。

我们假设图像中只有一个面,因此我们以最高置信度提取检测 并检查以确保置信度满足用于滤除弱检测的最小概率阈值(第75-81行)。

假设我们已达到该阈值,我们提取 面部 ROI并抓取/检查尺寸以确保面部 ROI足够大(第84-93行)。

从那里,我们将利用我们的优势, 嵌入 CNN和提取脸的嵌入

我们构建另一个blob,这次是从第98行和第99行的面部ROI(不是我们之前做过的整个图像) 。

随后,我们将faceBlob传递给 嵌入器CNN(第100和101行)。这将生成 描述面部的128-D向量( vec)。我们将利用这些数据通过机器学习识别新面孔。

然后我们分别添加 名称 并将vec嵌入 到 knownNames 和 knownEmbeddings (第105和106行)。

我们也不能忘记我们设置的跟踪总 面数的变量 – 我们继续并在第107行增加值 。

我们继续这个循环图像,检测面部,并为我们的数据集中的每个图像提取面部嵌入的过程 。

循环结束时剩下的就是将数据转储到磁盘

我们将名称和嵌入数据添加到字典中,然后 在第110-114行的pickle文件中序列化 数据。

此时我们已准备好通过运行脚本来提取嵌入

从那里,打开一个终端并执行以下命令来计算OpenCV的面嵌入

在这里你可以看到我们已经提取了18个面嵌入,每个图像一个(每个类6个)在我们的输入面数据集中。

步骤#2:训练人脸识别模型
此时我们已经为每张脸提取了128-d嵌入 – 但是我们如何根据这些嵌入实际识别出一个人呢?答案是我们需要在嵌入之上训练“标准”机器学习模型(例如SVM,k-NN分类器,随机森林等)。

在我之前的人脸识别教程中, 我们发现了k-NN的修改版本如何用于通过dlib和face_recognition库创建的128-d嵌入的人脸识别。

今天,我想分享一下我们如何在嵌入之上构建一个更强大的分类器 – 如果您愿意,您也可以在基于dlib的人脸识别管道中使用相同的方法。

打开 train_model .py 文件并

在运行此脚本之前,我们需要在我们的环境中安装scikit-learn,一个机器学习库。你可以通过pip安装它

1 $ pip install scikit-learn
我们在第2-5行导入我们的包和模块 。我们将使用scikit-learn的支持向量机(SVM)实现,这是一种常见的机器学习模型。

从那里我们解析命令行参数:

– embeddings :序列化嵌入的路径(我们通过运行之前的 extract_embeddings .py 脚本导出它 )。
– recognizer :这将是我们识别面部的输出模型。它基于SVM。我们将保存它,以便我们可以在接下来的两个识别脚本中使用它。
– le :我们的标签编码器输出文件路径。我们将标签编码器序列化为磁盘,以便我们可以在图像/视频人脸识别脚本中使用它和识别器模型。
每个参数都是必需的。

让我们加载面部嵌入并编码我们的标签

在这里,我们从载入我们的嵌入 从步骤#1的 第19行。我们不会在此模型训练脚本中生成任何嵌入 – 我们将使用先前生成和序列化的嵌入。

然后我们初始化我们的scikit-learn LabelEncoder 并编码我们的名称 标签 (第23和24行)。

现在是时候训练我们的SVM模型识别面部了

在 第29行,我们初始化我们的SVM模型,在 第30行,我们 拟合 模型(也称为“训练模型”)。

在这里,我们使用线性支持向量机(SVM),但如果您愿意,可以尝试使用其他机器学习模型。

训练模型后,我们将模型和标签编码器输出到磁盘作为pickle文件。

我们在这个块中将两个pickle文件写入磁盘 – 面部识别器模型和标签编码器

现在我们已经完成了train_model .py的编码 ,让我们将它应用于我们提取的面嵌入

在这里,您可以看到我们的SVM已经通过嵌入式培训,并且(1)SVM本身和(2)标签编码已写入磁盘,使我们能够将它们应用于输入图像和视频。

第3步:使用OpenCV识别人脸
我们现在准备用OpenCV进行人脸识别!

我们将首先识别本节中图像中的面部,然后继续在下一节中识别视频流中的面部。

打开了 recognize .py 文件在您的项目

我们 在第2-7行导入我们所需的包 。此时,您应该安装每个软件包。

我们的六个命令行参数在第10-23行解析 :

– image :输入图像的路径。我们将尝试识别此图像中的面部。
– detector :OpenCV深度学习人脸探测器的路径。我们将使用此模型来 检测图像中面部ROI的位置。
– embedding-model :OpenCV深度学习面嵌入模型的路径。我们将使用此模型从面部ROI中提取128-D面部嵌入 – 我们将数据提供给识别器。
– -recognizer :识别器模型的路径。我们在步骤#2中训练了我们的SVM识别器 。这实际上 决定了一张脸是谁。
– le :标签编码器的路径。这包含我们的脸部标签,如 ‘adrian’ 或 ‘trisha’ 。
– confidence :过滤弱脸检测的可选阈值。
一定要研究这些命令行参数 – 了解两个深度学习模型和SVM模型之间的区别非常重要。如果您在此脚本中稍后发现自己感到困惑,请参阅此处。

现在我们已经处理了导入和命令行参数,让我们将三个模型从磁盘加载到内存中

我们在这个块中加载了三个模型。存在冗余的风险,我想明确提醒您模型之间的差异:

detector :预先训练的Caffe DL模型,用于探测人脸在图像中的位置(第27-30行)。
embedder :预训练的 Torch DL模型,用于计算我们的128-D面嵌入(第34行)。
recognizer :我们的线性SVM人脸识别模型(第37行)。我们在第2步训练了这个模型 。
1和2都是 预先训练的,这意味着它们是由OpenCV按原样提供给您的。它们被上传在GitHub上的OpenCV项目中,但为了方便起见,我将它们包含在今天帖子的 源代码部分中。我还按照我们将它们用于识别OpenCV面部的顺序对模型进行编号。

我们还加载了标签编码器,其中包含我们模型可识别的人员的姓名(第38行)。

现在让我们加载我们的图像并 检测面部

在这里,我们:

将图像加载到内存中并构造一个blob(第42-49行)。了解 Learn about cv2.dnn.blobFromImage here. 。
通过我们的探测器定位图像中的面 (第53和54行)。
鉴于我们的新 检测 ,让我们识别图像中的面孔。但首先我们需要过滤弱 检测 并提取 面部 ROI

您将从步骤#1中识别出此块 。我将在此再解释一下:

我们遍历所有的 检测 在 57行和提取 confidence 在60行。
然后我们将置信度 与命令行args 字典中包含的最小概率检测阈值 进行比较 ,确保计算出的概率大于最小概率(第63行)。
从那里,我们提取 面部 ROI(第66-70行)以及确保其空间尺寸足够大(第74和75行)。
识别面部 ROI 的名称 只需几个步骤

首先,我们构造一个faceBlob (来自 面部 ROI)并将其传递 给 嵌入器 以生成描述面部的128-D向量(第80-83行)

然后,我们 通过我们的SVM识别器模型(第86行)传递 vec,其结果是我们对面对ROI的人的预测 。

我们采用最高概率指数(第87行)并查询我们的标签编码器以找到 名称 (第89行)。在两者之间,我在第88行提取概率 。

注意: 您可以通过对概率应用额外的阈值测试来进一步滤除弱脸识别。例如,如果proba < T (其中 T 是您定义的变量),则插入 可以提供额外的过滤层,以确保较少的假阳性面部识别。

现在,让我们显示OpenCV人脸识别结果

对于我们在循环中识别的每个面孔(包括“未知”)人:

我们 在第93行构造一个 包含名称和概率的 文本字符串 。
然后我们在脸部周围画一个矩形并将文本放在盒子上方(第94-98行)。
然后我们最终在屏幕上显示结果,直到按下一个键(第101和102行)。

是时候使用OpenCV识别图像中的面部了!

要将我们的OpenCV面部识别管道应用于我提供的图像(或您自己的数据集+测试图像),请确保使用博客文章的“下载”部分下载代码,训练模型和示例图像。

从那里,打开一个终端并执行以下命令

图4: OpenCV的人脸识别已经认识到我在侏罗纪世界:堕落王国电影放映。

我的面部预测只有47.15%的信心; 但是,这种信心高于 “未知”类。

让我们尝试另一个 opencv 人脸识别 示例

图5:我的妻子Trisha和我在OpenCV +深度学习面部识别的飞机上拍照。

以下是Trisha和我,准备开始我们的假期!

在最后一个例子中,让我们看看当我们的模型无法识别实际面部时会发生什么

图6:使用OpenCV进行面部识别已确定此人是“未知”。

第三张图片是一个“未知”人物的例子,实际上是来自American Psycho的 Patrick Bateman – 相信我,这不是一个你想要看到的人出现在你的图像或视频流中!

识别视频流中的面孔
作为奖励,我决定在视频流中加入专门用于OpenCV人脸识别的部分!

实际的管道本身几乎与识别图像中的面部相同,只有一些更新,我们将在此过程中进行检查。

开拓 recognize_video .py 文件,让我们开始吧

我们的导入与 上面的步骤#3部分相同 ,除了 我们使用 imutils的第2行和第3 行。视频 模块。我们将使用 VideoStream 从我们的相机和FPS捕获帧 以计算每秒帧数统计数据。

除了我们没有通过命令行将路径传递给静态图像之外,命令行参数也是相同的。相反,我们将获取对我们网络摄像头的引用,然后处理视频。如果需要查看参数,请参阅 步骤3。

我们的三个模型和标签编码器在这里加载

在这里我们加载面部 检测器 ,面部 嵌入器 模型,面部 识别器 模型(线性SVM)和标签编码器。

如果您对三种型号或标签编码器感到困惑,请务必参考 步骤#3。

让我们初始化我们的视频流并开始处理帧

我们的 VideoStream 对象已初始化并在第43行启动 。我们等待相机传感器在44号线上预热 。

我们还初始化每秒帧数(第47行)并开始在第50行的帧上循环 。我们 从第52行的网络摄像头 抓取一个 框架。

从这里开始,一切都与第3步相同。我们 调整 帧的大小(L ine 57),然后我们从帧构造一个blob +检测面的位置(第61-68行)。

现在让我们处理检测

正如在上一节中一样,我们开始循环 检测 并滤除弱检测(第71-77行)。然后我们提取 面部 ROI以及确保空间尺寸足够大以用于后续步骤(第84-89行)。

现在是时候进行OpenCV人脸识别了

在这里,我们:

构造 faceBlob (第94和95行)并通过深度学习计算面部嵌入(第96和97行)。
在计算概率时识别最可能 的面部名称(第100-103行)。
在脸部周围绘制一个边界框和 人名 +概率(第107-112行)。
我们的 fps 计数器在115行更新 。

让我们显示结果并清理

要关闭脚本,我们:

显示带注释的 帧 (第118行)并等待按下“q”键,此时我们突破循环(第119-123行)。
停止我们的 fps 计数器并在终端中打印统计数据(第126-128行)。
通过关闭窗口并释放指针进行清理(第131和132行)。
要在视频流上执行OpenCV人脸识别管道,请打开终端并执行以下命令

图7: 使用OpenCV进行视频中的人脸识别。

正如你所看到的,Trisha和我的脸都被正确识别了!我们的OpenCV人脸识别管道也在我的iMac上获得了~16 FPS。在我的MacBook Pro上,我获得了大约14 FPS的吞吐率。

缺点,限制以及如何获得更高的人脸识别准确度

图8:所有人脸识别系统都容易出错。永远不会有100%准确的人脸识别系统。

不可避免地,你会遇到OpenCV无法正确识别脸部的情况。

你在那些情况下做什么?

您如何提高您的OpenCV人脸识别准确度?在本节中,我将详细介绍一些建议的方法,以提高人脸识别管道的准确性

您可能需要更多数据

图9:大多数人没有用足够的数据训练他们的OpenCV人脸识别模型。(图片来源)

我的第一个建议可能是最明显的建议,但值得分享。

在我之前的人脸识别教程中,少数PyImageSearch读者询问为什么他们的面部识别准确度很低而且面孔被错误分类

我得到的印象是大多数读者已经知道他们需要更多的面部图像,因为他们每个人只有一个或两个示例面孔,但我怀疑他们希望我从我的一些提示和技巧中解决计算机视觉技术问题。

它不像那样工作。

如果你发现自己的人脸识别准确率低,并且每个人只有一些示例面孔,那么收集更多数据 – 没有“计算机视觉技巧”可以帮助你避免数据收集过程。

加大您的数据,您将拥有更好的OpenCV人脸识别渠道。 一般来说,我建议每人至少10-20张面孔。

注意:你可能会想,今天的帖子中每人只收集了6张图片!”是的,你是对的 – 我这样做是为了证明这一点。我们今天在这里讨论的OpenCV人脸识别系统有效,但总是可以改进。有时,较小的数据集会为您提供所需的结果,并且尝试使用小型数据集没有任何问题 – 但是当您未达到所需的准确度时,您将需要收集更多数据。

执行面部对齐

图9:为OpenCV进行面部对齐面部识别可以显着提高面部识别性能。

人脸识别模型OpenCV用于计算来自OpenFace项目的128-d面嵌入。

OpenFace模型在已对齐的面上表现更好。

面部对齐是以下过程:

识别图像中面部的几何结构。
尝试基于平移,旋转和缩放获得面部的规范对齐。
从 本节顶部的图9中可以看出,我有:

检测到图像中的面部并提取ROI(基于边界框坐标)。
应用面部标志检测 来提取眼睛的坐标。
计算每个眼睛的质心以及眼睛之间的中点。
并且基于这些点,应用仿射变换将面部大小调整为固定大小和尺寸。
如果我们将面对齐应用于数据集中的每个面,则在输出坐标空间中,所有面应该:

以图像为中心。
旋转使得眼睛位于水平线上(即,面部旋转使得眼睛沿着相同的y坐标)。
缩放使得面的大小大致相同。
将面部对齐应用于我们的OpenCV面部识别管道超出了今天教程的范围,但如果您想使用OpenCV和OpenFace进一步提高面部识别的准确性,我建议您应用面部对齐。

查看我的博客文章, 使用OpenCV和Python进行Face Alignment。

调整你的超参数
我的第二个建议是,您尝试在您正在使用的任何机器学习模型上调整您的超参数(即,在提取的面部嵌入之上训练的模型)。

在本教程中,我们使用了线性SVM; 但是,我们没有调整 C 值,这通常是调整SVM的最重要的值。

该 Ç 值是一个“阈值”参数和控制你多么想避免在错误分类的训练集中的每个数据点。

较大的C值 将更严格,并且更加努力地对每个输入数据点进行正确分类,即使存在过度拟合的风险。

较小的C值 将更“软”,允许在训练数据中进行一些错误分类,但理想情况下更好地推广测试数据。

有趣的是,根据OpenFace GitHub中的一个分类示例,他们实际上建议不调整超参数,因为根据他们的经验,他们发现设置 C = 1 在大多数设置中获得令人满意的面部识别结果。

尽管如此,如果您的面部识别精度不够,通过网格搜索或随机搜索调整超参数可能需要额外的工作量和计算成本。

使用dlib的嵌入模型(但不是它的k-NN用于人脸识别)
根据我使用OpenCV的人脸识别模型和dlib的人脸识别模型的经验,我发现dlib的面部嵌入更具有辨别力,特别是对于较小的数据集。

此外,我发现dlib的模型较少依赖于:

面部对齐等预处理
在提取的面嵌入之上使用更强大的机器学习模型
如果你看一下我的原始人脸识别教程,你会注意到我们使用了一个简单的k-NN算法进行人脸识别(通过一个小的修改来抛出距离超过阈值的最近邻居投票)。

k-NN模型运行得非常好,但正如我们所知,存在更强大的机器学习模型。

为了进一步提高准确性,你可能想要使用dlib的嵌入模型,然后不是应用k-NN,而是从今天的帖子开始遵循步骤#2,并在面部嵌入上训练更强大的分类器。

您是否遇到过运行今天Python面部识别脚本的“USAGE”错
我的错误看起来像这样

或这个:

本教程中有三个单独的Python脚本,而且,每个脚本都要求您(正确)提供相应的命令行参数。

如果您是命令行参数的新手,那很好,但是 在尝试运行这些脚本之前, 您需要了解Python,argparse和命令行参数的工作原理!

我会诚实地对你说 – 面部识别是一种先进的技术。命令行参数是一个 非常初学者/新手的 概念。确保你在跑步前走路,否则你会绊倒。现在花些时间来教育自己如何使用命令行参数。

其次,我总是包含您可以复制并粘贴到终端或命令行的确切命令并运行脚本。您可能希望修改命令行参数以适应您自己的图像或视频数据,但基本上我已经完成了您的工作。通过了解命令行参数,您可以更新参数以 指向您自己的数据, 而无需修改单行代码。

对于想要使用像Spyder的或PyCharm一个IDE读者我的建议是,您将学习如何在命令行中/终端使用命令行参数 第一。在IDE中编程,但使用命令行执行脚本。

我还建议您不要尝试为命令行参数配置IDE,直到您首先通过键入它们来了解它们的工作方式。实际上,您可能会学会喜欢命令行,因为它比每次想要更改它们时单击GUI菜单输入参数更快。一旦掌握了命令行参数的工作原理,就可以在IDE中单独配置它

摘要
在今天的博客文章中,我们使用 opencv 人脸识别 .

我们的OpenCV人脸识别管道是使用四阶段流程创建的:

创建面部图像的数据集
为图像中的每个面提取面嵌入(同样,使用OpenCV)
在面部嵌入的顶部训练模型
利用OpenCV识别图像和视频流中的人
当然,如果您遵循上面详述的项目的目录结构,您可以交换自己的面部数据集。

如果您需要帮助收集自己的面部数据集,请务必参考有关构建面部识别数据集的这篇文章。

安装OpenCV。可以参考我的教程 pip 安装 opencv

代码下载
请看 这篇文章 https://hotdog29.com/?p=620

我希望你喜欢今天关于OpenCV人脸识别的教程!

文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月6日访问

相关文章
代码下载
dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
文本检测 OpenCV EAST文本检测器 源代码
YOLO 对象检测 OpenCV 源代码
OpenCV教程 ,资源和指南
张贴在技术博客、opencv标签:opencv、人脸识别、svm、深度学习编辑

请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553

你可能感兴趣的:(技术,人脸识别,人脸检测,人脸,opencv,源代码)