OpenCV 3.0 svm 总是预测 0 (java)

Posted

技术标签:

【中文标题】OpenCV 3.0 svm 总是预测 0 (java)【英文标题】:OpenCV 3.0 svm always predicts 0 (java) 【发布时间】:2016-04-16 00:15:28 【问题描述】:

我是 opencv 的 svm 的新手。我尝试了一个样本分类器,但它只返回 0 作为预测标签。我什至将值 5 用于训练和预测。

我已经更改了大约一百次值,但我就是不明白哪里出了问题。我正在使用带有 Java 的 OpenCV 3.0。这是我的代码:

    Mat labels = new Mat(new Size(1,4),CvType.CV_32SC1);
    labels.put(0, 0, 1);
    labels.put(1, 0, 1);
    labels.put(2, 0, 1);
    labels.put(3, 0, 0);

    Mat data = new Mat(new Size(1,4),CvType.CV_32FC1);
    data.put(0, 0, 5);
    data.put(1, 0, 2);
    data.put(2, 0, 3);
    data.put(3, 0, 8);

    Mat testSamples = new Mat(new Size(1,1),CvType.CV_32FC1);
    testSamples.put(0,0,5);

    SVM svm = SVM.create();
    TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER,100,0.1);
    svm.setKernel(SVM.LINEAR);
    svm.setType(SVM.C_SVC);
    svm.setGamma(0.5);
    svm.setNu(0.5);
    svm.setC(1);
    svm.setTermCriteria(criteria);

    //data is N x 64 trained data Mat , labels is N x 1 label Mat with integer values;
    svm.train(data, Ml.ROW_SAMPLE, labels);

    Mat results = new Mat();
    int predictedClass = (int) svm.predict(testSamples, results, 0);

即使我将标签更改为 1 和 2,我仍然会得到 0.0 作为响应。所以肯定有什么地方绝对错了……我只是不知道该怎么办。请帮忙! :)

【问题讨论】:

首先,我从未使用过 opencv svm 包。我在 C++ 中使用带有 opencv 的 libsvm。因此,在 libsvm 中,您不能(我不知道我在将近一年半前使用它的最新版本)仅针对模型的一个样本测试结果。您必须将多个样本图像(不记得我放了多少图像,尽可能多地放并通过跟踪和错误检查)放入测试文件夹并使用您创建的模型进行检查。对于培训如何你用了多少样品?您的情况可能有多种原因。 【参考方案1】:

我在 C++ 中遇到了类似的问题。我不太确定它在 Java 中是否相同,但在 C++ 中,预测保存在结果矩阵中,而不是作为浮点数返回。

【讨论】:

你能进一步说明你是如何解决你的问题的吗?我也有同样的问题,但找不到解决方案? Mat results = new Mat(); int predictedClass = (int) svm.predict(testSamples, results, 0); 结果 Mat 将具有实际预测,而 predictClass 将始终为零。 @Yirga @KevinBai 非常感谢。这完全是我想要的。不幸的是,OpenCV 文档没有很好地解释这些问题。

以上是关于OpenCV 3.0 svm 总是预测 0 (java)的主要内容,如果未能解决你的问题,请参考以下文章

C++ OpenCV SVM 预测不工作

如何在 Python 中使用 OpenCV 3.0 中的 HOG 功能训练 SVM 分类器?

OpenCV4Android SVM 没有给出正确的预测

OPencv SVM 预测概率

opencv利用svm训练

OpenCVopencv3.0中的SVM训练 mnist 手写字体识别