저는 지금 당분간 붙어 있습니다. 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 버전을 사용하려고했습니다.
데이터가 선형으로 분리 가능합니까? 더 멋진 커널과 함께 작동한다는 사실은 비선형으로 분리 가능한 데이터를 강력하게 제안합니다 ... 선형 커널을 사용하여 libSVM을 교육하고 있습니까? –
SVM의 공식을 알고 있습니까? C를 0.02 또는 20000으로 설정할 때 차이가 있어야합니다. 올바르게 설정해야합니다. 모든 매개 변수에 대해 동일 할 수 없습니다. 또한 엡실론 매개 변수를 0.001로 설정해야하며, 기본값은 AFAIK입니다. 마지막으로'train()'대신'train_auto()'를 실행하면 어떻게 될까요? – guneykayim
표준 예제 예제/cpp/points_classifier.cpp을 적용 해보십시오. svm 분류 자도 있습니다. 나는 그것을 검사했고, 효과가 있었다. –