如何用代码opencv训练人脸识别的精度
时间: 2023-11-19 15:32:04 浏览: 29
下面是一个基于OpenCV的人脸识别训练代码示例:
```
import cv2
import os
# 收集人脸数据集
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
data_path = 'face_data/'
subjects = ['subject1', 'subject2', 'subject3'] # 根据实际情况修改
for subject in subjects:
subject_path = data_path + subject
if not os.path.exists(subject_path):
os.makedirs(subject_path)
video_capture = cv2.VideoCapture(0)
count = 0
while True:
ret, img = video_capture.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE
)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
count += 1
cv2.imwrite(subject_path + '/face' + str(count) + '.jpg', gray[y:y+h, x:x+w])
cv2.imshow('Video', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
elif count >= 30:
break
video_capture.release()
cv2.destroyAllWindows()
# 数据预处理
def prepare_training_data(data_folder_path):
dirs = os.listdir(data_folder_path)
faces = []
labels = []
for dir_name in dirs:
if not dir_name.startswith('subject'):
continue
label = int(dir_name.replace('subject', ''))
subject_dir_path = data_folder_path + '/' + dir_name
subject_images_names = os.listdir(subject_dir_path)
for image_name in subject_images_names:
if image_name.startswith('.'):
continue
image_path = subject_dir_path + '/' + image_name
image = cv2.imread(image_path)
face, rect = detect_face(image)
if face is not None:
faces.append(face)
labels.append(label)
return faces, labels
# 特征提取
def detect_face(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE
)
if len(faces) == 0:
return None, None
(x, y, w, h) = faces[0]
return gray[y:y+w, x:x+h], faces[0]
# 模型训练
faces, labels = prepare_training_data('face_data')
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
# 模型测试
test_img = cv2.imread('test_img.jpg')
face, rect = detect_face(test_img)
label, confidence = face_recognizer.predict(face)
print('Predicted Label: {}, Confidence: {}'.format(label, confidence))
```
这段代码包含了人脸数据集的收集、数据预处理、特征提取、模型训练和模型测试等步骤,可以用于训练人脸识别模型并测试识别精度。其中,`prepare_training_data`函数用于从收集的人脸数据集中提取特征,`face_recognizer.train`用于训练识别模型,`predict`用于对测试图像进行识别。需要注意的是,训练数据集的质量和数量对识别精度有重要影响,需要根据实际情况进行调整。