Spaces:
Sleeping
Sleeping
| # services/face_service.py | |
| import os, base64, cv2, numpy as np | |
| os.environ.setdefault("HOME", "/workspace") | |
| os.environ.setdefault("INSIGHTFACE_HOME", "/workspace/cache/insightface") | |
| os.environ.setdefault("MPLCONFIGDIR", "/workspace/cache/matplotlib") | |
| os.makedirs(os.environ["INSIGHTFACE_HOME"], exist_ok=True) | |
| os.makedirs(os.environ["MPLCONFIGDIR"], exist_ok=True) | |
| from insightface.app import FaceAnalysis | |
| def imdecode(b64: str): | |
| raw = base64.b64decode(b64) | |
| arr = np.frombuffer(raw, np.uint8) | |
| img = cv2.imdecode(arr, cv2.IMREAD_COLOR) | |
| if img is None: | |
| raise ValueError("Bad image_b64") | |
| return img | |
| class FaceService: | |
| def __init__(self, providers): | |
| cache_root = os.environ["INSIGHTFACE_HOME"] | |
| self.app = FaceAnalysis( | |
| name="buffalo_l", | |
| providers=providers, | |
| root=cache_root, | |
| ) | |
| self.app.prepare(ctx_id=0, det_size=(640, 640)) | |
| def embed_best(self, img_bgr): | |
| faces = self.app.get(img_bgr) | |
| if not faces: | |
| return None, None, None | |
| best = max(faces, key=lambda f: (f.bbox[2]-f.bbox[0])*(f.bbox[3]-f.bbox[1])) | |
| bbox = best.bbox.astype(int).tolist() | |
| emb = best.normed_embedding | |
| score = float(getattr(best, 'det_score', 1.0)) | |
| return bbox, emb, score | |
| def embed_all(self, img_bgr): | |
| faces = self.app.get(img_bgr) | |
| out = [] | |
| for f in faces: | |
| bbox = f.bbox.astype(int).tolist() | |
| emb = f.normed_embedding | |
| score = float(getattr(f, 'det_score', 1.0)) | |
| out.append((bbox, emb, score)) | |
| return out | |