Почему я получаю так много собственных значений нуля в моей реализации собственных граней Matlab? - PullRequest
0 голосов
/ 17 февраля 2012

Я пытаюсь реализовать очень простой расчет собственного лица в 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

1 Ответ

1 голос
/ 17 февраля 2012

У меня нет большого опыта работы с компьютерным зрением / распознаванием изображений, но я думаю, что вы, возможно, захотите

diff = avgFace - faces(:,i);

в вашем втором цикле. В противном случае он просто вычитает постоянную из avgFace каждый раз, и поэтому A (и, следовательно, L) получает ранг только 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...