我猜这回答了直方图部分的问题。所以最终你会得到训练数据集中每个人脸图像的一个直方图,这意味着如果训练数据集中有100个图像,那么LBPH会在训练后提取100个直方图,并储存起来以便以后识别。记住,算法也会跟踪哪个直方图属于哪个人。
在识别后期,当您将新图像送入识别器进行识别时,它将生成新图像的直方图,将该直方图与其已有的直方图进行比较,找到最佳匹配直方图并返回与该最佳匹配关联的人员标签 匹配直方图。
下面是一张脸和它们各自的局部二进制模式图像的列表。您可以看到,LBP图像不受光照条件变化的影响。
局部人脸
理论部分已经结束,现在是编码部分!准备好开始编写代码了吗?那我们开始吧。
使用OpenCV编码人脸识别
本教程中的人脸识别过程分为三个步骤。
1、准备训练数据:在这一步中,我们将读取每个人/主体的训练图像及其标签,从每个图像中检测人脸并为每个检测到的人脸分配其所属人员的整数标签。
2、训练人脸识别器:在这一步中,我们将训练OpenCV的LBPH人脸识别器,为其提供我们在步骤1中准备的数据。
3、测试:在这一步中,我们会将一些测试图像传递给人脸识别器,并查看它是否能够正确预测它们
编程工具:
注:Numpy使Python中的计算变得容易。 除此之外,它还包含一个强大的N维数组实现,我们将使用它来将数据作为OpenCV函数的输入。
导入必需的模块
在开始实际编码之前,我们需要导入所需的编码模块。 所以让我们先导入它们。
cv2:是Python的OpenCV模块,我们将用它来进行人脸检测和人脸识别。
os:我们将使用这个Python模块来读取我们的培训目录和文件名。
numpy:我们将使用此模块将Python列表转换为numpy数组,因为OpenCV人脸识别器接受numpy数组。
#导入OpenCV模块 import cv2 #导入os模块用于读取训练数据目录和路径 import os # 导入numpy将python列表转换为numpy数组,OpenCV面部识别器需要它 import numpy as np
训练数据
训练中使用的图像越多越好。 通常很多图像用于训练面部识别器,以便它可以学习同一个人的不同外观,例如戴眼镜,不戴眼镜,笑,伤心,快乐,哭泣,留着胡子,没有胡子等。 简单的教程我们将只为每个人使用12张图片。
所以我们的训练数据由共2人组成,每个人有12张图像。 所有培训数据都在培训数据文件夹内。 训练数据文件夹包含每个人的一个文件夹,并且每个文件夹以格式sLabel(例如s1,s2)命名,其中标签实际上是分配给该人的整数标签。 例如,名为s1的文件夹意味着该文件夹包含人员1的图像。培训数据的目录结构树如下所示:
training-data |-------------- s1 | |-- 1.jpg | |-- ... | |-- 12.jpg |-------------- s2 | |-- 1.jpg | |-- ... | |-- 12.jpg测试数据文件夹包含我们将用于在成功培训完成后测试人脸识别器的图像