Spaces:
Running
Running
File size: 4,316 Bytes
cbd515b 7d4ee5a cbd515b |
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
###
'''
!git clone https://huggingface.co/spaces/radames/SPIGA-face-alignment-headpose-estimator
!cp -r SPIGA-face-alignment-headpose-estimator/SPIGA .
!pip install -r SPIGA/requirements.txt
!pip install datasets
!pip install retinaface-py>=0.0.2
!huggingface-cli login
'''
import sys
sys.path.insert(0, "SPIGA")
import numpy as np
from datasets import load_dataset
from spiga.inference.config import ModelConfig
from spiga.inference.framework import SPIGAFramework
processor = SPIGAFramework(ModelConfig("300wpublic"))
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.path import Path
import PIL
def get_patch(landmarks, color='lime', closed=False):
contour = landmarks
ops = [Path.MOVETO] + [Path.LINETO]*(len(contour)-1)
facecolor = (0, 0, 0, 0) # Transparent fill color, if open
if closed:
contour.append(contour[0])
ops.append(Path.CLOSEPOLY)
facecolor = color
path = Path(contour, ops)
return patches.PathPatch(path, facecolor=facecolor, edgecolor=color, lw=4)
# Draw to a buffer.
def conditioning_from_landmarks(landmarks, size=512):
# Precisely control output image size
dpi = 72
fig, ax = plt.subplots(1, figsize=[size/dpi, size/dpi], tight_layout={'pad':0})
fig.set_dpi(dpi)
black = np.zeros((size, size, 3))
ax.imshow(black)
face_patch = get_patch(landmarks[0:17])
l_eyebrow = get_patch(landmarks[17:22], color='yellow')
r_eyebrow = get_patch(landmarks[22:27], color='yellow')
nose_v = get_patch(landmarks[27:31], color='orange')
nose_h = get_patch(landmarks[31:36], color='orange')
l_eye = get_patch(landmarks[36:42], color='magenta', closed=True)
r_eye = get_patch(landmarks[42:48], color='magenta', closed=True)
outer_lips = get_patch(landmarks[48:60], color='cyan', closed=True)
inner_lips = get_patch(landmarks[60:68], color='blue', closed=True)
ax.add_patch(face_patch)
ax.add_patch(l_eyebrow)
ax.add_patch(r_eyebrow)
ax.add_patch(nose_v)
ax.add_patch(nose_h)
ax.add_patch(l_eye)
ax.add_patch(r_eye)
ax.add_patch(outer_lips)
ax.add_patch(inner_lips)
plt.axis('off')
fig.canvas.draw()
buffer, (width, height) = fig.canvas.print_to_buffer()
#assert width == height
#assert width == size
buffer = np.frombuffer(buffer, np.uint8).reshape((height, width, 4))
buffer = buffer[:, :, 0:3]
plt.close(fig)
return PIL.Image.fromarray(buffer)
import retinaface
import spiga.demo.analyze.track.retinasort.config as cfg
config = cfg.cfg_retinasort
device = "cpu"
face_detector = retinaface.RetinaFaceDetector(model=config['retina']['model_name'],
device=device,
extra_features=config['retina']['extra_features'],
cfg_postreat=config['retina']['postreat'])
import cv2
Image = PIL.Image
import os
def single_pred_features(image):
if type(image) == type("") and os.path.exists(image):
image = Image.open(image).convert("RGB")
elif hasattr(image, "shape"):
image = Image.fromarray(image).convert("RGB")
else:
image = image.convert("RGB")
image = image.resize((512, 512))
cv2_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
face_detector.set_input_shape(image.size[1], image.size[0])
features = face_detector.inference(image)
if features:
bboxes = features['bbox']
bboxes_n = []
for bbox in bboxes:
x1, y1, x2, y2 = bbox[:4]
bbox_wh = [x1, y1, x2-x1, y2-y1]
bboxes_n.append(bbox_wh)
face_features = processor.inference(cv2_image, bboxes_n)
landmarks = face_features["landmarks"][0]
face_features["spiga"] = landmarks
face_features['spiga_seg'] = conditioning_from_landmarks(landmarks)
return face_features
if __name__ == "__main__":
from datasets import load_dataset, Dataset
ds = load_dataset("svjack/facesyntheticsspigacaptioned_en_zh_1")
dss = ds["train"]
xiangbaobao = PIL.Image.open("babyxiang.png")
out = single_pred_features(xiangbaobao.resize((512, 512)))
out["spiga_seg"]
out = single_pred_features(dss[0]["image"])
out["spiga_seg"]
|