RTrees API は、バージョンごとに変更されているようです。RTrees 2.4.1のドキュメントには、回帰と分類の両方をサポートしていると書かれていますが、それがどのように可能かはわかりません。
OpenCV 3.1 で RTrees をバイナリ分類子として使用したいのですが、ドキュメントにはそれについて何も書かれておらず、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 のソース コードを調べました。 クラスを拡張する objectRTrees
の隠し実装を作成します。このクラスはメンバー変数を管理し、 に与えられた TrainData の応答タイプに従って設定します。DTReesImplForRTrees
DTreesImpl
_isClassifier
train()
OpenCV ソース コードの tree.cpp から
_isClassifier = data->getResponseType() == VAR_CATEGORICAL;
現時点では、これを返すように TrainData オブジェクトを構成する方法はありません。おそらく、トレーニング クラスが整数ではなく浮動小数点数として格納されているためでしょうか? 私の記憶が正しければ、データ型は CV_32F である必要がありましたが、どこかでエラーを起こした可能性があります。