Spaces:
Sleeping
Sleeping
import cv2 | |
from mtcnn.mtcnn import MTCNN | |
import numpy as np | |
def load_image(filename): | |
"""Load an image from a file path.""" | |
img = cv2.imread(filename) | |
return cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
def normalize(img): | |
"""Normalize the given image array.""" | |
mean, std = img.mean(), img.std() | |
return (img - mean) / std | |
def detect_faces_with_mtcnn(img): | |
"""Detect faces in an image using MTCNN.""" | |
detector = MTCNN() | |
bounding_boxes = [] | |
detected_faces = detector.detect_faces(img) | |
for detected_face in detected_faces: | |
bounding_boxes.append(detected_face["box"]) | |
return bounding_boxes | |
# Crops out parts of an image based on a list of bounding | |
# boxes. The cropped faces are also resized to 160x160 in | |
# preparation for passing it to FaceNet to compute the | |
# face embeddings. | |
# | |
def crop_faces_to_160x160(img, bounding_boxes): | |
"""Crop faces from an image based on detections.""" | |
cropped_faces = [] | |
for (x,y,w,h) in bounding_boxes: | |
cropped_face = img[y:y+h, x:x+w] | |
normalize(cropped_face) | |
cropped_face = cv2.resize(cropped_face, (160, 160), interpolation=cv2.INTER_CUBIC) | |
cropped_faces.append(cropped_face) | |
return np.array(cropped_faces) | |
# Extract cropped user face image | |
# | |
def get_user_cropped_image_from_photo(filename): | |
# Load the image. | |
#...# | |
img = load_image(filename) | |
# Detect faces and extract all bounding boxes | |
#...# | |
bounding_boxes = detect_faces_with_mtcnn(img) | |
# Crop out the faces from the image | |
#...# | |
cropped_faces = crop_faces_to_160x160(img, bounding_boxes) | |
if cropped_faces.shape[0] == 0: | |
return | |
# Take the image of only the first detected face | |
#...# | |
cropped_face = cropped_faces[0:1, :, :, :] | |
# Get the face embeddings using FaceNet and return | |
# the results. | |
#...# | |
return cropped_face[0] | |