Recently got this question.
I’m currently using your toolbox for my research about emotion recognition. Can you give me some advise and tips on what feature to extract and what classifier should I use.
I’m answering here as it may be of interest to more people.
You may either normalize and align faces and use raw pixel-based representation or find/detect facial landmark points and measure specific features based on distances between landmarks.
The first approach is more low-level and will probably need more face examples to learn robust models; the second uses apriori knowledge and so may need less samples. However, you will first need to detect the landmark points. Errors in this step will probably have adverse effects on the later emotion classifiers.
A good first overview of methods is in this paper:
http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/CHIBELUSHI1/CCC_FB_FacExprRecCVonline.pdf
Regarding the classifiers: The choice of a classifier depends on the type of problem, number of samples and number of features. I’d recommend to first gather/choose a data set, fix the basic feature representation approach and only then start looking at the classifier. The useful first thing to see with the classifier is a basic comparison of few classifier types starting from very simple (sdnmean, sdlinear, sdfisher) to more complex (sdquadratic, sdmixture, sdparzen, sdneural).
It is important to estimate classifier error using data unseen in training - in face recognition/emotion recognition problem, you probably want to apply the classifier finally to unseen people. If your data contains multiple images of the same person (e.g. with different facial expression), you need to take care that you test the classifier on images of different persons.
To do that, just add a person label to your data set
>> a=sddata(data_matrix, emotion_labels)
% here we add the person labels, provided that we have 10 samples
% for each person and data is ordered by persons:
>> a.person = sdlab({'Person 1','Person 2','Person 3',[10 10 10])
To quickly split your data set based on persons, use the subset command:
>> [ts,tr]=subset(a,'person',1)
Data set ts will contain only samples from ‘Person 1’, data set tr the rest. In this way, you can quickly get independent test set.
To train and test your classifier use for example:
>> p=sdfisher(tr)
>> pd=sddecide(p) % to use default operating point
>> error=sdtest(ts,pd)
Hope it helps,
Pavel

