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 源代码。 RTrees
创建扩展类的DTReesImplForRTrees
对象的隐藏实现。DTreesImpl
此类管理_isClassifier
成员变量并根据给定的 TrainData 的响应类型对其进行设置train()
。
来自 OpenCV 源代码中的 tree.cpp
_isClassifier = data->getResponseType() == VAR_CATEGORICAL;
目前,我没有看到任何配置 TrainData 对象以返回它的方法。也许是因为我的培训课程存储为浮点数而不是整数?如果我没记错的话,数据类型必须是 CV_32F,但也许我在某个地方出错了。