RTrees API似乎在不同版本中发生了变化。 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
成员变量,并根据给定的train()
的TrainData响应类型进行设置。
从tree.cpp在OpenCV的源代码
_isClassifier = data->getResponseType() == VAR_CATEGORICAL;
目前,我没有看到配置TrainData对象返回此的任何方法。也许这是因为我的训练课程是作为花车而不是整数存储的?如果我没有记错,数据类型必须是CV_32F,但也许我在某处出错了。