[英]face recognition attendance system with opencv and dlib face_recognition libraries giving incorrect recognitions
所以我使用 opencv dlib 和 face_recognition 制作了一個人臉識別考勤系統,但由於某種原因 model 無法正確識別,例如當我使用網絡攝像頭在一幀中識別多個人時,它會不斷更改邊界框標簽,以此類推超過一個人的出席會被標記,因為盒子的標簽會不斷變化。 我嘗試使用不止一張圖片,比如每個人 30 張圖片,但仍然是同樣的問題,你能幫我理解為什么嗎?
這是我的代碼:
編碼.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()
網絡攝像頭識別.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)
文獻中有幾種最先進的模型,dlib resnet model 是其中之一,但不是唯一的。 您可以實時處理您的 web 凸輪 stream 並通過幾行代碼在 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 文件夾中的 web cam 上查找檢測到的面孔。 您應該將您的面部數據庫存儲在此文件夾中。 此外,您可以使用 model_name 變量更改人臉識別 model。 我添加了所有候選模型。 VGG-Face、FaceNet 和 Dlib 的表現優於其他方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.