Проблема в ответе SVM opencv

Я работаю над системой обнаружения рака молочной железы и использую набор данных miniMias. Я на последнем этапе, я извлекаю функции SIFT,SURF из ROI, и для разных ROI у меня разное количество функций, поэтому я получил разное количество дескрипторов. Что я делаю?

  1. Нахождение наименьшего числа SIFT,SURF дескрипторов всего набора данных (так, чтобы размер обучающих данных был одинаковым).
  2. Вставка обоих 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);
Другие вопросы по тегам