hysts's picture
hysts HF Staff
Update
7430609
#!/usr/bin/env python
import pathlib
import cv2
import face_alignment
import gradio as gr
import numpy as np
import torch
DESCRIPTION = "# [face-alignment](https://github.com/1adrianb/face-alignment)"
MAX_IMAGE_SIZE = 1800
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
detector = face_alignment.FaceAlignment(face_alignment.LandmarksType.TWO_D, device=device.type)
def detect(image: np.ndarray) -> np.ndarray:
landmarks, _, boxes = detector.get_landmarks(image, return_bboxes=True)
if landmarks is None:
return image
res = image.copy()
for pts, box in zip(landmarks, boxes, strict=False):
box_int = np.round(box[:4]).astype(int)
cv2.rectangle(res, tuple(box_int[:2]), tuple(box_int[2:]), (0, 255, 0), 2)
tl = pts.min(axis=0)
br = pts.max(axis=0)
size = (br - tl).max()
radius = max(2, int(3 * size / 256))
for pt in np.round(pts).astype(int):
cv2.circle(res, tuple(pt), radius, (0, 255, 0), cv2.FILLED)
return res
image_paths = sorted(pathlib.Path("images").glob("*.jpg"))
examples = [[path.as_posix()] for path in image_paths]
with gr.Blocks(css_paths="style.css") as demo:
gr.Markdown(DESCRIPTION)
with gr.Row():
with gr.Column():
image = gr.Image(label="Input", type="numpy")
run_button = gr.Button()
with gr.Column():
output = gr.Image(label="Output")
gr.Examples(
examples=examples,
inputs=image,
outputs=output,
fn=detect,
)
run_button.click(
fn=detect,
inputs=image,
outputs=output,
)
if __name__ == "__main__":
demo.launch()