Project 3 -- Eigenfaces


Experiment 1:

The average face from the nonsmiling dataset:


Ten 35 x 35 eigenfaces (I used 35 x 35 to get better results):



Experiment 2:

I ran some extra experiments to measure the effects of eigenface size as well as number of eigenfaces. As the figure below demonstrates, number of eigenfaces seems to determine asymptotic performance, while size of eigenfaces determines variance of performance. Note that the curves showing data points for recognition using larger eigenfaces are much smoother than the curves for smaller eigenfaces.



Experiment 3:


This result shows how the system can mark non-overlapping faces. Rather than run the system at a variety of scales, I guessed a possible scale (0.7) and ran the system on it. This snapshot used eigenfaces that were 35 x 35 with 10 basis vectors.


This result shows the same group, identified using a variety of scales from 0.5 to 0.7 in steps of 0.05. The results are not much different.

One very noticeable requirement is the need to eliminate areas of low texture. Especially at small scales, the trick described on the project Web page for removing regions far away from the average face is important for finding good face regions. Another important point is that quality of results varies widely depending on how many eigenvectors are used, and how large they are. Having more eigenvectors in general seemed to give better performance than using larger vectors; this is particularly evident since, when the number of eigenvectors equals the number of training faces, the system essentially memorizes a set of coefficients for each person's face. One issue that this brings up is overfitting: if we learn a separate model for each person's face, the model will probably not generalize well to data from an out-of-sample testing set of face images.

To get an especially good cropping result, I partially cropped the aseem.tga image (for faster processing), then did face detection/cropping with 33 eigenfaces of dimensionality 100 x 100. The results are as follows:

Original (partially cropped) image:Cropped image:

This was done at a fixed scale of 0.5.

Here's an image from the Web:


As you can see, the marking isn't perfect. I think this is because many of the faces are at an odd angle. I also only ran the picture at a single scale, 0.2.

Here's another image from the Web:


The cropping isn't very good. I think it's because I picked a bad scale (I only ran it at 0.5 and 0.8--this one's at 0.8, and 0.5 wasn't very good either).



Extra credit: I implemented two items of extra credit: the speedup for finding eigenvectors linked off the project Web page, and the morphing facility. Here's an example of a morphed face (created using 33 eigenfaces of 100 x 100 dimensionality):

Originals:Morphed face:

The faces are a blend of 0.5 * the coefficients for user McNew and 0.5 * the coefficients for user McNamara.