https://mp.weixin.qq.com/s/ha0sshRzuXuLn743Kk007w
Dlib中,人脸识别的基本思路为:
- 计算已知图片中所有人脸对应的特征向量;
- 计算要识别的未知图片中所有人脸对应的特征向量;
- 计算人脸之间的欧式距离;
- 如果两张人脸之间的欧式距离小于设定的阈值,则认为是同一个人,否则认为不是同一个人
项目有 4 个顶级目录:
- dataset/ :包含六个字符的面部图像,根据它们各自的名称组织到子目录中。。
- output/ :这是您可以存储处理过的人脸识别视频的地方。我要把我的一个留在文件夹里——原侏罗纪公园电影中的经典“午餐场景”。
- videos/ :输入视频应存储在此文件夹中。该文件夹还包含“午餐场景”视频,但尚未经过我们的人脸识别系统。
根目录下还有 6 个文件:
- encode_faces.py :人脸的编码(128 维向量)是用这个脚本构建的。
- identify_faces_image.py :识别单个图像中的人脸(基于数据集中的编码)。
- identify_faces_video.py :识别来自网络摄像头的实时视频流中的人脸并输出视频。
- encodings.pickle :面部识别编码通过 encode_faces.py 从您的数据集生成,然后序列化到磁盘。
创建图像数据集后(使用 search_bing_api.py ),我们将运行 encode_faces.py 来构建嵌入。然后,我们将运行识别脚本来实际识别人脸。
训练
使用预训练网络然后使用它为我们数据集中的 29张人脸中的每一张构建 128 维嵌入更容易。
然后,在分类过程中,我们可以使用一个简单的 k-NN 模型 + 投票来进行最终的人脸分类。其他传统的机器学习模型也可以在这里使用。要构建我们的人脸嵌入
新建 encode_faces.py
遍历每个图像的路径。从 imagePath中提取人名。然后让我们加载图像,同时将 imagePath 传递给 cv2.imread。OpenCV 使用BGR 颜色通道,但 dlib 实际上期望 RGB。face_recognition 模块使用 dlib ,交换颜色空间。
- model:cnn 或 hog(该值包含在与“detection_method”键关联的命令行参数字典中)。CNN方法更准确但速度更慢。HOG 速度更快,但准确度较低。
将面部的边界框转换为 128 个数字的列表。这称为将面部编码为向量,而face_recognition.face_encodings 方法会处理它。编码和名称附加到适当的列表(knownEncodings 和 knownNames)。
构造了一个带有两个键的字典—— “encodings” 和 “names” 。
识别
recognize_faces_image.py
1.开始遍历从输入图像计算出的人脸编码。尝试使用 face_recognition.compare_faces将输入图像(编码)中的每个人脸与我们已知的编码数据集进行匹配。
2.此函数返回 True / False 值列表,数据集中的每个图像对应一个值。
3.在内部,compare_faces 函数正在计算候选嵌入与我们数据集中所有人脸之间的欧几里德距离:
如果距离低于某个容差(容差越小,我们的面部识别系统就会越严格),那么我们返回 True ,表示面部匹配。
否则,如果距离高于容差阈值,我们将返回 False,因为人脸不匹配。本质上利用 k-NN 模型进行分类。name 变量最终将保存此人的姓名字符串——现在,我们将其保留为 “Unknown”,以防没有“投票”。
计算每个名字的“投票”数,统计投票数,并选择对应票数最多的人的名字。
如果匹配中有任何 True 投票,确定这些 True 值在匹配中的位置的索引。
然后初始化一个名为 counts 的字典,它将以字符名称作为键,将投票数作为值。然后循环匹配的Idxs并设置与每个名称关联的值,同时根据需要在 counts 中增加它。继续并遍历每个人的边界框和标记名称,并将它们绘制在输出图像上以进行可视化: