added faces classifying

This commit is contained in:
2026-09-25 09:25:41 +02:00
parent 0ab66b5352
commit b1170c3ecf
3 changed files with 66 additions and 7 deletions
+28
View File
@@ -0,0 +1,28 @@
from face_recognition import *
def classify_faces(faces, threshold:float = 0.65):
# classify each faces
res = {}
for face in faces:
score = 0
max_score = 0
nearest_person = None
for person, faces in res.items():
for face2 in faces:
score += is_same_face(face.img, face2.img)
score /= len(faces)
if score > max_score:
nearest_person = person
max_score = score
if max_score > threshold:
res[nearest_person].append(face)
else:
res[f"persone_{len(res)}"] = [face]
return res
+18 -1
View File
@@ -7,7 +7,7 @@ def extract_faces(faces_data:list, img:list, filename:str):
recognizer = Recognizer.get() recognizer = Recognizer.get()
res = [] res = []
for i in range(1, len(faces_data[1])): for i in range(len(faces_data[1])):
face_data = faces_data[1][i] face_data = faces_data[1][i]
croped_img = recognizer.alignCrop(img, face_data) croped_img = recognizer.alignCrop(img, face_data)
@@ -34,3 +34,20 @@ def is_same_face(
l2_score = recognizer.match(faces1_features, faces2_features, cv2.FaceRecognizerSF_FR_NORM_L2) l2_score = recognizer.match(faces1_features, faces2_features, cv2.FaceRecognizerSF_FR_NORM_L2)
return cosine_score >= cosine_similarity_threshold and l2_score <= l2_similarity_threshold return cosine_score >= cosine_similarity_threshold and l2_score <= l2_similarity_threshold
def similarity_score(
face1_img:list,
face2_img:list,
cosine_similarity_threshold:float = 0.363,
l2_similarity_threshold:float = 1.128
) -> bool:
recognizer = Recognizer.get()
faces1_features = recognizer.feature(face1_img)
faces2_features = recognizer.feature(face2_img)
cosine_score = recognizer.match(faces1_features, faces2_features, cv2.FaceRecognizerSF_FR_COSINE)
l2_score = recognizer.match(faces1_features, faces2_features, cv2.FaceRecognizerSF_FR_NORM_L2)
return (int(cosine_score >= cosine_similarity_threshold) + int(l2_score <= l2_similarity_threshold)) / 2
+19 -5
View File
@@ -4,10 +4,13 @@ import os
from utils import * from utils import *
from face_detection import * from face_detection import *
from face_recognition import * from face_recognition import *
from face_classifying import *
# list all files in data/raw # list all files in data/raw
files = list_all_files("./data/raw", ["jpg", "webp"]) files = list_all_files("./data/raw", ["jpg", "webp"])
print(files)
# process each files # process each files
faces = [] faces = []
for file_path in files: for file_path in files:
@@ -23,12 +26,23 @@ for file_path in files:
# detect faces file # detect faces file
faces_data = detect_face_in_image(img, scale=1) faces_data = detect_face_in_image(img, scale=1)
print("faces_data: ", faces_data[1])
# extract faces from file # extract faces from file
faces += extract_faces(faces_data, img, filename) extracted_faces = extract_faces(faces_data, img, filename)
# classify each faces faces += extracted_faces
for face in faces:
face.save("./data/extracted") classified_faces = classify_faces(faces)
# saving result by folders
for person, faces in classified_faces.items():
dir_ = f"./data/results/{person}/"
if not os.path.exists(dir_):
os.makedirs(dir_)
for face in faces:
face.save(dir_)
print("classified_faces: ", classified_faces)
cv2.destroyAllWindows() cv2.destroyAllWindows()