Spaces:
Sleeping
Sleeping
File size: 1,635 Bytes
6cffbb3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import cv2
import dlib
import glob
import numpy as np
import torch
import streamlit as st
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("scripts/shape_predictor_68_face_landmarks_GTX.dat")
def extract_lip_coordinates(detector, predictor, img_path):
image = cv2.imread(img_path)
image = cv2.resize(image, (600, 500))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rects = detector(gray)
retries = 3
while retries > 0:
try:
assert len(rects) == 1
break
except AssertionError as e:
retries -= 1
for rect in rects:
# apply the shape predictor to the face ROI
shape = predictor(gray, rect)
x = []
y = []
for n in range(48, 68):
x.append(shape.part(n).x)
y.append(shape.part(n).y)
return [x, y]
@st.cache_data(show_spinner=False, persist=True)
def generate_lip_coordinates(frame_images_directory):
frames = glob.glob(frame_images_directory + "/*.jpg")
frames.sort()
img = cv2.imread(frames[0])
height, width, layers = img.shape
coords = []
for frame in frames:
x_coords, y_coords = extract_lip_coordinates(detector, predictor, frame)
normalized_coords = []
for x, y in zip(x_coords, y_coords):
normalized_x = x / width
normalized_y = y / height
normalized_coords.append((normalized_x, normalized_y))
coords.append(normalized_coords)
coords_array = np.array(coords, dtype=np.float32)
coords_array = torch.from_numpy(coords_array)
return coords_array
|