%%% PCA-based Face Recognizer %%% Author : Berk Gokberk %%% Inputs : %%% Training and test set images should be present in 'train_images\' and %%% 'test_images\' directories clear all; dir_train = 'train_images\'; dir_test = 'test_images\'; im_res = [0.2]; %%% image resolution parameter : %%% original image resolution is 92 x 112. %%% all images will be resized to : %%% round(92 x im_res) x round(112 x im_res) %%% calculate maximum dimensionality curdir = cd; cd(dir_train); files = feval('dir','*.BMP'); [rf,cf] = size(files); cd(curdir); I = imread([dir_train files(1).name]); I = imresize(I, im_res); [I_row,I_col] = size(I); PCA_DIM_MAX = I_row * I_col; fprintf('Image Resolution : [%d x %d] = %d \n', I_row, I_col, I_row * I_col); recognition_accuracy = []; %%% Determine which PCA dimensionalities to be used %PCA_DIM_VEC = [10:10:PCA_DIM_MAX]; PCA_DIM_VEC = [2:2:100]; for PCA_DIM = PCA_DIM_VEC %%% TRAINING PHASE %%% read training set curdir = cd; cd(dir_train); files = feval('dir','*.BMP'); [rf,cf] = size(files); cd(curdir); %%% Initialize training feature matrix and class/inst label matrix M_train_data = []; M_train_labels = []; fprintf('Training face recognizer...'); for i=1:rf %%% read image I = imread([dir_train files(i).name]); %%% resize image I = imresize(I, im_res); %%% convert image to vector [I_row,I_col] = size(I); I_vector = double(reshape(I', 1, I_row*I_col)); %%% add image vector to the training data matrix as a row vector M_train_data = [M_train_data; I_vector]; %%% add class/instance label to the label matrix class_label = str2num(files(i).name(1:2)); inst_label = str2num(files(i).name(3)); M_train_labels = [M_train_labels; [class_label inst_label]]; end [r_M_train, c_M_train] = size(M_train_data); %%% calculate PCA transformation matrix : tmatrix %%% calculate the feature vectors of training images : %%% M_train_data_PCA %%% Here, write your own code or function!!! [M_train_data_PCA, tmatrix ] = my_pca_algorithm(M_train_data, PCA_DIM); %%% TESTING PHASE fprintf('Testing face recognizer....\n'); %%% read test images curdir = cd; cd(dir_test); files = feval('dir','*.BMP'); [rf,cf] = size(files); cd(curdir); Test_Similarity = []; for i=1:rf I_test_image = imread([dir_test files(i).name]); %%% resize image I_test_image = imresize(I_test_image, im_res); test_class_label = str2num(files(i).name(1:2)); test_inst_label = str2num(files(i).name(3)); [I_row, I_col] = size(I_test_image); %%% convert test image to vector I_test_vector = double(reshape(I_test_image', 1, I_row*I_col)); %%% compute feature vector of the test image %%% write your own code here test_vector = my_own_code; [rtmat, ctmat] = size(tmatrix); %%% compute the similarity of each training set image to the test image %%% Initialize similarity vector sim_vec = zeros(r_M_train, 3); for j = 1:r_M_train %%% calculate the similarity between the training vector and the %%% test vector train_vector = M_train_data_PCA(j, :); similarity = sqrt(sum((train_vector - test_vector).^2)); %%% Euclidean distance sim_vec(j, :) = [similarity M_train_labels(j,:)]; end %%% sort similarity vector according to similarities sorted_similarity = sortrows(sim_vec, 1); Test_Similarity(i).Test_Class = test_class_label; Test_Similarity(i).Test_Inst = test_inst_label; Test_Similarity(i).Similarity = sorted_similarity; Test_Similarity(i).Filename = files(i).name; end %%% Output classification performance [rTest, cTest] = size(Test_Similarity); rank = 1; %%% calculate recognition performance for a rank-n scenario error_count = 0; for i = 1:cTest nearest_training_class_labels = Test_Similarity(i).Similarity(1:rank, 2); if sum(nearest_training_class_labels == Test_Similarity(i).Test_Class) == 0 error_count = error_count + 1; end end classification_accuracy = (1 - (error_count / r_M_train)) * 100; recognition_accuracy = [recognition_accuracy; [PCA_DIM classification_accuracy]]; fprintf('Rank-1 Recognition Accuracy: %5.2f\n\n', classification_accuracy); end figure; plot(recognition_accuracy(:,1),recognition_accuracy(:,2), 'r.-') axis([min(PCA_DIM_VEC) max(PCA_DIM_VEC) 0 100]); title_str = sprintf('Recognition Accuracies for different PCA dimensionalities'); title(title_str); xlabel('PCA dimensionality'); ylabel('Recognition Rate'); drawnow;