Распознавание лиц с использованием 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%. Что не так с моим кодом?

0 ответов

Другие вопросы по тегам