Created
August 17, 2021 02:11
-
-
Save cunhafh/fab576cd9ef964b5ad678ed10c0bd8e5 to your computer and use it in GitHub Desktop.
Celebrity doppelganger inference
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import cv2 | |
import numpy as np | |
import dlib | |
# Load the descriptors | |
descriptors = np.load(r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger\descriptors.npy", | |
allow_pickle=True) | |
# Rearrange data, each 128 items corresponds to one image descriptor | |
faceDescriptorsEnrolled = np.reshape(descriptors, (13110, 128)) | |
# Load test image | |
im = cv2.imread(r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger\TestImages\Amanda.png") | |
# Path to landmarks and face recognition model files | |
PREDICTOR_PATH = r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger\DlibFacialLandmarkDetector" \ | |
r"\shape_predictor_68_face_landmarks.dat " | |
FACE_RECOGNITION_MODEL_PATH = r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger" \ | |
r"\DlibFaceRecognitionModel\dlib_face_recognition_resnet_model_v1.dat " | |
# Initialize face detector, facial landmarks detector and face recognizer | |
faceDetector = dlib.get_frontal_face_detector() | |
shapePredictor = dlib.shape_predictor(PREDICTOR_PATH) | |
faceRecognizer = dlib.face_recognition_model_v1(FACE_RECOGNITION_MODEL_PATH) | |
# detect faces in image | |
faces = faceDetector(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) | |
# Now process each face we found | |
for face in faces: | |
# Find facial landmarks for each detected face | |
shape = shapePredictor(cv2.cvtColor(im, cv2.COLOR_BGR2RGB), face) | |
# find coordinates of face rectangle | |
x1 = face.left() | |
y1 = face.top() | |
x2 = face.right() | |
y2 = face.bottom() | |
# Compute face descriptor using neural network defined in Dlib using facial landmark shape | |
faceDescriptor = faceRecognizer.compute_face_descriptor(im, shape) | |
# Convert face descriptor from Dlib's format to list, then a NumPy array | |
faceDescriptorList = [m for m in faceDescriptor] | |
faceDescriptorNdarray = np.asarray(faceDescriptorList, dtype=np.float64) | |
faceDescriptorNdarray = faceDescriptorNdarray[np.newaxis, :] | |
distances = np.linalg.norm(faceDescriptorsEnrolled - faceDescriptorNdarray, axis=1) | |
# Calculate minimum distance and index of this face | |
argmin = np.argmin(distances) # index | |
minDistance = distances[argmin] # minimum distance | |
print("The distance between the input and the celebrity images is: {}".format(minDistance)) | |
# Opening celebrity names file | |
txtFile = open(r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger\ListOfCelebNames\celebNames.txt", "r") | |
celebNames = [] | |
for line in txtFile: | |
stripped_line = line.strip() | |
line_list = stripped_line.split() | |
celebNames.append(line_list) | |
txtFile.close() | |
# Your celeb doppelganger | |
celebName = celebNames[argmin][0] | |
print("Your celebrity doppelganger is {}".format(celebName)) | |
celebrityImFilePath = os.path.join(r"C:\Users\felipe.cunha\Documents\venv\cv2\CelebrityDoppelganger\vgg_face_dataset" | |
r"\files", | |
str(celebName + ".txt")) | |
cv2.imshow("Input image", im) | |
cv2.waitKey(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment