如何使用OpenCV RTrees进行二进制分类?

时间:2016-04-06 02:13:39

标签: machine-learning classification random-forest opencv3.1

RTrees API似乎在不同版本中发生了变化。 RTrees 2.4.1 documentation表示它支持回归和分类,但我不知道如何做到这一点。

我想在OpenCV 3.1中使用RTree作为二进制分类器,虽然文档没有说明任何内容,但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的响应类型进行设置。

来自OpenCV源代码中的tree.cpp

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

目前,我还没有看到任何配置TrainData对象的方法来返回此信息。也许是因为我的训练课程被存储为花车而不是整数?如果我没记错的话,数据类型必须是CV_32F,但也许我在某处犯了错误。

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

查看示例〜/ opencv / samples / cpp / letter_recog.cpp 这是一个使用RTrees 26个类(字母)的例子。要将它用于二进制类数据,您只需要使用2个类标签(代码中的响应)提供数据