Spaces:
Running
Running
import numpy as np | |
import os | |
import torch | |
from facenet_pytorch import MTCNN, InceptionResnetV1 | |
import logging | |
from PIL import Image | |
logger = logging.getLogger(__name__) | |
class FacialProcessing: | |
def __init__(self): | |
os.environ['TORCH_HOME'] = '/tmp/.cache/torch' | |
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
self.mtcnn = MTCNN(keep_all=True, device=self.device) | |
self.resnet = InceptionResnetV1(pretrained='vggface2').eval().to(self.device) | |
def extract_embeddings_vgg(self, image_path): | |
try: | |
img = Image.open(image_path) | |
img = img.convert('RGB') | |
# Detect faces | |
boxes, _ = self.mtcnn.detect(img) | |
if boxes is None: | |
logger.warning(f"No face detected in image: {image_path}") | |
return None | |
# Get the largest face | |
largest_box = max(boxes, key=lambda box: (box[2] - box[0]) * (box[3] - box[1])) | |
face = self.mtcnn(img, return_prob=False) | |
if face is None: | |
logger.warning(f"Failed to align face in image: {image_path}") | |
return None | |
# Extract embeddings | |
embeddings = self.resnet(face).detach().cpu().numpy().flatten() | |
return embeddings.tolist() | |
except Exception as e: | |
logger.error(f"An error occurred while extracting embeddings: {e}") | |
return None |