【问题标题】:Using LIBSVM in MatLab for Multi Class image classification在 MatLab 中使用 LIBSVM 进行多类图像分类
【发布时间】:2014-04-07 16:07:26
【问题描述】:

我在 MatLab 中使用 LIBSVM 来尝试对图像进行分类。

我知道 SVM 是一个二元分类模型,但是我想知道如何将它用作多类分类模型。

是否可以训练成对的数据(即汽车和非汽车、马和非马、人和非人),然后通过将图像与所有三个模型进行比较来预测图像属于哪个类别?如果是这样,我怎么能做到这一点?我的测试标签向量是什么?

【问题讨论】:

  • 感谢您的回复。在我上面提到的情况下 - 生成了 3 个模型,然后我是否会为每个模型执行 svmpredict 三次,并接受预测准确度得分最高的那个?

标签: matlab svm libsvm


【解决方案1】:

是的,您的建议是一个好方法。它被称为one-vs-all strategy

您需要为每个类训练单独的 SVM。输出数据将是一个二进制变量,如果属于该类,则等于 1,否则为 0。然后,为了对一个新项目进行分类,请在每个 SVM 中运行它并选择输出最高的一个(输出最接近 1)。

【讨论】:

    【解决方案2】:

    作为@Dan的补充回答,下面是我之前post的相关代码:

    model = cell(NumofClass,1);  % NumofClass = 3 in your case
    for k = 1:NumofClass
        model{k} = svmtrain(double(trainingLabel==k), trainingData, '-c 1 -g 0.2 -b 1');
    end
    
    %% calculate the probability of different labels
    
    pr = zeros(1,NumofClass);
    for k = 1:NumofClass
        [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
        pr(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
    end
    
    %% your label prediction will be the one with highest probability:
    
    [~,predctedLabel] = max(pr,[],2);
    

    【讨论】:

    • 感谢您的帮助。你能解释一下为什么你使用double(trainingLabel==k)而不是double(trainingLabel)吗?另外 - 在生成模型时,我使用了 15 个汽车实例(1 个在训练标签的相应位置)和 15 个非汽车实例(-1 在训练标签的相应位置)。我可以为每个非类的实例使用相同的 15 个随机对象 - 即非马,非人?
    • 谢谢格温吉。 trainingLabel==K 表示你想得到模型预测你的实例属于K的概率,然后选择概率最大的K个数。你的问题二,答案是肯定的。
    • 最后一个问题 - 在运行 svmpredict 时,假设我有 20 辆汽车,我想决定它们属于三个等级中的哪一种 - 我可以只使用 20 辆汽车吗和二十个“1”的测试标签向量?或者我必须使用 20 辆汽车和 20 辆非汽车才能使用 40 个“1 和 -1”的测试标签向量?非常感谢您的帮助。
    • 我建议您使用其中的 40 个,因为您可能需要获得模型可预测性的误报/误报。
    猜你喜欢
    • 2012-12-10
    • 2013-08-27
    • 2014-06-14
    • 2014-04-07
    • 2013-10-21
    • 2015-09-09
    • 2015-12-18
    • 2017-03-05
    • 2011-01-25
    相关资源
    最近更新 更多