Skip to content

Instantly share code, notes, and snippets.

@cunhafh
Created August 17, 2021 02:11
Show Gist options
  • Save cunhafh/fab576cd9ef964b5ad678ed10c0bd8e5 to your computer and use it in GitHub Desktop.
Save cunhafh/fab576cd9ef964b5ad678ed10c0bd8e5 to your computer and use it in GitHub Desktop.
Celebrity doppelganger inference
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