Я пытаюсь реализовать очень простой расчет собственного лица в Matlab. Это отчасти работает, но я получаю только два значимых собственных значения - остальные равны нулю. Соответствующие собственные векторы кажутся правильными, поскольку большинство из них при преобразовании в изображение будут иметь собственное лицо.
Так почему же большинство моих собственных значений равно нулю? Мне нужно, чтобы они отличались от нуля, чтобы отсортировать собственные грани по значимости (собственные значения наибольшей величины).
Я читаю 400 изображений, каждый размер ч / б = 112/92 px
Их можно найти здесь: http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
код:
clear all;
files = dir('eigenfaces2/training/*.pgm');
[numFaces, discard] = size(files);
h = 112;
w = 92;
s = h * w;
%calculate average face
avgFace = zeros(s, 1);
faces = [];
for i=1:numFaces
file = strcat('eigenfaces2/training/', files(i).name);
im = double(imread(file));
im = reshape(im, s, 1);
avgFace = avgFace + im;
faces(:,i) = im;
end
avgFace = avgFace ./ numFaces;
A = [];
for i=1:numFaces
diff = avgFace - faces(i);
A(:,i) = diff;
end
numEigs = 20;
L = (A' * A) / numFaces;
[tmpEigs, discard] = eigs(L, numEigs);
eigenfaces = [];
for i=1:numEigs
v = tmpEigs(:,i);
eigenfaces(:,i) = A * v;
end
%visualize largest eigenfaces
figure;
for i=1:numEigs
eigface = eigenfaces(:,i);
mmax = max(eigface);
mmin = min(eigface);
eigface = 255 .* (eigface-mmin) ./ (mmax-mmin);
eigface = reshape(eigface, h, w);
subplot(4,5,i); imshow(uint8(eigface));
end