|
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()) |
|
|
|
|