APPM 2360 Lab #2: Facial Recognition
Transcription
APPM 2360 Lab #2: Facial Recognition
APPM 2360 Lab #2: Facial Recognition Instructions Labs may be done in groups of 3 or less. You may use any program; but the TAs will only answer coding questions in MATLAB. One report must be turned in for each group and must be in PDF format. Labs must include each student’s: • Name • Student number • Section number • Recitation number This lab is due on Friday, March 20, 2015 at 5pm. Each lab must be turned in through D2L on the course page. When you submit the lab please include each group members information (name, student number, section number and recitation number) in the comments. This allows us to search for a students report. Once the labs are graded you need to specifically check that your grade was entered. If you are missing a grade please bring the issue up with your TA within a week of grading. 1 The report must be typed (including equations). Be sure to label all images and graphs so that, independent of the text, it is clear what is in the graph. Simply answering the lab questions will not earn you a good grade. Take time to write your report as up to 20% of your grade may be based on organization, structure, style, grammar, and spelling. Project office hours will be held in ECCR 143 from Monday, March 16, 2015 to Friday, March 20, 2015. (Except that on Tuesday March 17, office hours will be in the Stadium as usual.) 1 Objective In this lab we use the singular value decomposition for matrices. We use it to build a facial recognition system. 2 Matrix and Image Manipulation in Matlab It’s easy to read grayscale images into Matlab, using the function imread. Matlab stores the image as a matrix. Each entry is an integer between 0 and 255. An entry of 0 corresponds to one black pixel; an entry of 255 corresponds to one white pixel. Download the images from the folder faces included with the lab. Make sure the images are in your current Matlab folder. Then try these Matlab commands: A = imread('face1.pgm'); figure; imshow(A); Next, we want to try manipulating the matrix and then viewing the image again. First, we need to change the datatype of the Matrix to double. Then we can do matrix operations. Then we change the datatype back to uint8 before we use imshow. For example: A = imread('face1.pgm'); A = double(A); newA = -A+255; newA = uint8(newA); figure; imshow(newA); Problem 1. Try the code above, and include the resulting figure in your report. Describe what has happened to the image. In case you are unfamiliar with matrices in Matlab, here are some things to know: • If two matrices A and B are the same shape, you can add them in Matlab by typing A + B. 2 • If A and B are the right shape to be multiplied, Matlab will multiply them with A ∗ B. • You can take the transpose of a matrix with an apostrophe: A0 is the transpose of A. • You can get the diagonal elements out of a matrix A using diag(A). Singular Value Decomposition The Singular Value Decomposition breaks a matrix A down into three separate matrices A = U SV T where V T denotes the transpose of V . The matrices U and V are both orthogonal, which means that U T U = I and V T V = I, where I is the identity matrix. The matrix S is diagonal; and the diagonal elements of S are called the singular values of A. Intuitively, the matrices U and V describe important features of the matrix, and the matrix S gives us a numerical measure of how important those features are. Don’t worry about the technical details for now - we’ll get a feel for what this decomposition does as we continue to work with it. Below is a brief MATLAB script that takes the SVD of a random 3×3 matrix. After you run it, take a look at what U , S, and V look like! %% Test Matlab's SVD function % Build a random 3x3 matrix A = rand(3); % Get singular value decomposition [U,S,V] = svd(A); % Multiply to get new matrix B = U*S*V'; %Check that we got the same thing we started with A B Low-Dimensional Approximations What does it mean to create a low-dimensional approximation to a set of data? Take a look at Figure 1. The data points shown on the left lie in two dimensions, but we can easily see that they are “almost” one-dimensional, i.e. they are all pretty close to some line. If we project each point onto this line (shown in blue), we end up with a one-dimensional approximation of the data. Obviously, we have lost some information, but the hope is that most of the important aspects of the data are preserved in this process. The SVD allows us to do a low-dimensional approximation of a matrix. Suppose we take the SVD of a matrix. The diagonal of S will be the singular values, which MATLAB automatically ranks in descending order, so that we might have something like 3 Figure 1: A low-dimension approximation to a set of points. diag(S) = {60.4, 12, 1.07, 0.9, 0.05, 0.001, 0.00001} In the last section, we said that these singular values can be thought of as weighting how important the corresponding features are. So, it seems like the last three features are relatively unimportant, doesn’t it? Supposed we replaced S with Se where e = {60.4, 12, 1.07, 0.9, 0, 0, 0} diag(S) We have set all but the first 4 singular values to zero. Then we set e = U ∗ Se ∗ V T A e is 4, down from 7 originally.1 However A e is a good The “dimension” of A approximation of our A, since the features we are ignoring are relatively unimportant. In the next section, we’ll explore removing the less important singular values and observe the effects. Remember, the most important singular values are always the first ones. Making Low-Dimensional Approximations to Images Run this code in Matlab: %% A = imread('face1.pgm'); A = double(A); [U,S,V] = svd(A); 1 Technically, when we say “dimension” here we really mean rank. 4 % Make a copy of S Sreduced = S; % Turn all but the first 10 singular values to 0 Sreduced(10:end,10:end) = 0; % remultiply to get lower-dimensional version of A Areduced = U*Sreduced*V'; figure; imshow(uint8(A)); figure; imshow(uint8(Areduced)); (a) All the singular values (b) Only 10 singular values Pretty cool! We reduced the dimension all the way down to 10, and we can still see the important features of the face. Problem 2. Follow the above Matlab procedure to project images to lower dimensions. Work with face1.pgm, and try a variety of values of r, where r is the number of singular value you keep. Try keeping most of the singular values, or half, or only a few. Include these figures in your report (try at least 3, and make sure they look different). Problem 3. Follow the above Matlab procedure for 3 of the other faces. How low can you make r while still being able to recognize the face? Include some figures to demonstrate. Problem 4. Find all the singular values for face1.pgm, . Produce a plot of these values. How many of the singular values are larger than 0.01? Facial Recognition Suppose the FBI is searching for a criminal on the run. The identity of the criminal is unknown. However, the FBI suspects that the criminal will try to obtain a new driver’s license under a fake name. 5 The criminal will enter a DMV (Department of Motor Vehicles, in charge of licensing drivers) and take a photo for a new license. The FBI hopes to catch the criminal by comparing the new photo to a database containing all the other driver’s license photos in the US. When they see that the same face is already in the database under a different name, they’ll be able to identify the criminal. The process of searching through the database for a match needs to go very quickly, because the database is huge. The FBI wants to find the match before the criminal leaves the DMV, so they can rush in and make an arrest. The FBI hires you to design an algorithm that can identify matching faces very quickly. When a new photo is taken at the DMV, you must compare it to all the existing photos and look for a matching face. If you compare the photos pixel by pixel, you won’t be nearly fast enough. It turns out that you can use the SVD to very quickly compare photos. For each photo, simply use the vector of the first r singular values, where r is some suitably chosen integer. This comparatively short vector of numbers captures the most important information about each face. This is called the “signature vector” for each face. Your strategy is to first make a signature vector for each face in the database. When a new photo is taken at a DMV somewhere in the country, you’ll make a new signature vector for it. You’ll compare the new signature vector to the old ones in the database. If the new signature vector is close to any of the old ones, you’ll alert the FBI. This algorithm is much faster than comparing all the pixels in the photograph. This method works best if the photographs in your database are all taken under similar conditions (similar lighting, similar zoom, face centered). This is true for driver’s license photos, so we’re in luck. If photo conditions were more variable, we would have to adjust for those variations first. . Problem 5. Set r = 15. Make a signature vector for each of the 6 images face1.pgm through face6.pgm Include the signature vectors for images 5 and 6 in your lab report. Also make a signature vector for the image newFace.pgm. In the next problem you will use the signature vectors to test whether newFace matches any of the other faces. We want to know whether the signature vector for newFace is close to any of the other signature vectors. What does it mean for vectors to be close? You already know how p to calculate the distance between points in 3 dimensions: that is, distance = (x1 − x2 )2 + (y1 − y2 )2 + (z1 − z2 )2 . There’s a similar distance function for our signature vectors, except in 15 dimensions instead of 3. The Matlab function norm calculates the length of a vector. To find the distance between two vectors, we calculate the length of their difference. In Matlab that will look like norm(vector1-vector2). Problem 6. Find the distance between the signature vector for newFace and each of the other signature vectors. In your report, include a plot or graph that shows each of these 6 distances. Which image is newFace closest to? 6 Problem 7. Given this signature vector: 12830 11258 1100 890 640 580 415 370 333 300 290 250 240 Which of the 6 faces is this closest to? Problem 8. Suppose your job is to build a facial recognition system using SVD, for a database with 100,000 faces. Describe how you would choose the best value of r. What would happen if it was too small? What would happen if it was too large? 7 220 215