SKILL.md
mediapipefacealignment
La alineación facial normaliza la posición, escala y rotación del rostro antes de pasarlo al modelo de embeddings. Sin alinear, ArcFace puede perder hasta 15% de precisión en imágenes con cabeza inclinada o rostros en posición lateral.
When to use
Aplicar siempre antes de extraer embeddings con InsightFace/ArcFace. Tanto para la selfie como para la foto del documento.
Instructions
- Instalar:
pip install mediapipe opencv-python-headless - Implementar en
backend/agents/face_match/aligner.py:
``python import mediapipe as mp import cv2, numpy as np facemesh = mp.solutions.facemesh.FaceMesh(staticimagemode=True, maxnumfaces=1) LEFTEYEIDX = 33 # landmark del ojo izquierdo RIGHTEYEIDX = 263 # landmark del ojo derecho def alignface(image: np.ndarray, outputsize: tuple = (112, 112)) -> np.ndarray: results = facemesh.process(cv2.cvtColor(image, cv2.COLORBGR2RGB)) if not results.multifacelandmarks: raise ValueError("No face detected for alignment") landmarks = results.multifacelandmarks[0].landmark h, w = image.shape[:2] lefteye = np.array([landmarks[LEFTEYEIDX].x w, landmarks[LEFTEYEIDX].y h]) righteye = np.array([landmarks[RIGHTEYEIDX].x w, landmarks[RIGHTEYEIDX].y h]) angle = np.degrees(np.arctan2(righteye[1] - lefteye[1], righteye[0] - lefteye[0])) center = ((lefteye + righteye) / 2).astype(int) M = cv2.getRotationMatrix2D(tuple(center), angle, 1.0) aligned = cv2.warpAffine(image, M, (w, h)) # Crop y resize al tamaño esperado por ArcFace return cv2.resize(aligned[center[1]-56:center[1]+56, center[0]-56:center[0]+56], output_size) ``
- El tamaño de salida debe ser
(112, 112)— el input esperado por ArcFace R100. - Manejar la excepción cuando no se detecta cara: propagar como error de calidad al orchestrator.
- Aplicar alineación tanto a la selfie como a la foto recortada del documento.
Notes
- La alineación mejora la precisión más en casos difíciles: fotos de documento con inclinación, selfies sin centrar.
- Alternativa más rápida: usar los 5 puntos clave de InsightFace directamente en lugar de los 468 de MediaPipe.
- Procesar la alineación antes de la super-resolución (ESRGAN) para mejores resultados.