Распознавание лиц с использованием PCA на Matlab
Я пытаюсь классифицировать набор изображений с использованием PCA на Matlab. Учебный набор содержит ~1800 изображений 380 человек, каждое изображение с уникальной этикеткой (ID) человека. Тестовый набор содержит ~750 изображений тех же 380 человек (разные изображения), каждое изображение с соответствующей меткой (ID) человека. Все изображения 160 х 128 пикселей.
Мой код выглядит следующим образом.
img_train{i}
содержит i-е оригинальное изображение в тренировочном наборе, img_test{i}
содержит i-е оригинальное изображение в тестовом наборе.
euclide_dist = zeros(total_TrainImageFiles,1);
num_correct_labels = 0;
% Reshape 2D training images into 1D image vectors
train_img = zeros(irow*icol,total_TrainImageFiles);
for i = 1 : total_TrainImageFiles
temp = reshape(img_train{i}',irow*icol,1);
train_img(:,i) = temp;
end
% Calculate mean image vector
mean_face = mean(train_img,2);
% Subtract mean face from all training images
centred_data = train_img - repmat(mean_face, 1, total_TrainImageFiles);
% Determine eigenvectors and eigenvalues using SVD
[U, D, V] = svd(centred_data,0);
d = 10;
% Generate feature vectors from training set for subsequent classification
% Keep the top 'd' eigenvectors
eigenvectors = U(:,1:d);
% Project the training images into the facespace to generate the training feature vectors
train_features = eigenvectors' * centred_data;
% Classify testing images
for i = 1 : total_TestImageFiles
% Reshape 2D test image into 1D image vectors
test_img = reshape(img_test{i}',irow*icol,1);
% Subtract mean face from test image
centred_test_img = double(test_img) - mean_face;
% Project test image onto the facespace
test_features = eigenvectors' * centred_test_img;
% Calculate the euclidian distance of all projected trained images from the projected test image
for j = 1 : total_TrainImageFiles
edist = (norm(train_features(:,j) - test_features))^2;
euclide_dist(j) = edist;
end
% Find the minimum distance and compare class labels
[euclide_dist_min,train_index] = min(euclide_dist);
predicted_labels(i) = training_label(train_index);
if training_label(train_index) == testing_label(i)
num_correct_labels = num_correct_labels + 1;
end
end
% Calculate accuracy
accuracy = double(num_correct_labels) / double(total_TrainImageFiles);
Я пробовал с d = 10 и d = 50, но моя точность очень низкая, ~1,5% до 2,5%. Что не так с моим кодом?