OpenCV SVM参数的建议值

时间:2015-07-02 07:26:04

标签: c++ opencv svm

对OpenCV SVM推荐参数的想法?我正在使用OpenCV示例目录中的letter_recog.cpp,但SVM的准确性非常差!在一次运行中,我只有62%的准确度:

$ ./letter_recog_modified -data /home/cobalt/opencv/samples/data/letter-recognition.data  -save svm_letter_recog.xml -svm

The database /home/cobalt/opencv/samples/data/letter-recognition.data is loaded.
Training the classifier ...
data.size() = [16 x 20000]
responses.size() = [1 x 20000]

Recognition rate: train = 64.3%, test = 62.2%

默认参数为:

model = SVM::create();
model->setType(SVM::C_SVC);
model->setKernel(SVM::LINEAR);
model->setC(1);
model->train(tdata);

将它设置为trainAuto()并没有帮助;它给了我一个奇怪的0%测试准确度:

model = SVM::create();
model->setType(SVM::C_SVC);
model->setKernel(SVM::LINEAR);
model->trainAuto(tdata);

结果:

Recognition rate: train = 0.0%, test = 0.0%

使用yangjie的回复更新:

$ ./letter_recog_modified -data /home/cobalt/opencv/samples/data/letter-recognition.data  -save svm_letter_recog.xml -svm
The database /home/cobalt/opencv/samples/data/letter-recognition.data is loaded.
Training the classifier ...
data.size() = [16 x 20000]
responses.size() = [1 x 20000]

Recognition rate: train = 58.8%, test = 57.5%

结果不再是0%,但准确度比之前的62%差。

将RBF内核与trainAuto()一起使用是最糟糕的吗?

$ ./letter_recog_modified_rbf -data /home/cobalt/opencv/samples/data/letter-recognition.data  -save svm_letter_recog.xml -svm
The database /home/cobalt/opencv/samples/data/letter-recognition.data is loaded.
Training the classifier ...
data.size() = [16 x 20000]
responses.size() = [1 x 20000]

Recognition rate: train = 18.5%, test = 11.6%

参数:

    model = SVM::create();
    model->setType(SVM::C_SVC);
    model->setKernel(SVM::RBF);
    model->trainAuto(tdata);

2 个答案:

答案 0 :(得分:2)

我建议尝试RBF内核而不是线性。 在很多情况下,这是最好的选择...

答案 1 :(得分:0)

我调试了示例代码并找到了原因。

responses是字母的ASCII代码Mat

然而,由SVM::trainAuto训练的SVM返回的预测标签范围为0-25,对应于26个类。通过查看输出文件<class_labels>...</class_labels>中的svm_letter_recog.xml也可以观察到这一点。

因此,在test_and_save_classifier中,r = model->predict( sample )responses.at<int>(i)显然不相等。

我还发现,如果我们使用SVM::train,那么类标签将会是65-89,这就是为什么你最初可以获得正常结果的原因。

解决方案

我不确定这是不是一个bug。但是,如果您现在想在此示例中使用SVM::trainAuto,则可以更改

test_and_save_classifier(model, data, responses, ntrain_samples, 0, filename_to_save);

build_svm_classifier

test_and_save_classifier(model, data, responses, ntrain_samples, 'A', filename_to_save);

更新

trainAutotrainclass_labels中的行为应该相同。问题是由于之前的错误修复。所以我为OpenCV创建了一个here来解决问题。