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

Posted

技术标签:

【中文标题】如何使用 OpenCV RTrees 进行二元分类?【英文标题】:How to use OpenCV RTrees for binary classification? 【发布时间】:2016-07-26 05:09:24 【问题描述】:

RTrees API 似乎在不同版本之间发生了变化。 RTrees 2.4.1 documentation 表示它同时支持回归和分类,尽管我不明白如何做到这一点。

我想在 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成员变量,并根据给train()的TrainData的响应类型进行设置。

来自 OpenCV 源代码中的 tree.cpp

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

目前,我没有看到任何配置 TrainData 对象以返回它的方法。也许是因为我的培训课程存储为浮点数而不是整数?如果我没记错的话,数据类型必须是CV_32F,但也许我在某个地方出错了。

【问题讨论】:

【参考方案1】:

我会回答我自己的问题,因为我发现找到任何明显的文档有点令人困惑和困难。通过查看 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());

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何使用 OpenCV RTrees 进行二元分类?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 获取 Rtrees 值不起作用 - CopyTo 类型不匹配

OpenCV 随机决策森林:如何获得后验概率

RandomForestClassifier 如何进行分类?

如何将图像输入 CNN 以进行二元分类

sklearn 使用 prob_a 进行逻辑二元分类

如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?