对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);
答案 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);
trainAuto
和train
在class_labels
中的行为应该相同。问题是由于之前的错误修复。所以我为OpenCV创建了一个here来解决问题。