Spaces:
Running
Running
import cv2 | |
import numpy as np | |
from skimage.feature import local_binary_pattern | |
import matplotlib.pyplot as plt | |
import dlib | |
import imutils | |
import os | |
from PIL import Image | |
def compute_face_simplicity(image): | |
######## create if or depending on input - filepath or PIL file | |
# Load the image from a filepath | |
# image = cv2.imread(image_path) | |
# Convert RGB to BGR format (OpenCV uses BGR while PIL uses RGB) | |
image_np = np.array(image) | |
image = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR) | |
# Resize the image | |
image = imutils.resize(image, width=800) | |
# Convert to grayscale | |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
detector = dlib.get_frontal_face_detector() | |
predictor = dlib.shape_predictor("models/face_alignment/shape_predictor_68_face_landmarks.dat") | |
# Detect the face in the image | |
faces = detector(gray, 1) | |
if len(faces) == 0: | |
return "No face detected." | |
x, y, w, h = (faces[0].left(), faces[0].top(), faces[0].width(), faces[0].height()) | |
face_img = gray[y:y+h, x:x+w] | |
# Parameters for LBP | |
radius = 1 | |
n_points = 8 * radius | |
# Apply LBP to the face region | |
lbp = local_binary_pattern(face_img, n_points, radius, method="uniform") | |
# Compute the histogram of the LBP | |
hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), range=(0, n_points + 2)) | |
# Measure the variance of the histogram | |
variance = np.var(hist) | |
std = np.sqrt(variance) | |
print(std) | |
# A hypothetical threshold - needs calibration | |
threshold = 10000 | |
if std < threshold: | |
simplicity = "Simple" | |
else: | |
simplicity = "Complex" | |
# Visualizing the LBP pattern on the detected face | |
# plt.imshow(lbp) | |
lbp = (lbp * 255).astype(np.uint8) | |
lbp = Image.fromarray(lbp) | |
return lbp #, simplicity | |
if __name__ == "__main__": | |
print(os.getcwd()) | |
detector = dlib.get_frontal_face_detector() | |
predictor = dlib.shape_predictor("models/face_alignment/shape_predictor_68_face_landmarks.dat") | |
print(predictor) | |
image_path = 'data/images_symmetry/gigi_hadid.webp' | |
print(compute_face_simplicity(image_path)) | |