| import os |
| import cv2 |
| from insightface.app import FaceAnalysis |
| import torch |
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
| class FaceRec: |
| def __init__(self): |
| self.foldername = '/home/emmanuel/Pictures/Webcam' |
| self.files = [] |
| self.embeds = [] |
| self.diff = [] |
| self.ground_mathches = [] |
| self.sampling = None |
| |
| |
|
|
| def folder(self, attempt=True, folder='/home/emmanuel/Pictures/Webcam'): |
| if attempt: |
| for file in os.listdir(folder): |
| self.files.append(file) |
|
|
| self.image_pair = list(zip(self.files[0:len(self.files)//2], self.files[len(self.files)//2:])) |
| print(self.image_pair) |
|
|
|
|
| else: |
| self.foldername = '/home/emmanuel/Pictures/webcam' |
| self.files = [] |
| self.folder(attempt=True, folder=self.foldername) |
| |
|
|
| |
| |
| def embeddings(self, image): |
| app = FaceAnalysis(name="buffalo_l", providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) |
| app.prepare(ctx_id=0, det_size=(640, 640)) |
| image1 = cv2.imread(image) |
| faces = app.get(image1) |
|
|
| faceid_embeds = torch.from_numpy(faces[0].normed_embedding).unsqueeze(0) |
| return(torch.Tensor(faceid_embeds)) |
|
|
|
|
|
|
| def face_embed(self, face, face1): |
| |
| face_encodings = self.embeddings(face) |
| face_encodings1 = self.embeddings(face1) |
| return(torch.nn.functional.cosine_similarity(face_encodings, face_encodings1)) |
| |
|
|
|
|
| def closeness(self): |
| self.embeds = [] |
| for faces in self.image_pair: |
| self.embeds.append(self.face_embed(self.foldername+'/'+faces[0], self.foldername+'/'+faces[1])) |
|
|
| return(0) |
| |
|
|
| def compare(self, attempt=True): |
| self.diff = [] |
| for diffs in list(zip(self.embeds[0:len(self.embeds)//2], self.embeds[len(self.embeds)//2:])): |
| self.diff.append(torch.nn.functional.pairwise_distance(diffs[0], diffs[1])) |
|
|
|
|
|
|
| |
| def expectation(self): |
| mean, std = torch.mean(torch.Tensor(self.diff[0:])), torch.std(torch.Tensor(self.diff[0:])) |
| distribute = torch.distributions.Normal(mean, std) |
| self.sampling = distribute.sample(sample_shape=(10,)) |
|
|
|
|
|
|
| def model(self): |
| self.closeness() |
| return(self.compare()) |
|
|
|
|
|
|
| def verify(self): |
| self.folder() |
| self.model() |
| self.expectation() |
| self.folder(attempt=False) |
| self.model() |
|
|
| fails = 0 |
| success = 0 |
| max_itter = 10 |
| while max_itter >= 0: |
| for samples in self.sampling: |
| if self.diff[0] <= samples: |
| success = success+1 |
| |
| else: |
| fails = fails+1 |
| |
| max_itter = max_itter-1 |
|
|
|
|
| if fails > success: |
| return(False) |
|
|
| else: |
| return(True) |
|
|
|
|
| |
|
|
|
|
|
|
| Recognition = FaceRec() |
| print(Recognition.verify()) |
|
|
|
|