BI_Assistant_Backend / app /services /face_service.py
MohitGupta41
Initial Project commit
bd7254f
# 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