2016-04-06 43 views
0

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,但也许我在某处出错了。

回答

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

结帐的示例〜/ OpenCV的/样品/ CPP/letter_recog.cpp 它是使用了26类(字母)的rtrees一个例子。要将其用于二进制类数据,您只需使用2个类别标签(代码中的响应)提供数据