Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/main/utils/inference/masks.py
Views: 792
import numpy as np1import cv2234def expand_eyebrows(lmrks, eyebrows_expand_mod=1.0):56lmrks = np.array( lmrks.copy(), dtype=np.int32 )78# Top of the eye arrays9bot_l = lmrks[[35, 41, 40, 42, 39]]10bot_r = lmrks[[89, 95, 94, 96, 93]]1112# Eyebrow arrays13top_l = lmrks[[43, 48, 49, 51, 50]]14top_r = lmrks[[102, 103, 104, 105, 101]]1516# Adjust eyebrow arrays17lmrks[[43, 48, 49, 51, 50]] = top_l + eyebrows_expand_mod * 0.5 * (top_l - bot_l)18lmrks[[102, 103, 104, 105, 101]] = top_r + eyebrows_expand_mod * 0.5 * (top_r - bot_r)19return lmrks202122def get_mask(image: np.ndarray, landmarks: np.ndarray) -> np.ndarray:23"""24Get face mask of image size using given landmarks of person25"""2627img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)28mask = np.zeros_like(img_gray)2930points = np.array(landmarks, np.int32)31convexhull = cv2.convexHull(points)32cv2.fillConvexPoly(mask, convexhull, 255)3334return mask353637def face_mask_static(image: np.ndarray, landmarks: np.ndarray, landmarks_tgt: np.ndarray, params = None) -> np.ndarray:38"""39Get the final mask, using landmarks and applying blur40"""41if params is None:4243left = np.sum((landmarks[1][0]-landmarks_tgt[1][0], landmarks[2][0]-landmarks_tgt[2][0], landmarks[13][0]-landmarks_tgt[13][0]))44right = np.sum((landmarks_tgt[17][0]-landmarks[17][0], landmarks_tgt[18][0]-landmarks[18][0], landmarks_tgt[29][0]-landmarks[29][0]))4546offset = max(left, right)4748if offset > 6:49erode = 1550sigmaX = 1551sigmaY = 1052elif offset > 3:53erode = 1054sigmaX = 1055sigmaY = 856elif offset < -3:57erode = -558sigmaX = 559sigmaY = 1060else:61erode = 562sigmaX = 563sigmaY = 56465else:66erode = params[0]67sigmaX = params[1]68sigmaY = params[2]6970if erode == 15:71eyebrows_expand_mod=2.772elif erode == -5:73eyebrows_expand_mod=0.574else:75eyebrows_expand_mod=2.076landmarks = expand_eyebrows(landmarks, eyebrows_expand_mod=eyebrows_expand_mod)7778mask = get_mask(image, landmarks)79mask = erode_and_blur(mask, erode, sigmaX, sigmaY, True)8081if params is None:82return mask/255, [erode, sigmaX, sigmaY]8384return mask/255858687def erode_and_blur(mask_input, erode, sigmaX, sigmaY, fade_to_border = True):88mask = np.copy(mask_input)8990if erode > 0:91kernel = np.ones((erode, erode), 'uint8')92mask = cv2.erode(mask, kernel, iterations=1)9394else:95kernel = np.ones((-erode, -erode), 'uint8')96mask = cv2.dilate(mask, kernel, iterations=1)9798if fade_to_border:99clip_size = sigmaY * 2100mask[:clip_size,:] = 0101mask[-clip_size:,:] = 0102mask[:,:clip_size] = 0103mask[:,-clip_size:] = 0104105mask = cv2.GaussianBlur(mask, (0, 0), sigmaX = sigmaX, sigmaY = sigmaY)106107return mask108109110