Part A

1.

The average face followed by the 10 eigenfaces (in decreasing order of eigenvalue), computed at 40x40 resolution:
average face:
eigenfaces:

2.

I implemented a simple speedup to simplify computing the top 1,3,...,33 eigenvectors. I modified the eigenfaces file format and load routine slightly to allow a runtime-specified number of the eigenvectors to be loaded. I computed the top 33 eigenvectors once, and saved them using this new format. At runtime I simply ran the --constructuserbase for each of the desired number of eigenvectors (1,3,...,33). Similarly, I ran each of the experiments only using the top N of the 33 eigenvectors.

The command-line format changed slightly to support this functionality. All the commands (except --eigenfaces) now require an integer following the name of the eigenfaces file, denoting how many eigenfaces to load.

3.

The following graph shows the success rate at identifying users from the smiling images against the non-smiling userbase.

The "Exact Matches" line graphs the number of images where the top scoring user in the database matched the input. "Close Matches" graphs the number of images where the input user appeared in the top 5 scoring userbase entries.

Obviously, using more eigenvectors tends to increase the success at identifying users. Beyond about 15 eigenvectors there is little additional benefit. Beyond this point the graphs are no longer monotonically increasing, indicating that these additional eigenvectors are probably useless at best, or possibly harmful.

The program was unable to match the smiling images of "hile" and "ko" to their non-smiling userbase entry. These two examples did not even score within the top 5. They actually smiled in the smiling photos (unlike many of the other students) which is perhaps why the program could not match them against their non-smiling image.

smiling and non-smiling hile:

smiling and non-smiling ko:

Part B

aseem.tga

Here's the result of cropping aseem.tga, obtained by stepping from min_scale=0.65 to max_scale=0.75 at step=0.01:

Myself

Here's the result of cropping a photo of myself, obtained by stepping from min_scale=1.25 to max_scale=1.35 at step=0.01:

group1.tga

Here are the faces located in group1.tga using scales 1.50 - 1.65, step of 0.05. The green box with the thickest border is the highest-scoring match. The thinner boxes represent lower scoring matches.

4 people

Here are the faces located in a picture containing 4 people using scales 1.0-1.15, step 0.05. Unfortunately, the program was only able to locate 3 of the 4 faces reliably. Depending on the starting and ending scale it would settle on a different set of 3. The MSE values for the 4 faces and the "false face" were very closely spaced.