如何使用 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 类型不匹配