我正在使用libsvm matlab实现人脸识别。主要是我的数据集由每个图像的一行特征向量组成。我的数据库中有两个科目。我需要分类器将与subject1相关的输入样本预测为具有predict_label = 0,并且将与subject2相关的样本输入为具有predict_label = 1,并且将除0或1之外的predict_label的任何值分类为异常值。但每次我得到相同的预测标签,无论输入样本图像如何。这是我正在使用的代码。我将GLCM与LBP结合在一个特征向量中,然后使用zscore matlab函数对整个数据集进行标准化:
clear all;
close all;
clc;
img=imread('F:\amal2\frame33.jpg');
img=rgb2gray(img);
Training=xlsread('F:\GLCMLBPF.xlsx');
Group=xlsread('F:\GLCMLBPindex.xlsx');
% k=2;
% Class = knnclassify(Sample, Training, Group, k, 'cosine' , 'nearest');
FaceDetect = vision.CascadeObjectDetector;
figure(1),imshow(img);
BB = step(FaceDetect,img);
for i = 1:size(BB,1)
rectangle('Position',BB(i,:),'LineWidth',3,'LineStyle','-','EdgeColor','r');
end
S=[];
for i = 1:size(BB,1)
J= imcrop(img,BB(i,:));
figure(2),imshow(J);
% S(i,:)=H1;
I=double(J);
[eigvector, eigvalue] = PCA(I);
Y = I*eigvector;
mapping=getmapping(8,'u2');
H1=LBPV(J,1,8,mapping);
GLCM2 = graycomatrix(Y,'Offset',[2 0;0 2]);
stats = GLCM_Features1(GLCM2,0);
s1=struct2array(stats);
s2=H1;
S(i,:)=[s1,s2];
end
Sample=[S(:,1),S(:,3),S(:,5),S(:,7),S(:,9),S(:,13),S(:,15),S(:,17),S(:,19),S(:,21),S(:,33),S(:,37),S(:,39),S(:,41),S(:,43),S(:,57),S(:,61),S(:,64)];
TF=isempty(Sample);
if TF~=1
model = svmtrain(Group,Training,'-c 0.3 -g 0.5');
Label=1;
[~, ~, predictions] = svmpredict(Label,Sample,model);
if predictions==0
figure(2),imshow(J);title('Hassan Ameen');
elseif predictions==1
figure(2),imshow(J);title('Amal Ali');
else
figure(2),imshow(J);title('outlier');
end
end
请告诉我如何使用libsvm实现我的目标?
答案 0 :(得分:0)
看起来你正在做的事情看起来不会起作用。预测是一个列表。您似乎没有在代码中迭代它。尝试打印预测并查看它返回的内容。
前一段时间我用MATLAB做了一些非常类似的事情(还有几个类)。现在我只使用libsvm与python,但如果我没记错,它们几乎是一样的。
为了给出一个更一般的答案(解决你想要做的事情),我理解它的方式是你有2个班级。主题1和主题2.您想知道它是否属于这些类别之一。如果是,则要将其标记为。如果没有,您想将其标记为异常值。
要接近这个,你有两个主要选择
1)更容易(但可能不太准确 - 我需要查看您的数据集以确认):有三个类。 Subject1,Subject2,Others。将这些类指示为1,2和3.我只使用了python libsvm,但我猜你的Training变量是一个列表列表,你的Group变量只是一个列表,它的顺序相同,表示该组落入。
然后用python我有效地做了:
prob = svmutil.svm_problem(y, x)
param = svmutil.svm_parameter('-t 0 -b 1')
m = svmutil.svm_train(prob, param)
pred_labels, (ACC, MSE, SCC), pred_values = svmutil.svm_predict(ytest, xtest, m)
对我来说,pred_labels变量是返回的第一个东西(您可能想要检查),但如果您没有指定-b参数,则p_val将与p_label相同。
2)第二个选项是只有两个类,但是传递-b参数来标记它以进行概率估计。这将允许您手动配置每个类所需的概率(未将其标记为异常值)。