Testing recognition with cropped class images
Procedure (1) Here is my average face (I took out normalization for the average):
and here are my 10 eigenfaces:
and here is my eigenface file.
Procedure (2) Here is the userbase I computed.
Procedure (3) This is a plot of number of smiling faces recognized over the number of eigenfaces used (actually the x axis should be multiplied by two):
Questions (1) The number of recognized faces increases rapidly at first, and then the increase seems to asymptote off. As always, it is not obvious what the best number is. For this dataset it would seem that 11 eigenfaces (6 on the graph) is the highest number before the marginal return gets very slim.
Questions (2) Here are some mismatched pairs:
I don't look anything like this guy! I myself am 8th.
In this case the person was 4th.
Testing recognition with cropped class images
Procedure (2) Here is my program's cropping of aseem.tga:
I used a width and height of (110,133) for the eigenfaces and min/max/step of (0.4, 0.65, 0.05).
Procedure (3) Here is a picture of me, and this is what my program cropped:
...um it didn't do very well. I think it may be because the head is small, and if you look carefully, there are significant JPEG artifacts around my face.
Procedure (4)
Procedure (5.1) Here is my result on the group picture:
Procedure (5.2) I took this image and tried to find 5 facoes on it:
It would appear as though my algorithm is mostly interested in catching the corner of people's eyes. My only clonclusion is that these people look funny...
Questions (1) For procedure 5.1, I used an image size of (110, 113) and min/maxstep scales of (0.13 0.32 0.017). For procedure 5.2, I used 10 smiling eigenfaces :) with an image size of (110, 113), and min/max/step scales of (0.4, 0.6, 0.05).
Extra Credit
-
I implemented the 3rd bell: speeding things up with by computing aTa instead of aaT.
-
I implemented the 1st whistle, though I didn't answer the question.
-
I changed the cost function isFace() to divide by the square root of the variance. This is because I believed areas of high veriance were being overly favored. (This is not mentioned as extra credit on the web page, but is in the code.) :)
Notes About the Code
-
I implemented a zero() method on array to make sure that things were being properly initialized to zero.
-
I changed the members of FacePosition to make intersection testing easier
-
I got rid of almost every call to Image::normalize() as they did not seem right to me. (The only exception is the output of the eigenfaces)