**Empathic-Insight-Face-Large** is a set of 40 emotion regression models trained on the EMoNet-FACE benchmark suite. Each model is designed to predict the intensity of a specific fine-grained emotion from facial expressions. These models are built on top of SigLIP2 image embeddings followed by MLP regression heads.
This work is based on the research paper:
"EMONET-FACE: An Expert-Annotated Benchmark for Synthetic Emotion Recognition"Authors: Christoph Schuhmann, Robert Kaczmarczyk, Gollam Rabby, Maurice Kraus, Felix Friedrich, Huu Nguyen, Krishna Kalyan, Kourosh Nadi, Kristian Kersting, Sören Auer.(Please refer to the full paper for a complete list of authors and affiliations if applicable).Paper link: (Insert ArXiv/Conference link here when available)
The models and datasets are released under the CC-BY-4.0 license.
Model Description
The Empathic-Insight-Face-Large suite consists of 40 individual MLP models. Each model takes a 1152-dimensional SigLIP2 image embedding as input and outputs a continuous score (typically 0-7, can be mean-subtracted) for one of the 40 emotion categories defined in the EMoNet-FACE taxonomy.
The models were pre-trained on the EMoNet-FACE BIG dataset (over 203k synthetic images with generated labels) and fine-tuned on the EMoNet-FACE BINARY dataset (nearly 20k synthetic images with over 65k human expert binary annotations).
Key Features:
Fine-grained Emotions: Covers a novel 40-category emotion taxonomy.
High Performance: Achieves human-expert-level performance on the EMoNet-FACE HQ benchmark.
Synthetic Data: Trained on AI-generated, demographically balanced, full-face expressions.
Open: Publicly released models, datasets, and taxonomy.
Intended Use
These models are intended for research purposes in affective computing, human-AI interaction, and emotion recognition. They can be used to:
Analyze and predict fine-grained emotional expressions in facial images.
Serve as a baseline for developing more advanced emotion recognition systems.
Facilitate research into nuanced emotional understanding in AI.
Out-of-Scope Use:
These models are trained on synthetic faces and may not generalize well to real-world, in-the-wild images without further adaptation. They should not be used for making critical decisions about individuals, for surveillance, or in any manner that could lead to discriminatory outcomes.
How to Use
These are individual .pth files, each corresponding to one emotion classifier. To use them, you will typically:
Obtain SigLIP2 Embeddings:
Use a pre-trained SigLIP2 model (e.g., google/siglip2-so400m-patch16-384).
Extract the 1152-dimensional image embedding for your target facial image.
Load an MLP Model:
Each .pth file (e.g., model_elation_best.pth) is a PyTorch state dictionary for an MLP.
The MLP architecture used for "Empathic-Insight-Face-Large" (big models) is:
Input: 1152 features
Hidden Layer 1: 1024 neurons, ReLU, Dropout (0.2)
Hidden Layer 2: 512 neurons, ReLU, Dropout (0.2)
Hidden Layer 3: 256 neurons, ReLU, Dropout (0.2)
Output Layer: 1 neuron (continuous score)
Perform Inference:
Pass the SigLIP2 embedding through the loaded MLP model(s).
(Optional) Mean Subtraction:
The raw output scores can be adjusted by subtracting the model's mean score on neutral faces. The neutral_stats_cache-_human-binary-big-mlps_v8_two_stage_higher_lr_stage2_5_200+ file in this repository contains these mean values for each emotion model.
Example (Conceptual PyTorch for all 40 emotions):
python
1import torch
2import torch.nn as nn
3from transformers import AutoModel, AutoProcessor
4from PIL import Image
5import numpy as np
6import json
7from pathlib import Path # Used for cleaner path handling89# --- 1. Define MLP Architecture (Big Model) ---10classMLP(nn.Module):11def__init__(self, input_size=1152, output_size=1):12super().__init__()13 self.layers = nn.Sequential(14 nn.Linear(input_size,1024),15 nn.ReLU(),16 nn.Dropout(0.2),17 nn.Linear(1024,512),18 nn.ReLU(),19 nn.Dropout(0.2),20 nn.Linear(512,256),21 nn.ReLU(),22 nn.Dropout(0.2),23 nn.Linear(256, output_size)24)25defforward(self, x):26return self.layers(x)2728# --- 2. Load Models and Processor ---29device = torch.device("cuda"if torch.cuda.is_available()else"cpu")3031# === IMPORTANT: Set this to the directory where your .pth models are downloaded ===32# If you've cloned the repo, it might be "./" or the name of the cloned folder.33# Example: MODEL_DIRECTORY = Path("./Empathic-Insight-Face-Large_cloned_repo")34MODEL_DIRECTORY = Path(".")# Assumes models are in the current directory or a sub-directory35# If the models are in the root of where this script runs after cloning, "." is fine.36# If they are in a subfolder, e.g., "Empathic-Insight-Face-Large", use Path("./Empathic-Insight-Face-Large")37# ================================================================================383940# Load SigLIP (ensure it's the correct one for 1152 dim)41siglip_model_id ="google/siglip2-so400m-patch16-384"# Produces 1152-dim embeddings42siglip_processor = AutoProcessor.from_pretrained(siglip_model_id)43siglip_model = AutoModel.from_pretrained(siglip_model_id).to(device).eval()4445# Load neutral stats46neutral_stats_filename ="neutral_stats_cache-_human-binary-big-mlps_v8_two_stage_higher_lr_stage2_5_200+"47neutral_stats_path = MODEL_DIRECTORY / neutral_stats_filename
48neutral_stats_all ={}49if neutral_stats_path.exists():50withopen(neutral_stats_path,'r')as f:51 neutral_stats_all = json.load(f)52else:53print(f"Warning: Neutral stats file not found at {neutral_stats_path}. Mean subtraction will use 0.0 for all models.")545556# Load all emotion MLP models57emotion_mlps ={}58print(f"Loading emotion MLP models from: {MODEL_DIRECTORY.resolve()}")# .resolve() gives absolute path59model_files_found =list(MODEL_DIRECTORY.glob("model_*_best.pth"))60ifnot model_files_found:61print(f"Warning: No model files found in {MODEL_DIRECTORY.resolve()}. Please check the MODEL_DIRECTORY path.")6263for pth_file in model_files_found:64 model_key_name = pth_file.stem # e.g., "model_elation_best"65try:66 mlp_model = MLP().to(device)67 mlp_model.load_state_dict(torch.load(pth_file, map_location=device))68 mlp_model.eval()69 emotion_mlps[model_key_name]= mlp_model
70# print(f"Loaded: {model_key_name}")71except Exception as e:72print(f"Error loading {model_key_name} from {pth_file}: {e}")7374ifnot emotion_mlps:75print(f"Error: No MLP models were successfully loaded. Check MODEL_DIRECTORY and file integrity.")76else:77print(f"Successfully loaded {len(emotion_mlps)} emotion MLP models.")787980# --- 3. Prepare Image and Get Embedding ---81defnormalized(a, axis=-1, order=2):82 a = np.asarray(a)# Ensure 'a' is a numpy array83 l2 = np.atleast_1d(np.linalg.norm(a, order, axis))84 l2[l2 ==0]=185return a / np.expand_dims(l2, axis)8687# === Replace with your actual image path ===88# image_path_str = "path/to/your/image.jpg" 89# try:90# image = Image.open(image_path_str).convert("RGB")91# inputs = siglip_processor(images=[image], return_tensors="pt", padding="max_length", truncation=True).to(device)92# with torch.no_grad():93# image_features = siglip_model.get_image_features(**inputs) # PyTorch tensor94# embedding_numpy_normalized = normalized(image_features.cpu().numpy()) # Normalize on CPU95# embedding_tensor = torch.from_numpy(embedding_numpy_normalized).to(device).float()96# except FileNotFoundError:97# print(f"Error: Image not found at {image_path_str}")98# embedding_tensor = None # Or handle error as appropriate99# except Exception as e:100# print(f"Error processing image {image_path_str}: {e}")101# embedding_tensor = None102# ==========================================103104# --- For demonstration, let's use a random embedding if no image is processed ---105print("\nUsing a random embedding for demonstration purposes as no image path was set.")106embedding_tensor = torch.randn(1,1152).to(device).float()107# ==============================================================================108109110# --- 4. Inference for all loaded models ---111results ={}112if embedding_tensor isnotNoneand emotion_mlps:113with torch.no_grad():114for model_key_name, mlp_model_instance in emotion_mlps.items():115 raw_score = mlp_model_instance(embedding_tensor).item()116 neutral_mean = neutral_stats_all.get(model_key_name,{}).get("mean",0.0)117 mean_subtracted_score = raw_score - neutral_mean
118119# Derive a human-readable emotion name from the model key120 emotion_name = model_key_name.replace("model_","").replace("_best","").replace("_"," ").title()121 results[emotion_name]={122"raw_score": raw_score,123"neutral_mean": neutral_mean,124"mean_subtracted_score": mean_subtracted_score
125}126127# Print results, sorted alphabetically by emotion name128print("\n--- Emotion Scores (Mean-Subtracted) ---")129# Sort items by emotion name for consistent output130for emotion, scores insorted(results.items()):131print(f"{emotion:<35}: {scores['mean_subtracted_score']:.4f} (Raw: {scores['raw_score']:.4f}, Neutral Mean: {scores['neutral_mean']:.4f})")132else:133print("Skipping inference as either embedding_tensor is None or no MLP models were loaded.")
Performance on EMoNet-FACE HQ Benchmark
The Empathic-Insight-Face models demonstrate strong performance, achieving near human-expert-level agreement on the EMoNet-FACE HQ benchmark.
Key Metric: Weighted Kappa (κw) Agreement with Human Annotators(Aggregated pairwise agreement between model predictions and individual human expert annotations on the EMoNet-FACE HQ dataset)
Annotator Group
Mean κw (vs. Humans)
Human Annotators (vs. Humans)
~0.20 - 0.26*
Empathic-Insight-Face LARGE
~0.18
Empathic-Insight-Face SMALL
~0.14
Proprietary Models (e.g., HumeFace)
~0.11
Random Baseline
~0.00
*Human inter-annotator agreement (pairwise κw) varies per annotator; this is an approximate range from Table 6 in the paper.
Interpretation (from paper Figure 3 & Table 6):
Empathic-Insight-Face LARGE (our big models) achieves agreement scores that are statistically very close to human inter-annotator agreement and significantly outperforms other evaluated systems like proprietary models and general-purpose VLMs on this benchmark.
The performance indicates that with focused dataset construction and careful fine-tuning, specialized models can approach human-level reliability on synthetic facial emotion recognition tasks for fine-grained emotions.
For more detailed benchmark results, including per-emotion performance and comparisons with other models using Spearman's Rho, please refer to the full EMoNet-FACE paper (Figures 3, 4, 9 and Table 6 in particular).
(See Table 4 in the paper for associated descriptive words for each category).
Limitations
Synthetic Data: Models are trained on synthetic faces. Generalization to real-world, diverse, in-the-wild images is not guaranteed and requires further investigation.
Static Faces: Analysis is restricted to static facial expressions, without broader contextual or multimodal cues.
Cultural Universality: The 40-category taxonomy, while expert-validated, is one perspective; its universality across cultures is an open research question.
Subjectivity: Emotion perception is inherently subjective.
Ethical Considerations
The EMoNet-FACE suite was developed with ethical considerations in mind, including:
Mitigating Bias: Efforts were made to create demographically diverse synthetic datasets and prompts were manually filtered.
No PII: All images are synthetic, and no personally identifiable information was used.
Responsible Use: These models are released for research. Users are urged to consider the ethical implications of their applications and avoid misuse, such as for emotional manipulation or in ways that could lead to unfair or harmful outcomes.
Please refer to the "Ethical Considerations" and "Data Integrity, Safety, and Fairness" sections in the EMoNet-FACE paper for a comprehensive discussion.
Citation
If you use these models or the EMoNet-FACE benchmark in your research, please cite the original paper:
bibtex
1@inproceedings{schuhmann2025emonetface,
2 title={{EMONET-FACE: An Expert-Annotated Benchmark for Synthetic Emotion Recognition}},
3 author={Schuhmann, Christoph and Kaczmarczyk, Robert and Rabby, Gollam and Kraus, Maurice and Friedrich, Felix and Nguyen, Huu and Kalyan, Krishna and Nadi, Kourosh and Kersting, Kristian and Auer, Sören},
4 booktitle={NeurIPS},
5 year={2025},
6}