(二)疲劳驾驶检测---OpenCV其中三种人类识别器Eigenfaces、FisherFace、LBPHFace

1、Eigenfaces人脸识别器:

Eigenface也叫做“特征脸”,通过PCA(主要成分分析)方法将人脸数据转换到另外一种空间维度做相似性运算。在计算过程中,算法可以忽略一些无关紧要的数据,仅识别一些具有代表性的特征数据,最后根据这些特征识别人脸。

(1)创建Eigenfaces人脸识别器:

# num_components:可选参数,PCA方法中保留的分量个数,建议使用默认值。threshold:可选参数,人脸识别器使用的阔值,建议使用默认值
recognizer = cv2.FaceRecognizerSF_create(num_components, threshold) 

(2)对创建识别器对象后,需用通过对对象的train()方法训练识别器(每个人建议给出2张人脸图像以上作为训练样本),每个图像的尺寸分辨率都需要一致,不然训练不了。

# src:用来训练的人脸图像样本列表,格式为list。样本图像宽、高一致。labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同,样本与标签一一对应。
recognizer.train(src, labels)

(3)训练识别器后通过识别器的predict()方法识别人脸,与样本对比,给出最相近的结果和评分。

# 训练识别器后通过识别器的predict()方法识别人脸
# src:需要识别的人脸图像(该图像宽、高必须与样本一致);label:与样本匹配度最高的标签值;confidence:匹配度最高的评分(评分<5000匹配程度较高,0分表示2张图片完全一样)
label, confidence = recognizer.predict(src)

(4)Eigenfaces分类器代码:

import cv2
import numpy as np

photos = list()     # 样本图像列表
lables = list()     # 标签列表

# append()函数只适用于列表list(),对于字典、元组或者集合需要转换成list类型
photos.append(cv2.imread("images\\hdy\\Elvis1.png", 0))   # 记录Elvis1人脸照片
lables.append(0)     # Elvis11对应的标签
photos.append(cv2.imread("images\\hdy\\Elvis2.png", 0))   # 记录Elvis2人脸照片
lables.append(0)     # Elvis12对应的标签
photos.append(cv2.imread("images\\hdy\\Elvis3.png", 0))   # 记录Elvis3人脸照片
lables.append(0)     # Elvis13对应的标签

photos.append(cv2.imread("images\\hdy\\summer1.png", 0))   # 记录summer1人脸照片
lables.append(1)     # summer1对应的标签
photos.append(cv2.imread("images\\hdy\\summer2.png", 0))   # 记录summer2人脸照片
lables.append(1)     # summer2对应的标签
photos.append(cv2.imread("images\\hdy\\summer3.png", 0))   # 记录summer3人脸照片
lables.append(1)     # summer3对应的标签

names = {
    
    "0":"Elvis", "1":"summer"}    # 标签对应的名称字典

# 下面是OpenCV级联分类器中
recognizer = cv2.face.EigenFaceRecognizer_create()    # 创建EigenFace特征脸识别器
# recognizer = cv2.face.FisherFaceRecognizer_create()   # 创建FisherFace特征脸识别器
# recognizer = cv2.face.LBPHFaceRecognizer_create()       # 创建FisherFace特征脸识别器

# 要确保需要训练的照片的尺寸大小一致,不然不可以训练
recognizer.train(photos, np.array(lables))   # 识别器开始训练

i = cv2.imread("images\\hdy\\summer4.png", 0)   # 待识别的人脸图像summer4.png
label, confidence = recognizer.predict(i)   # 识别器开始分析人脸图像(label:标签;confidence:置信度)
print("confidence = " + str(confidence))  # 打印置信度
print(names[str(label)])    # 数组字典中里标签对应的名字
cv2.waitKey()
cv2.destroyAllWindows()

运行结果
在这里插入图片描述

(4)FisherFace分类器代码:

FisherFace通过LDA(线性判别分析技术)方法将人脸数据转换到另外一个空间维度做投影计算,最后根据不同人脸数据得投影距离判断其相似度。

import cv2
import numpy as np

photos = list()     # 样本图像列表
lables = list()     # 标签列表

# append()函数只适用于列表list(),对于字典、元组或者集合需要转换成list类型
photos.append(cv2.imread("images\\hdy\\Elvis1.png", 0))   # 记录Elvis1人脸照片
lables.append(0)     # Elvis11对应的标签
photos.append(cv2.imread("images\\hdy\\Elvis2.png", 0))   # 记录Elvis2人脸照片
lables.append(0)     # Elvis12对应的标签
photos.append(cv2.imread("images\\hdy\\Elvis3.png", 0))   # 记录Elvis3人脸照片
lables.append(0)     # Elvis13对应的标签

photos.append(cv2.imread("images\\hdy\\summer1.png", 0))   # 记录summer1人脸照片
lables.append(1)     # summer1对应的标签
photos.append(cv2.imread("images\\hdy\\summer2.png", 0))   # 记录summer2人脸照片
lables.append(1)     # summer2对应的标签
photos.append(cv2.imread("images\\hdy\\summer3.png", 0))   # 记录summer3人脸照片
lables.append(1)     # summer3对应的标签

names = {
    
    "0":"Elvis", "1":"summer"}    # 标签对应的名称字典

# 下面是OpenCV级联分类器中
# recognizer = cv2.face.EigenFaceRecognizer_create()    # 创建EigenFace特征脸识别器
recognizer = cv2.face.FisherFaceRecognizer_create()   # 创建FisherFace特征脸识别器
# recognizer = cv2.face.LBPHFaceRecognizer_create()       # 创建FisherFace特征脸识别器

# 要确保需要训练的照片的尺寸大小一致,不然不可以训练
recognizer.train(photos, np.array(lables))   # 识别器开始训练

i = cv2.imread("images\\hdy\\summer4.png", 0)   # 待识别的人脸图像
label, confidence = recognizer.predict(i)   # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])    # 数组字典中里标签对应的名字
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

(4)FisherFace分类器代码:

Local BInary Pattern Histogram (LBPH),即二进制模式直方图,善于捕捉局部纹理特征。Eigenfaces和Fisherfaces人脸识别算法都受光线影响,在现实生活中,我们无法保证完美的光照条件。 LBPH人脸识别器是克服这个缺点的一种改进。

在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np

photos = list()     # 样本图像列表
lables = list()     # 标签列表
photos.append(cv2.imread("images\\hdy\\hdy1.png", 0))   # 记录hdy1人脸照片
lables.append(0)     # hdy1对应的标签
photos.append(cv2.imread("images\\hdy\\hdy2.png", 0))   # 记录hdy2人脸照片
lables.append(0)     # hdy2对应的标签
photos.append(cv2.imread("images\\hdy\\hdy3.png", 0))   # 记录hdy3人脸照片
lables.append(0)     # hdy3对应的标签

photos.append(cv2.imread("images\\hdy\\pig1.png", 0))   # 记录pig1人脸照片
lables.append(1)     # pig1对应的标签
photos.append(cv2.imread("images\\hdy\\pig2.png", 0))   # 记录pig2人脸照片
lables.append(1)     # pig2对应的标签
photos.append(cv2.imread("images\\hdy\\pig3.png", 0))   # 记录pig3人脸照片
lables.append(1)     # pig3对应的标签

names = {
    
    "0":"hdy", "1":"pig"}    # 标签对应的名称字典

# 下面是OpenCV级联分类器中
# recognizer = cv2.face.EigenFaceRecognizer_create()    # 创建EigenFace特征脸识别器
# recognizer = cv2.face.FisherFaceRecognizer_create()   # 创建FisherFace特征脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()       # 创建FisherFace特征脸识别器

# 不一定需要训练的照片的尺寸大小一致,都可以训练
recognizer.train(photos, np.array(lables))   # 识别器开始训练

i = cv2.imread("images\\hdy\\pig4.png", 0)   # 待识别的人脸图像
label, confidence = recognizer.predict(i)   # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])    # 数组字典中里标签对应的名字
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/K_AAbb/article/details/127023840
今日推荐