svm_emo

Model Description

svm_emo combines histogram of oriented gradient feature extraction with a linear support vector machine to predict emotional face expressions from single frame images.

Model Details

  • Model Type: Support Vector Machine (SVM)
  • Framework: sklearn

Model Sources

Citation

If you use the svm_emo model in your research or application, please cite the following paper:

Cheong, J.H., Jolly, E., Xie, T. et al. Py-Feat: Python Facial Expression Analysis Toolbox. Affec Sci 4, 781–796 (2023). https://doi.org/10.1007/s42761-023-00191-4

@article{cheong2023py,
  title={Py-feat: Python facial expression analysis toolbox},
  author={Cheong, Jin Hyun and Jolly, Eshin and Xie, Tiankang and Byrne, Sophie and Kenney, Matthew and Chang, Luke J},
  journal={Affective Science},
  volume={4},
  number={4},
  pages={781--796},
  year={2023},
  publisher={Springer}
}

Example Useage

import numpy as np
from skops.io import dump, load, get_untrusted_types
from huggingface_hub import hf_hub_download

class EmoSVMClassifier:
    def __init__(self, **kwargs) -> None:
        self.weights_loaded = False
        
    def load_weights(self, scaler_full=None, pca_model_full=None, classifiers=None):

        self.scaler_full = scaler_full
        self.pca_model_full = pca_model_full
        self.classifiers = classifiers
        self.weights_loaded = True

    def pca_transform(self, frame, scaler, pca_model, landmarks):
        if not self.weights_loaded:
            raise ValueError('Need to load weights before running pca_transform')
        else:
            transformed_frame = pca_model.transform(scaler.transform(frame))
            return np.concatenate((transformed_frame, landmarks), axis=1)      

    def detect_emo(self, frame, landmarks, **kwargs):
        """
        Note that here frame is represented by hogs
        """
        if not self.weights_loaded:
            raise ValueError('Need to load weights before running detect_au')
        else:
            landmarks = np.concatenate(landmarks)
            landmarks = landmarks.reshape(-1, landmarks.shape[1] * landmarks.shape[2])

            pca_transformed_full = self.pca_transform(frame, self.scaler_full, self.pca_model_full, landmarks)
            emo_columns = ["anger", "disgust", "fear", "happ", "sad", "sur", "neutral"]
    
            pred_emo = []
            for keys in emo_columns:
                emo_pred = self.classifiers[keys].predict(pca_transformed_full)
                pred_emo.append(emo_pred)
    
            pred_emos = np.array(pred_emo).T
            return pred_emos            

# Load model and weights
emotion_model = EmoSVMClassifier()
model_path = hf_hub_download(repo_id="py-feat/svm_emo", filename="svm_emo_classifier.skops")
unknown_types = get_untrusted_types(file=model_path)
loaded_model = load(model_path, trusted=unknown_types)
emotion_model.load_weights(scaler_full=loaded_model.scaler_full, 
                           pca_model_full=loaded_model.pca_model_full, 
                           classifiers=loaded_model.classifiers)

# Test model
frame = "path/to/your/test_image.jpg"  # Replace with your loaded image
landmarks = np.array([...])  # Replace with your landmarks data
pred = emotion_model.detect_emo(frame, landmarks)
print(pred)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model is not currently available via any of the supported Inference Providers.
The model cannot be deployed to the HF Inference API: The HF Inference API does not support image-feature-extraction models for py-feat library.