import numpy as np
import cv2
import os
from sklearn.model_selection import train_test_split
def open_img(path_):
# 图片
img_list = []
# 各图片对应的人名
labels_ = []
# 仅人名(无重复)
label = []
for file in os.listdir(path_):
if file == '.anonr' or file == '.htaccess':
continue
label.append(file)
position = path_+'/'+file
for parent, dirnames, filenames in os.walk(position):
for filename in filenames:
if filename == '.htaccess':
continue
labels_.append(len(label)-1)
img = cv2.imread(position+'/'+filename, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (250, 350))
img_list.append(img)
return img_list, labels_
def train_and_test(img_list, labels_):
x_train, x_test, y_train, y_test = train_test_split(img_list, np.array(labels_),
test_size=0.3, random_state=42, stratify=np.array(labels))
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(x_train, y_train)
right = 0
false = 0
for cnt in range(len(y_test)):
test_label = recognizer.predict(x_test[cnt])
if (test_label == y_test[cnt]).any():
right += 1
else:
false += 1
return right/(right+false)
if __name__ == '__main__':
path = "../faces"
imgList, labels = open_img(path)
print('人脸识别的准确率为:', train_and_test(imgList, labels))