我使用以下方法提取 PCA 功能:
function [mn,A1,A2,Eigenfaces] = pca(T,f1,nf1)
m=mean(T,2), %T is the whole training set
train=size(T,2);
A=[];
for i=1:train
temp=double(T(:,i))-m;
A=[A temp];
end
train=size(f1,2); %f1 - Face 1 images from training set 'T'
A=[];
for i=1:train
temp=double(f1(:,i))-m;
A1=[A1 temp];
end
train=size(nf1,2); %nf1 - Images other than face 1 from training set 'T'
A=[];
for i=1:train
temp=double(nf1(:,i))-m;
A2=[A2 temp];
end
L=A'*A;
[V D]=eig(L);
for i=1:size(V,2)
if(D(i,i)>1)
L_eig=[L_eig V(:,1)];
end
end
Eigenfaces=A*L_eig;
end
然后我只从训练数据中投射出面部1(+1级):
功能1
for i=1:15 %number of images of face 1 in training set
temp=Eigenfaces'*A1(:,i);
proj_img1=[proj_img1 temp];
end
然后我从训练数据中投射其余的面(-1级):
功能2
for i=1:221 %number of images of faces other than face 1 in training set
temp=Eigenfaces'*A2(:,i);
proj_img2=[proj_img2 temp];
end
功能3 然后使用以下方法获得输入图像矢量:
diff=double(inputimg)-mn; %mn is the mean of training data
testfeaturevector=Eigenfaces'*diff;
我将功能1和2的结果写在CSV文件中,标签分别为+1和-1。 然后我使用LIBSVM来获得真实标签时的准确度,它返回0%,当我试图预测标签时它是-1而不是+1。
准确度为0%?
基本上我的模型没有正确训练,我没有看到错误。
任何建议都将不胜感激。
答案 0 :(得分:1)
使用Eigenfaces
作为训练集,用1或-1组成label
向量(如果Eigenfaces
的第i列引用1,则{{1}中的第i个元素是1,否则为-1)。并在label
函数中使用Eigenfaces
和label
。
答案 1 :(得分:1)
@ lennon310:
for i=1:length(Eigenfaces)
temp=Eigenfaces'*A(:,i);
proj_imgs=[proj_imgs temp];
end
答案 2 :(得分:1)
@ lennon310:
diff=double(inputimg)-mn; %mn is the mean of training data
testfeaturevector=Eigenfaces'*diff;
答案 3 :(得分:0)
坦率地说,你的代码很乱。
一个值得怀疑的部分:
data = reshape(data, M*N,1);
这不会使data
成为只有1列的矩阵吗?这没有意义。
在eigenfaces上查看本教程。其中有代码和示例向您展示如何操作。有关详细信息,请参阅相关网页here。 可以找到Matlab / Octave代码here。
答案 4 :(得分:0)
@lennon310:
temp=double(testimg)-m; %where 'm' is the mean of the training images
L=temp'*temp;
[V D]=eig(L);
for i=1:size(V,2)
if(D(i,i)>1)
L_eig=[L_eig V(:,1)];
end
end
Eigenfaces=temp*L_eig;