前言
本系列博客学习如何使用OpenCV来执行面部识别。
为了构建人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取人脸特征,在提取到特征上训练人脸识别模型,然后用OpenCV识别图像和视频流中的人脸。
这里提取人脸特征,用到Embedding(嵌入)。
那什么是Embedding(嵌入)呢?,把高维原始数据(人脸图像)映射到低维流形,使得高维的原始数据被映射到低维流形之后变得可分,而这个映射就叫嵌入(Embedding);它起到提取特征和降维的作用;
关于Embedding(嵌入)的原理可以看看:https://www.zhihu.com/question/38002635、https://zhuanlan.zhihu.com/p/138310401
思路
本博客中,我们将学习如何将深度学习和OpenCV一起应用(除了scikit-learn之外没有其他库):
- 检测面部
- 计算128-d面部嵌入Embedding(特征向量)以量化面部特征
- 在嵌入(Embedding)之上训练支持向量机(SVM)
- 识别图像和视频流中的面部
所有这些任务都将通过OpenCV完成,使我们能够获得“纯粹的”OpenCV人脸识别内容。
流程框架:
其中关键步骤是DNN特征提取器,可生成128维面部嵌入(Embedding)。

图1: OpenCV人脸识别流程概述。
两个关键步骤:
- 应用面部检测,其检测图像中面部的存在和位置,但不识别它
- 提取量化图像中每个面部的128维特征向量(称为“嵌入”)
首先,我们将图像或视频帧输入到人脸识别管道。给定输入图像,我们应用面部检测来检测图像中面部的位置。
我们可以选择计算面部标志,使我们能够预处理和对齐面部。
顾名思义,面部对齐是
(1)识别面部的几何结构
(2)基于平移,旋转和缩放来尝试获得面部的规范对齐的过程。
虽然可选,但已经证明面部对齐可以提高某些管道中的面部识别精度。
在我们(可选)应用面对齐和裁剪之后,我们通过深度神经网络传递输入面:

FaceNet深度学习模型计算128-d嵌入,即:生成128维特征向量,量化面部本身。
但网络如何实际计算面部嵌入?
答案在于训练过程本身,包括:
- 输入数据到网络
- 三重损失功能
为了训练具有深度学习的人脸识别模型,每个输入批量数据包括三个图像:
- 该锚
- 该正面形象
- 该负图像
锚是我们目前的脸,有身份的一个。
第二张图像是我们的正面图像 - 此图像还包含人物A的脸部。
另一方面,负面图像不具有相同的身份,可能属于人B,C甚至Y!
关键是锚和正图像都属于同一个人/面部,而负面图像不包含相同的面部。
神经网络计算每个面的128-d嵌入,然后调整网络的权重(通过三元组丢失函数),这样:
- 锚和正像的128-d嵌入更靠近在一起
- 与此同时,推动负面图像父亲的嵌入
以这种方式,网络能够学习量化面部并返回适合于面部识别的高度鲁棒且有区别的嵌入。
进而,我们实际上可以重用为我们自己的应用程序OpenFace模型,而无需显式地训练它!
即使我们今天使用的深度学习模型(很可能)从未见过我们即将通过它的面部,模型仍然能够计算每个面部的嵌入 - 理想情况下,这些面部嵌入将足够不同的是,我们可以在面部嵌入的基础上训练“标准”机器学习分类器(SVM,SGD分类器,随机森林等),从而获得我们的OpenCV人脸识别管道。
先看一下效果,建立信心完成人脸识别的功能模块

解释:pu:97.31% pu为识别用户的名称(后面我们使用--用户名的拼音建立文件夹),这里的pu是我的用户名;
97.31%为识别用户的准确率。
希望对你有帮助。















