人脸识别:基于PCA的人脸识别系统 Python实现
人脸识别:基于PCA的人脸识别系统 Python实现
本代码使用Python和OpenCV库实现了一个简单的人脸识别系统。该系统使用PCA(主成分分析)方法提取人脸特征,并通过欧氏距离比较识别目标人脸。
代码:
import cv2
import os
import numpy as np
from sklearn.decomposition import PCA
# 人脸检测函数
def detect_face(img, face_cascade): # 返回脸的图像和数值信息
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) # 检测人脸
if (len(faces) == 0):
return None, None
for (x, y, w, h) in faces:
face = gray[y:y + w, x:x + h].astype(np.float32) # 数值转换
face = cv2.resize(face, (150, 150))
return face, faces
# 准备训练数据函数
def prepare_training_data(data_folder_path):
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') # 训练一组数据
dirs = os.listdir(data_folder_path) # 返回data_folder_path目录下的文件夹和文件
faces = []
labels = []
for dir_name in dirs:
label = int(dir_name)
subject_dir_path = data_folder_path + '/' + dir_name
subject_images_names = os.listdir(subject_dir_path)
for image_name in subject_images_names:
image_path = subject_dir_path + '/' + image_name
image = cv2.imread(image_path)
if image is None:
continue
cv2.imshow('Training on image...', image)
cv2.waitKey(100)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
rect = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) # 检测人脸
for (x, y, w, h) in rect:
face = gray[y:y + w, x:x + h].astype(np.float32) # 数值转换
face = cv2.resize(face, (150, 150))
if face is not None:
face_vector = np.reshape(face, (1, -1))[0]
faces.append(face_vector)
labels.append(label)
faces = np.array(faces)
labels = np.array(labels)
return faces, labels
# 主程序
cap = cv2.VideoCapture(0)
stop = False
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
pca = PCA(n_components=60, svd_solver='full')
faces, labels = prepare_training_data('raw1')
faces = pca.fit_transform(faces)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
while not stop:
success, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face, rect = detect_face(img, face_cascade)
if not rect is None:
(x, y, w, h) = rect
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
c = cv2.waitKey(100)
subjects = ['xu', 'LU', 'ZHOU']
img1 = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rect = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
if not rect is None:
for (x, y, w, h) in rect:
face = gray[y:y + w, x:x + h].astype(np.float32) # 数值转换
face = cv2.resize(face, (150, 150))
face_pca = pca.transform(face.reshape(1, -1))
cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 255, 0), 2)
min_d = 1000000000000
c = -1
for i, f in enumerate(faces): # i,f是训练数据的信息,遍历训练数据
d = ((face_pca - f) ** 2).sum() # 计算test和训练图片的欧氏距离
if d < min_d:
min_d = d
c = labels[i] # 获得最小欧式距离,即最近邻
print(subjects[c])
cv2.putText(img1, subjects[c], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
cv2.imshow('test', img1)
cv2.imshow('img', img1)
cv2.waitKey(1)
if c & 0xFF == ord('q'):
stop = True
cv2.destroyAllWindows()
运行说明:
- 确保已经安装了OpenCV和sklearn库。
- 创建一个名为'raw1'的文件夹,并将训练数据图像按主题分类到该文件夹下,每个主题一个文件夹,文件夹名为主题标签,如'xu'、'LU'、'ZHOU'等。
- 运行代码,打开摄像头,系统将检测人脸并进行识别。
- 按'q'键退出程序。
注意:
- 'haarcascade_frontalface_alt.xml'和'haarcascade_frontalface_default.xml'是OpenCV人脸检测器文件,请确保它们在你的系统中可用。
- 训练数据的质量和数量对识别的准确率有很大影响。
- PCA参数n_components可以根据实际情况调整,它表示提取的特征数量,数量越多,识别精度可能越高,但计算量也会增加。
可能出现的问题:
- 摄像头没有成功连接或者没有被正确设置为默认的视频输入设备。您可以尝试检查摄像头是否连接并且在计算机设置中正确配置了摄像头。
- 人脸检测效果不好。您可以尝试调整人脸检测器的参数,如scaleFactor、minNeighbors、minSize等。
- 识别效果不好。您可以尝试增加训练数据,或者调整PCA参数。
代码解释:
detect_face(img, face_cascade)函数用于检测图像中的人脸。prepare_training_data(data_folder_path)函数用于准备训练数据,从图像中提取人脸特征并生成训练标签。- 主程序中,首先读取摄像头图像,然后进行人脸检测,再对检测到的人脸进行PCA特征提取,最后使用欧氏距离比较识别目标人脸。
总结:
本文介绍了使用Python实现基于PCA的人脸识别系统的基本方法。该方法简单易懂,便于快速入门。您可以在此基础上进行改进,以实现更强大的识别功能。
原文地址: http://www.cveoy.top/t/topic/mJJg 著作权归作者所有。请勿转载和采集!