Проблема в ответе SVM opencv
Я работаю над системой обнаружения рака молочной железы и использую набор данных miniMias. Я на последнем этапе, я извлекаю функции SIFT,SURF из ROI, и для разных ROI у меня разное количество функций, поэтому я получил разное количество дескрипторов. Что я делаю?
- Нахождение наименьшего числа SIFT,SURF дескрипторов всего набора данных (так, чтобы размер обучающих данных был одинаковым).
- Вставка обоих SIFT,SURF дескрипторов (от начального индекса до минимальной длины) в одном векторе (сначала просеять, а затем перебрать)
Вот так я передаю функции в SVM, но не получаю желаемого ответа на данные тестирования, точность данных тестирования составляет менее 50%. Я также пытался перетасовать, но тот же результат. Есть ли проблемы с функциями? Может кто-нибудь сказать, что мне делать?
Вот как я устанавливаю параметры SVM.
CvSVMParams params=new CvSVMParams();
params.set_svm_type(CvSVM.C_SVC);
params.set_kernel_type(CvSVM.LINEAR);
TermCriteria termC = new TermCriteria(TermCriteria.MAX_ITER, 100, 1e-6);
params.set_term_crit(termC);
CvSVM classifier = new CvSVM();
classifier.train(feature, label, new Mat(), new Mat(), params);
1 ответ
В SVM есть много параметров, которые помогают нам получать точные результаты. Вот некоторые из них:
1) Выбирая подходящий тип Ядра для наших обучающих данных, вы используете Линейное ядро, пытаясь использовать другие типы ядер, такие как RBF, и посмотрите на точность, затем выберите тип ядра с максимальной точностью. Кстати, RBF в основном используется для типов ядра и лучше работает для нелинейных разделимых наборов данных.
2) Выбор оптимальных параметров С и гамма. Вы должны выбрать оптимальные значения для параметров C и гамма в opencv SVM, или вы также можете использовать метод train_auto SVM вместо поезда, тогда этот метод автоматически выберет оптимальные значения для C, гамма и других параметров.
Используйте код, подобный этому, это C++, но очень легко изменить его на Java
cv::SVMParams params;
params.kernel_type = CvSVM::RBF; //CvSVM::RBF, CvSVM::LINEAR ...
params.svm_type=SVM::C_SVC;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,100000,0.000001);
SVM svm; svm.train_auto(samples,labels,Mat(),Mat(),params,2,SVM::get_default_grid(SVM::C),SVM::get_default_grid(SVM::GAMMA),SVM::get_default_grid(SVM::P),SVM::get_default_grid(SVM::NU),
SVM::get_default_grid(SVM::COEF),SVM::get_default_grid(SVM::DEGREE),false);
char *fs="svmFile.yml";
svm.save(fs);