0

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

4

2 回答 2

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());
于 2016-04-06T22:05:55.723 回答
0

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

于 2016-04-14T22:06:41.830 回答