带有opencv和dlib人脸识别库的人脸识别考勤系统提供错误识别

2024-04-16 22:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我使用opencv dlib和face_recognition制作了一个人脸识别考勤系统,但由于某些原因,该模型无法进行正确的识别,例如,当我使用网络摄像头在一帧中识别多个人时,它会不断更改边界框标签,从而标记多人的考勤,因为盒子的标签一直在变化。我试着用了不止一张图片,比如每个人30张图片,但还是一样的问题,你能帮我理解为什么吗

这是我的密码:

encodings.py

import cv2
import face_recognition
import numpy as np
import os
from datetime import datetime
from imutils import paths
import pickle

path='./imageAttendance'
imagePaths= list(paths.list_images(path))

knownEncodings=[]
knownNames=[]

for (i, imagePath) in enumerate(imagePaths):
    print("[INFO] processing image {}/{}".format(i + 1,
                                                 len(imagePaths)))
    name= imagePath.split(os.path.sep)[-2]
    image= cv2.imread(imagePath)
    rgb= cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    boxes= face_recognition.face_locations(rgb, model='cnn')
    encodings= face_recognition.face_encodings(rgb, boxes)

    for encoding in encodings:
        knownEncodings.append(encoding)
        knownNames.append(name)

print("[INFO] serializing encodings...")
data={'encodings': knownEncodings, 'names': knownNames}
f= open('encodings.pickle', 'wb')
f.write(pickle.dumps(data))
f.close()

webcam-recognition.py

import face_recognition
import argparse
import pickle
import cv2
from datetime import datetime

print("[INFO] loading encodings...")
data= pickle.loads(open('encodings.pickle', 'rb').read())

def mark_attendance(n):
    with open('attendance.csv', 'r+') as f:
        myDataList= f.readlines()
        print(myDataList)
        nameList=[]
        for line in myDataList:
            name= line.split(',')[0]
            nameList.append(name)

        if n not in nameList:
            now= datetime.now()
            dtString= now.strftime('%H:%M:%S')
            f.writelines(f'\n{n},{dtString}')

cap= cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    # img = captureScreen()
    image = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    print("[INFO] recognizing faces...")
    boxes = face_recognition.face_locations(rgb,
                                            model='cnn')
    encodings = face_recognition.face_encodings(rgb, boxes)
    names = []

    for encoding in encodings:
        matches = face_recognition.compare_faces(data['encodings'], encoding)
        name = 'Unknown'

        if True in matches:
            matchedIdxs = [i for (i, b) in enumerate(matches) if b]
            counts = {}

            for i in matchedIdxs:
                name = data['names'][i]
                counts[name] = counts.get(name, 0) + 1

            name = max(counts, key=counts.get)

        names.append(name)
    for ((top, right, bottom, left), name) in zip(boxes, names):
        cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
        y = top - 15 if top - 15 > 15 else top + 15
        cv2.putText(image, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
                    0.75, (0, 255, 0), 2)
        mark_attendance(name)

    cv2.imshow('Webcam', image)
    cv2.waitKey(1)

Tags: nameinimageimportfordatadatetimergb
1条回答
网友
1楼 · 发布于 2024-04-16 22:34:07

文献中有几种最先进的模型,dlib resnet模型就是其中之一,但不是唯一的模型。您可以实时处理您的网络摄像头流,并使用几行代码在deepface中应用人脸识别

#!pip install deepface
from deepface import DeepFace

models = ['VGG-Face', 'Facenet', 'OpenFace', 'DeepFace', 'DeepID', 'Dlib']
DeepFace.stream(db_path = 'C:/my_db', model_name = models[0], enable_face_analysis = False)

它将在my_db文件夹中的网络摄像头上查找检测到的人脸。您应该将人脸数据库存储在此文件夹中。此外,您可以使用model_name变量更改人脸识别模型。我添加了所有候选模型。VGG Face、FaceNet和Dlib的表现优于其他产品

相关问题 更多 >