0

Matlabで非常に基本的な固有顔計算を実装しようとしています。それは一種の仕事ですが、私は2つの意味のある固有値しか得られません-残りはゼロです。対応する固有ベクトルは、画像に変換するときにそれらのほとんどが固有顔を表示するため、正しいように見えます。

では、なぜ私の固有値のほとんどがゼロなのですか?固有顔をそれらの重要度(最大の大きさの固有値)でソートするために、それらがゼロとは異なる必要があります。

私は400枚の画像を読んでいます。各サイズはh/w = 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
4

1 に答える 1

1

私はコンピュータビジョン/画像認識の経験があまりありませんが、あなたが望むかもしれないと思います

diff = avgFace - faces(:,i);

2番目のforループで。それ以外の場合は、毎回avgFaceから定数を減算するだけなので、A(したがってL)のランクは2になります。

于 2012-02-17T18:47:00.057 に答える