Proposed Algorithm1
Euclidean Distance:
- Each Emotion has an average and Standard Deviation
We decided to take the set of feature points for a person's average face. A person's average face is the pointwise average of all their facial expressions (neutral, angry, disgust, fear, happiness, sadness, and surprise). Next we calculated the distance between a single subject's neutral expression, and their average expression. The average distance is 22,955. Then we calculated the distance between a single subject's neutral expression, and a random subject's neutral expression. The average distance is 23,426.
To narrow in on accuracy, we next tried Neutral vs Neutral.
Obviously for the same subject the distance was 0.
For one subject vs. a random subject, the distance was 5,553.
It's starting to look like facial expression plays a larger role in face detection than we thought.
Happy VS Happy:
- sameSubject VS sameSubject: 0
- subject1 VS randomSubject: 17,680.857
- mean across 7 trials was 17,680.857
- std deviation across 7 trials was 787.105
From here on, Euclidean Distance & Standard Deviation are about the same for any facial expression except Neutral.
Angry VS Angry:
- subject1 VS randomSubject: 17,993
Disgust VS Disgust:
- subject1 VS randomSubject: 18,418
Fear VS Fear:
- subject1 VS randomSubject: 18,673
Sadness VS Sadness:
- subject1 VS randomSubject: 18,816
Surprise VS Surprise:
- subject1 VS randomSubject: 18,096
Neutral VS Neutral (only one image per subject):
- subject1 VS randomSubject: 5,979
- Here, the mean is: 5,655.85 and the StdD:179.556
(Maybe also compare some results comparing DIFFERENT emotions for SAME subjects)
(Maybe also compare some results comparing DIFFERENT emotions for DIFFERENT subjects)
Proposed Algorithm2
Standard Deviation:
- Each Control Point has an average and standard deviation
We also looked at combining the average of each control point with the standard deviation, and creating a lower and upper bound based on [mean-(k)stdD, mean+(k)stdD] where k is a variable for us to adjust in order to make a more or less forgiving system.
For subject 1:
Control Point 1:
- mean is [-1.629351072, -43.134416, 49.60222000000001]
- stdD is [ 0.4779777856, 4.3027568, 2.2643159999999978]
Control Point 2:
- mean is [-30.102224, -39.13870000000001, 42.339132]
- stdD is [0.5331751999999994, 4.513219999999998, 2.0564536]
Control Point 3:
- mean is [33.45903199999999, -42.588708, 49.45645599999999]
- stdD is [0.7318063999999985, 4.601218400000002, 2.6821088000000017]
Control Point 4:
- mean is [61.85497199999999, -36.155116, 42.42556799999999]
- stdD is [0.48691439999999775, 4.5829768, 2.818026400000002]
Control Point 5:
- mean is [5.943795720000001, -77.130488, 31.952824000000007]
- stdD is [1.002333744, 4.269662400000001, 2.6875951999999983]
Control Point 6:
- mean is [30.396192000000006, -76.80582400000002, 31.9487]
- stdD is [0.24202159999999892, 3.7177551999999965, 3.0918799999999997]
Control Point 7:
- mean is [18.4926776, -85.00685599999998, 55.480132]
- stdD is [0.7604155200000001, 4.755828800000003, 2.8384736000000004]
Control Point 8:
- mean is [18.6188916, -85.170976, 37.27458399999998]
- stdD is [0.45469831999999993, 4.861604800000001, 2.827723200000004]
The idea now is to iterate over the control points of an incoming face, and check if it falls in the range of [mean +- (k)stdD] for each control point of each subject. In order to separate our training data from our testing data, we are thinking of using half of a subjects emotions to test, and the other half of the emotions to train. Hopefully this will avoid the problem of splitting our data into two similar halves.
In order to test, maybe we can test all males VS all females expecting to see a lot of failures
Originally we planned our Training Data VS Testing Data to be half the females & half the males VS the other two halves. As of right now, our Training Data VS Testing Data is Female VS Male. Maybe different advantages of both. Could we use 13 images to train and 13 to test?