Vis*_*aju 5 python opencv face-recognition
我自己有一个数据集。
当我走向相机时,我的代码完美运行。但我再次与未知的人进行测试,程序再次预测为我。它应该返回-1或null!
我在 python3 和 opencv 的最新版本 cv2 中运行。
->探测器.py
import cv2,os
import numpy as np
from PIL import Image
import pickle,time
# Root directory
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
recognizer = cv2.face.LBPHFaceRecognizer_create()#cv2.createLBPHFaceRecognizer()
recognizer.read('trainer/trainer.yml')
cascadePath = "Classifiers/face.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
path = 'dataSet'
cam = cv2.VideoCapture(0)
print(cam.isOpened())
#font = cv2.InitFont(cv2.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 1)
#Creates a font
font = cv2.FONT_HERSHEY_SIMPLEX
while True:
ret, im =cam.read()
print('im: ',im,' ;ROOT_DIR:',ROOT_DIR)
print('ret: ',ret)
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces=faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100), flags=cv2.CASCADE_SCALE_IMAGE)
for(x,y,w,h) in faces:
nbr_predicted, conf = recognizer.predict(gray[y:y+h,x:x+w])
cv2.rectangle(im,(x-50,y-50),(x+w+50,y+h+50),(225,0,0),2)
print("nbr_predicted: ",nbr_predicted)
if(nbr_predicted==7 or nbr_predicted==8):
nbr_predicted='Vishesh 1'
else:
nbr_predicted="Unknown Person"
cv2.putText(im,str(nbr_predicted)+"--"+str(conf), (x,y+h),font, 0.8, (0, 255, 0), 2, cv2.LINE_AA) #Draw the text
cv2.imshow('im',im)
cv2.waitKey(10)
Run Code Online (Sandbox Code Playgroud)
只有中间的那个人一定是维什什。但即使是我的兄弟也被预测为维舍什。这可能哪里出了问题?
小智 1
ecognizer.predict(gray[y:y+h,x:x+w]) 返回预测索引,该索引显示训练集中人员的数量以及训练集中所有人员的置信度(具有置信值)。由于您的照片是训练集中唯一的一张照片,因此它返回的 nbr_predicted 始终是您的 ID,而置信度则显示发送到预测函数的图像是您的“概率”。因此将您的代码更新为:
if(nbr_predicted==7 and conf<120):
nbr_predicted='Vishesh 1'
else:
nbr_predicted="Unknown Person"
Run Code Online (Sandbox Code Playgroud)
置信度的值通常取决于您的数据,但越低越好。你应该调整阈值