最近在做一个opencv的人脸检测算法,一开始还挺顺利的。我上传了 4 张我自己的 JPG(在一个有我名字的文件夹中),它认出我是我自己。我也尝试添加我兄弟的 4 张照片(在一个单独的文件夹中,上面写着他的名字),这很奇怪,把他认成了我而不是他。然后我删除了我的文件夹,这样只有他的文件夹里有图像。我很快尝试诊断问题,这是因为我的代码没有检测到他照片中的人脸(我打印的 x_train 的长度为 0)。我进行了一些谷歌搜索,这些照片似乎满足了检测人脸的所有“要求”;所以现在我想知道为什么这不起作用。
import os
from PIL import Image
import numpy
import pickle
import cv2
face_cascade = cv2.CascadeClassifier('Cascades/data/haarcascade_frontalface_alt2.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
base_dir = os.path.dirname(os.path.abspath(__file__))
img_dir = os.path.join(base_dir, "images")
curr_id = 0
label_ids = {}
y_labels = []
x_train = []
for root, dirs, files in os.walk(img_dir):
for file in files:
if file.endswith("png") or file.endswith("jpg"):
path = os.path.join(root, file)
label = os.path.basename(root).replace(" ", "-").lower()
if not label in label_ids:
label_ids[label] = curr_id
curr_id += 1
id = label_ids[label]
pil_image = Image.open(path).convert("L")
image_array = numpy.array(pil_image, "uint8")
final_image = cv2.resize(image_array, (550, 550), interpolation=cv2.INTER_AREA)
equalized_image = cv2.equalizeHist(final_image)
final_image = cv2.normalize(final_image, numpy.zeros((300, 300)), 0, 255, cv2.NORM_MINMAX)
faces = face_cascade.detectMultiScale(image_array, scaleFactor = 1.1, minNeighbors = 10)
for (x, y, width, height) in faces:
roi = image_array[y:y+height, x:x+width]
x_train.append(roi)
y_labels.append(id)
print(len(x_train))
with open("labels.pickle", "wb") as f:
pickle.dump(label_ids, f)
recognizer.train(x_train, numpy.array(y_labels))
recognizer.save("trainer.yml")
我也遇到了这个错误: 追溯(最近一次通话): 文件“d:\ProgrammingProjects\Python\FacialRegognition aces-train.py”,第 57 行,位于 recognizer.train(x_train, numpy.array(y_labels)) cv2.error: OpenCV(4.7.0) D: \opencv-python\opencv-python\opencv_contrib\modules ace\src\lbph_faces.cpp:362: error: (-210:Unsupported format or combination of formats) 空训练给出了数据。您将需要多个样本来学习模型。在函数'cv::face::LBPH::train'中
当它认出他是我时,我试图删除有我照片的文件夹,并希望它能认出他是他,然而,它开始抛出错误,我意识到它没有检测到他照片中的脸。