OpenCV - 随机森林示例

时间:2011-09-30 10:33:54

标签: c++ opencv decision-tree random-forest

有没有人有一些使用随机森林和2.3.1 API Mat而不是cvMat的例子?

基本上我有一个Matrix Mat数据,由1000行和16x16x3元素组成,Matrix Mat响应1000x1矩阵,该矩阵保存每行所属的类。我想在此运行随机森林算法。

1 个答案:

答案 0 :(得分:1)

您已经以正确的格式获得了数据;剩下的就是实例化CvRTrees对象并执行预测。

可以找到随机树v2.3的文档here。您还需要查看CvStatModel::train()文档,该文档实际上包含CvRTree::train的大多数参数的说明。 Tom在你应该使用的评论中引用了一个很好的完整例子。

除了您的数据,您还需要一个Mat来指定每个属性的类型。这个Mat的每个输入属性都有一行,输出类型有一行(所以16x16x3 + 1行,在你的情况下)。

或者,您可以使用CvRTParams对象指定参数,例如树的数量,最大深度等。我使用下面示例中的默认值。

如果您愿意,可以传入valIdx和sampleIdx Mats,分别指定哪些属性和哪些数据行用于训练。这可能对选择训练/验证数据很有用,而不需要做一堆体操就可以将它们放在单独的垫子中。

这是一个简单的例子:

#define ATTRIBUTES_PER_SAMPLE (16*16*3)
// Assumes training data (1000, 16x16x3) are in training_data
// Assumes training classifications (1000, 1) are in training_classifications

// All inputs are numerical. You can change this to reflect your data
Mat var_type = Mat(ATTRIBUTES_PER_SAMPLE + 1, 1, CV_8U );
var_type.setTo(Scalar(CV_VAR_NUMERICAL) ); // all inputs are numerical

// Output is a category; this is classification, not regression
var_type.at<uchar>(ATTRIBUTES_PER_SAMPLE, 0) = CV_VAR_CATEGORICAL;

// Train the classifier
CvRTrees* rtree = new CvRTrees;
rtree->train(training_data, CV_ROW_SAMPLE, training_classifications,
             Mat(), Mat(), var_type);