matlab libsvm多类分类器给出相同的预测标签

时间:2014-05-04 13:28:50

标签: matlab class classification libsvm matlab-cvst

我正在使用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实现我的目标?

1 个答案:

答案 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参数来标记它以进行概率估计。这将允许您手动配置每个类所需的概率(未将其标记为异常值)。