У меня есть векторы признаков некоторых объектов из двух классов, и моя цель — обучить усиленный классификатор с этой информацией. Посмотрев на документация и пример распознавания букв, который я думал, что это было бы просто сделать, но по какой-то причине я получаю следующую ошибку при обучении классификатора:
Ошибка OpenCV: функция / функция не реализована (расширенные деревья могут использоваться только для классификации 2 классов).
Вот соответствующая часть моего кода:
Mat X = Mat::zeros(train_size, feat_size, CV_32F);
Mat Y = Mat::zeros(train_size, 1, CV_32S);
// filling of X with the corresponding features for each training sample
// filling of Y with labels 1 and -1 depending on the class
CvBoostParams params(CvBoost::DISCRETE, 100, 0.95, 1, false, 0);
Mat var_type = Mat(feat_size+1, 1, CV_8U, Scalar::all(CV_VAR_ORDERED));
var_type.ptr<uchar>(feat_size)[1] = CV_VAR_CATEGORICAL;
CvBoost boost;
boost.train(X, CV_ROW_SAMPLE, Y, Mat(), Mat(), var_type, Mat(), params);
Я думаю, что проблема здесь в мате var_type. Насколько я понимаю, он должен содержать одну запись для каждой функции плюс одну запись для ответа. Поскольку моя функция — все числовые измерения, я установил для первых элементов значение CV_VAR_ORDERED, а для последнего элемента — значение CV_VAR_CATEGORICAL.
Кто-нибудь может объяснить мне, почему в OpenCV это не классификация 2-х классов?
Еще одна вещь: для прогнозов мне нужны не сами прогнозируемые ярлыки, а вероятность принадлежности к 1-му классу. Это на самом деле не составит труда вычислить, если бы я мог получить сумму взвешенных голосов. У метода прогнозирования есть флаг returnSum но документация говорит: Если true, тогда вернуть сумму голосов вместо метки класса. Они действительно означают сумму голосов или сумму взвешенных голосов?
Задача ещё не решена.