2014-10-20 5 views
3

저는 지금 당분간 붙어 있습니다. OpenCV의 SVM 구현은 선형 커널에서는 작동하지 않습니다. 코드에 버그가 없다고 확신합니다. kernel_type을 RBF 또는 POLY로 변경하면 나머지는 그대로 유지합니다.OpenCV Linear SVM 교육이 아닙니다

나는 그것이 작동하지 않는다는 이유는 생성 된 모델을 저장하고 체크 아웃하기 때문입니다. 지원 벡터 수를 1로 표시합니다. RBF 또는 POLYnomial 커널에서는 그렇지 않습니다.

OpenCV의 SVM 구현을 사용해 본 적이 있지만 선형 커널은 사용하지 않았습니다. POLY 커널에서 degree을 1로 설정하려고했는데 같은 모델이됩니다. 그래서 나는 여기 뭔가가 버그라고 믿게 만든다. 필요한 경우

코드 구조

는 :

Mat trainingdata; //acquire from files. done and correct. 
Mat testingdata;  //acquire from files. done and correct again. 
Mat labels;   //corresponding labels. checked and correct. 

SVM my_svm; 
SVMParams my_params; 
my_params.svm_type = SVM::C_SVC; 
my_params.kernel_type = SVM::LINEAR; //or poly, with my_params.degree = 1. 
my_param.C = 0.02; //doesn't matter if I set it to 20000, makes no difference. 

my_svm.train(trainingdata, labels, Mat(), Mat(), my_params); 
//train_auto(..) function with 10-fold cross-validation takes the same time as above (~2sec)! 
Mat responses; 
my_svm.predict(testingdata, responses); 
//responses matrix is all wrong. 

나는 테스트 할 다른 클래스에서 하나 개의 클래스 600에서 500 개 샘플을 가지고, 내가 할 올바른 분류는 다음과 같습니다 1/500 및 600분의 597을.

가장 미친 부분 : libSVM의 MATLAB 래퍼에서 동일한 데이터를 사용하여 동일한 실험을 수행했으며 작동합니다. 그냥 OpenCV 버전을 사용하려고했습니다.

+0

데이터가 선형으로 분리 가능합니까? 더 멋진 커널과 함께 작동한다는 사실은 비선형으로 분리 가능한 데이터를 강력하게 제안합니다 ... 선형 커널을 사용하여 libSVM을 교육하고 있습니까? –

+0

SVM의 공식을 알고 있습니까? C를 0.02 또는 20000으로 설정할 때 차이가 있어야합니다. 올바르게 설정해야합니다. 모든 매개 변수에 대해 동일 할 수 없습니다. 또한 엡실론 매개 변수를 0.001로 설정해야하며, 기본값은 AFAIK입니다. 마지막으로'train()'대신'train_auto()'를 실행하면 어떻게 될까요? – guneykayim

+1

표준 예제 예제/cpp/points_classifier.cpp을 적용 해보십시오. svm 분류 자도 있습니다. 나는 그것을 검사했고, 효과가 있었다. –

답변

2

선형 CvSVM을 사용하는 지원 벡터가 하나만있는 버그는 아닙니다.

OpenCV는 선형 SVM을 하나의 지원 벡터로 최적화합니다.
여기서는 지원 벡터가 분류 마진을 정의하고 실제 분류를 수행하기 위해 분리 초평면 만 필요하며 하나의 벡터만으로 정의 할 수 있습니다.

매개 변수 은 훈련 데이터가 선형으로 분리 가능한지 여부와 상관이 없습니다. 아마도 그것은 당신의 경우입니다.

+0

분리 초평면이 _ 하나만 지원 벡터를 필요로하는지 이해할 수 없습니다. 게다가 이전에 선형 SVM을 사용했고 많은 지원 벡터 (overfit 및 generalization의 아이디어와 잘 작동 함)를 얻었습니다. –

+0

그리고 'C'는 노이즈가 분류에 영향을 줄 경우 유용 할 것입니다. 소음의 존재는 거대한 가정이 아닙니다 (적어도이 경우). –

+0

svm이 훈련 할 때 여백이나 안쪽에있는 지원 벡터를 사용하고 있습니다 ("소프트"마진을 사용하는 경우). 그러나 opencv가 훈련 된 분류기를 저장할 때 - 오직 필요한 정보는 하나의 벡터 (초평면의 법선)이며, 이는 식별 가능한 초평면을 정의합니다. http://www.songho.ca/math/plane/plane.html – Temak