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,但也许我在某处犯了错误。
答案 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个类标签(代码中的响应)提供数据