ljchang commited on
Commit
98aed02
·
verified ·
1 Parent(s): 8da1f04

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +131 -0
README.md ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: sklearn
4
+ ---
5
+
6
+ # svm_au
7
+
8
+ ## Model Description
9
+ svm_au combines histogram of oriented gradient feature extraction with a linear support vector machine to predict facial action units from single frame images.
10
+
11
+ ## Model Details
12
+ - **Model Type**: Support Vector Machine (SVM)
13
+ - **Framework**: sklearn
14
+
15
+ ## Model Sources
16
+ - **Repository**: [GitHub Repository](https://github.com/cosanlab/py-feat)
17
+ - **Paper**: [Py-feat: Python facial expression analysis toolbox](https://link.springer.com/article/10.1007/s42761-023-00191-4)
18
+
19
+ ## Citation
20
+ If you use the svm_au model in your research or application, please cite the following paper:
21
+
22
+ 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
23
+
24
+ ```
25
+ @article{cheong2023py,
26
+ title={Py-feat: Python facial expression analysis toolbox},
27
+ author={Cheong, Jin Hyun and Jolly, Eshin and Xie, Tiankang and Byrne, Sophie and Kenney, Matthew and Chang, Luke J},
28
+ journal={Affective Science},
29
+ volume={4},
30
+ number={4},
31
+ pages={781--796},
32
+ year={2023},
33
+ publisher={Springer}
34
+ }
35
+ ```
36
+
37
+ ## Example Useage
38
+
39
+ ```python
40
+ import numpy as np
41
+ from skops.io import dump, load, get_untrusted_types
42
+ from huggingface_hub import hf_hub_download
43
+
44
+ class SVMClassifier:
45
+ def __init__(self) -> None:
46
+ self.weights_loaded = False
47
+
48
+ def load_weights(self, scaler_upper=None, pca_model_upper=None, scaler_lower=None, pca_model_lower=None, scaler_full=None, pca_model_full=None, classifiers=None):
49
+ self.scaler_upper = scaler_upper
50
+ self.pca_model_upper = pca_model_upper
51
+ self.scaler_lower = scaler_lower
52
+ self.pca_model_lower = pca_model_lower
53
+ self.scaler_full = scaler_full
54
+ self.pca_model_full = pca_model_full
55
+ self.classifiers = classifiers
56
+ self.weights_loaded = True
57
+
58
+ def pca_transform(self, frame, scaler, pca_model, landmarks):
59
+ if not self.weights_loaded:
60
+ raise ValueError('Need to load weights before running pca_transform')
61
+ else:
62
+ transformed_frame = pca_model.transform(scaler.transform(frame))
63
+ return np.concatenate((transformed_frame, landmarks), axis=1)
64
+
65
+ def detect_au(self, frame, landmarks):
66
+ """
67
+ Note that here frame is represented by hogs
68
+ """
69
+ if not self.weights_loaded:
70
+ raise ValueError('Need to load weights before running detect_au')
71
+ else:
72
+ landmarks = np.concatenate(landmarks)
73
+ landmarks = landmarks.reshape(-1, landmarks.shape[1] * landmarks.shape[2])
74
+
75
+ pca_transformed_upper = self.pca_transform(frame, self.scaler_upper, self.pca_model_upper, landmarks)
76
+ pca_transformed_lower = self.pca_transform(frame, self.scaler_lower, self.pca_model_lower, landmarks)
77
+ pca_transformed_full = self.pca_transform(frame, self.scaler_full, self.pca_model_full, landmarks)
78
+
79
+ aus_list = sorted(self.classifiers.keys(), key=lambda x: int(x[2::]))
80
+
81
+ pred_aus = []
82
+ for keys in aus_list:
83
+ if keys in ["AU1", "AU4", "AU6"]:
84
+ au_pred = self.classifiers[keys].predict(pca_transformed_upper)
85
+ elif keys in ["AU11", "AU12", "AU17"]:
86
+ au_pred = self.classifiers[keys].predict(pca_transformed_lower)
87
+ elif keys in [
88
+ "AU2",
89
+ "AU5",
90
+ "AU7",
91
+ "AU9",
92
+ "AU10",
93
+ "AU14",
94
+ "AU15",
95
+ "AU20",
96
+ "AU23",
97
+ "AU24",
98
+ "AU25",
99
+ "AU26",
100
+ "AU28",
101
+ "AU43",
102
+ ]:
103
+ au_pred = self.classifiers[keys].predict(pca_transformed_full)
104
+ else:
105
+ raise ValueError("unknown AU detected")
106
+
107
+ pred_aus.append(au_pred)
108
+ pred_aus = np.array(pred_aus).T
109
+ return pred_aus
110
+
111
+ # Load model and weights
112
+ au_model = SVMClassifier()
113
+ model_path = hf_hub_download(repo_id="py-feat/svm_au", filename="svm_au_classifier.skops")
114
+ unknown_types = get_untrusted_types(file=model_path)
115
+ loaded_model = load(model_path, trusted=unknown_types)
116
+ au_model.load_weights(scaler_upper = loaded_model.scaler_upper,
117
+ pca_model_upper = loaded_model.pca_model_upper,
118
+ scaler_lower = loaded_model.scaler_lower,
119
+ pca_model_lower = loaded_model.scaler_full,
120
+ pca_model_full=loaded_model.pca_model_full,
121
+ classifiers=loaded_model.classifiers)
122
+
123
+ # Test model
124
+ frame = "path/to/your/test_image.jpg" # Replace with your loaded image
125
+ landmarks = np.array([...]) # Replace with your landmarks data
126
+ pred = au_model.detect_au(frame, landmarks)
127
+ print(pred)
128
+
129
+ ```
130
+
131
+