Back to Top

Eigenfaces

10 Eigenfaces represented in image form

Average face found combining all neutral sample faces

Recognition Matches

Plot of number of face recognition matches for each number of eigenfaces used

The plot of facial reconition matches starts off low when using just one eigenface (only 4 matches) but increases dramatically with the next few incremental increases of eigenfaces, and starts to platue at the use of 7 eigenfaces. Then at 13 eigenfaces, it starts to increase the number of matches found again
As we see from the plot, not even using the full 27 eigenfaces produces the best reconition results, so the "best" number of eigenfaces to use is difficult to say.
Something that is hard to tell from the graph is which faces were matching. Some of the faces would match for some number of eigenfaces and then no longer match in the next iteration (the fluctuation).

Recognition Error

Face recognition errors made when using 25 eigenfaces

Reconstructed Face

Correct Face

Mismatched Face

In both of the last two recognition errors, the correct image was the very next match in the list.
For interesting face 1, however, the original neutral face 1 was nowhere in the top 6 recognized faces.
In the last two images, the reconstructed face looks like a ghosted mixture of the original image and the image it is got confused with rather than a image of a single person's face.
The error made with the first image makes sense because the reconstructed face looks like the person is wearing glasses, when the original user does not.

Face Reconstruction

Incremental face reconstruction using 25 eigenfaces

rotating image rotating image rotating image

Finding Faces

My code for this portion of the project was not working

First thing you'll notice is that there is only one box when I was trying to get 4.
For some reason I was unable to iterate through my list. Despite it telling me I had a list size of 4, I could only access the first face found.

Next obvious error you'll notice is that the face found is very off and not a face at all.
Worse is that, in the above image, it is not even a mistake found in the low-textured wall.

My guess is that somewhere my coefficients are off, which in turn produced errors that didn't get lower than 300.
However, coefficients may have been wrong if my eigenfaces were also incorrect.
Another very likely possibility is that, because of the problems I was having with the above error, I never got around to making a check to not consider low-textured, unvaried portions as images, as they are not likely to be. So in this case here where it found some dark area (which it could have mistaken as hair) and some light area with little texture (which it thought was a face), I could have checked agains this.

Verify Faces

Correctly verified as not user

Corrctly verified as user

Incorrectly verified as user

To produce the data above, I found the number of faces that were verified for each given threshold (I altered the main code to print this number). I tested each face for thresholds at increments of 10000 from 20000 to 90000 (10000 had hardly any varification).
I then verified each user's interesting face to their neutral face for each of the thresholds to see for which thresholds the user's face was correctly verified. Subtracting the number of correctly verified from the total (28) images gave me the number of false negatives and subtracting the correct number from total number verified gave me the false positives.
After graphing the false positives and false negatives, I could find the intersection of these two lines to find the threshold that will produce the least number of false positives while maintaining a low false negative rate. I found this intersection to be 37777.8.

I then ran each of the faces again through the verification script but just for a threshold of 37777.8 to find a false negative rate of 9/28 and false positive rate of 31/756.