77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
import cv2
 | 
						|
import face_recognition
 | 
						|
import os
 | 
						|
import numpy as np
 | 
						|
import pickle 
 | 
						|
datasetPath = "dataset"
 | 
						|
images = []
 | 
						|
classNames = []
 | 
						|
lisFileTrain = os.listdir(datasetPath)
 | 
						|
 | 
						|
for file in lisFileTrain:
 | 
						|
    currentImg = cv2.imread(f"{datasetPath}/{file}")
 | 
						|
    images.append(currentImg)
 | 
						|
    classNames.append(os.path.splitext(file)[0].split('_')[0])
 | 
						|
 | 
						|
print(len(images))
 | 
						|
 | 
						|
def encodeImgs(images, save_path="encodings.pkl"):
 | 
						|
    if os.path.exists(save_path):
 | 
						|
        print(f"Loading encodings from {save_path}...")
 | 
						|
        with open(save_path, "rb") as f:
 | 
						|
            return pickle.load(f)
 | 
						|
        
 | 
						|
    encodeList = []
 | 
						|
    for i, img in enumerate(images):
 | 
						|
        print(i+1)
 | 
						|
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 | 
						|
        encode = face_recognition.face_encodings(img)
 | 
						|
       
 | 
						|
        if encode:  # Check if encodings list is not empty
 | 
						|
            encodeList.append(encode[0])
 | 
						|
        else:
 | 
						|
            print("No face detected in an image. Skipping...")
 | 
						|
            os.remove(f"{datasetPath}/{lisFileTrain[i]}")
 | 
						|
    # Lưu encodeList vào file
 | 
						|
    print(f"Saving encodings to {save_path}...")
 | 
						|
    with open(save_path, "wb") as f:
 | 
						|
        pickle.dump(encodeList, f)
 | 
						|
 | 
						|
    return encodeList
 | 
						|
 | 
						|
encodeListKnow = encodeImgs(images)
 | 
						|
print("Load data success")
 | 
						|
print(len(encodeListKnow))
 | 
						|
 | 
						|
cap = cv2.VideoCapture(0)
 | 
						|
 | 
						|
while True:
 | 
						|
    ret, frame = cap.read()
 | 
						|
    frameS = cv2.resize(frame, (0,0), None, fx=1, fy=1)
 | 
						|
    frameS = cv2.cvtColor(frameS, cv2.COLOR_BGR2RGB)
 | 
						|
 | 
						|
    faceCurFrame = face_recognition.face_locations(frameS)
 | 
						|
    encodeCurFrame = face_recognition.face_encodings(frameS)
 | 
						|
 | 
						|
    for encodeFace, faceLoc in zip(encodeCurFrame, faceCurFrame):
 | 
						|
        matches = face_recognition.compare_faces(encodeListKnow, encodeFace)
 | 
						|
        faceDis = face_recognition.face_distance(encodeListKnow, encodeFace)
 | 
						|
        print(faceDis)
 | 
						|
        matchIndex = np.argmin(faceDis)
 | 
						|
 | 
						|
        if faceDis[matchIndex] < 0.3:
 | 
						|
            name = classNames[matchIndex].upper()
 | 
						|
        else:
 | 
						|
            name = "Unknow"
 | 
						|
        
 | 
						|
        y1, x2, y2, x1 = faceLoc
 | 
						|
        y1, x2, y2, x1 = y1, x2, y2, x1
 | 
						|
        cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2)
 | 
						|
        cv2.putText(frame, name + f"({(1 - round(faceDis[matchIndex], 2))*100}%)", (x2, y2), cv2.FONT_HERSHEY_COMPLEX, 1, (255,255,255), 2)
 | 
						|
    cv2.imshow('Face decting', frame)
 | 
						|
 | 
						|
    if cv2.waitKey(1) == ord("q"):
 | 
						|
        break
 | 
						|
 | 
						|
cap.release()
 | 
						|
cv2.destroyAllWindows() |