0

API RTrees, похоже, изменился в разных версиях. RTrees 2.4.1 documentation говорит, что он поддерживает как регрессию, так и классификацию, хотя я не вижу, как это можно сделать.Как использовать OpenCV RTrees для двоичной классификации?

Я хочу использовать RTrees как бинарный классификатор в OpenCV 3.1, хотя в документации ничего не говорится об этом, а RTrees :: isClassifier() возвращает false.

m_pTrees->setMaxDepth(20); 
m_pTrees->setMinSampleCount(10); 

cv::TermCriteria criteria(cv::TermCriteria::EPS, 0, 0); 
m_pTrees->setTermCriteria(criteria); 
m_pTrees->setCalculateVarImportance(false); 
m_pTrees->setRegressionAccuracy(0); 

// I assumed setting categories makes it a classifier. 
m_pTrees->setMaxCategories(2); 

// Always returns a float (that looks like the average of votes). 
// I expected a single 0 or 1 (since max categories is 2). 
m_pTrees->predict(sample); 

РЕДАКТИРОВАТЬ: Я сделал еще несколько работ и посмотрел исходный код OpenCV. RTrees создает скрытую реализацию объекта DTReesImplForRTrees, который расширяет класс DTreesImpl. Этот класс управляет переменной-членом _isClassifier и устанавливает его в соответствии с типом ответа TrainData, заданным train().

С tree.cpp в OpenCV исходного кода

_isClassifier = data->getResponseType() == VAR_CATEGORICAL; 

На данный момент, я не вижу способа конфигурирования объекта TrainData вернуть это. Возможно, это потому, что мои учебные классы хранятся как float вместо целых чисел? Если я правильно помню, тип данных должен был быть CV_32F, но, возможно, я где-то ошибся.

ответ

0

Я отвечу на свой вопрос, так как я счел его немного запутанным и трудным найти какую-либо очевидную документацию. Я только понял, что данные нужно рассматривать категорично, глядя на исходный код для DTreesImpl.

Хотя я не уверен, что это будет иметь большое значение. По общему признанию, я очень новичок в реализации ML и OpenCV.

/** @brief Creates training data from in-memory arrays. 

@param samples matrix of samples. It should have CV_32F type. 
@param layout see ml::SampleTypes. 
@param responses matrix of responses. If the responses are scalar, they should be stored as a 
    single row or as a single column. The matrix should have type CV_32F or CV_32S (in the 
    former case the responses are considered as ordered by default; in the latter case - as 
    categorical) 
*/ 
CV_WRAP static Ptr<TrainData> create(InputArray samples, int layout, InputArray responses, 
          InputArray varIdx=noArray(), InputArray sampleIdx=noArray(), 
          InputArray sampleWeights=noArray(), InputArray varType=noArray()); 
0

Checkout пример ~/OpenCV/образцы/CPP/letter_recog.cpp Это пример использования RTrees для 26 классов (букв). Чтобы использовать его для данных двоичного класса, вам просто нужно передать данные с помощью двух меток класса (ответы в коде)

Смежные вопросы