我似乎无法正确地传递参数来在OpenCV的Python接口中训练随机森林分类器。
我在C++中编写了一个实现,运行正常,但在Python中没有得到相同的结果。
我在这里找到了一些示例代码:http://fossies.org/linux/misc/opencv-2.4.7.tar.gz:a/opencv-2.4.7/samples/python2/letter_recog.py
这似乎表明你应该通过字典传递参数。以下是我使用的代码:
rtree_params = dict(max_depth=11, min_sample_count=5, use_surrogates=False, max_categories=15, calc_var_importance=False, n_active_vars=0, max_num_of_trees_in_the_forest=1000, termcrit_type=cv2.TERM_CRITERIA_MAX_ITER)classifier = cv2.RTrees()classifier.train(train_data, cv2.CV_ROW_SAMPLE, label_data, params=rtree_params);
我可以看出分类器确实被正确训练了,但它的准确性远不如我在C++中使用相同参数训练的分类器。我相当确定这些参数被识别了,因为当我调整这些值时会得到不同的结果。
我注意到当我将分类器输出到文件时,它只有一个树。我相当确定这是问题所在。我查看了OpenCV的实现:
http://www.code.opencv.org/svn/gsoc2012/denoising/trunk/opencv-2.4.2/modules/ml/src/rtrees.cpp
根据我的参数,它应该输出一个包含1000棵树的森林。我尝试将max_num_of_trees_in_the_forest
参数设置为各种极端值,但这并没有改变OpenCV的行为。
有什么想法吗?
回答:
不确定这是否会有很大帮助,但我认为:
n_active_vars=0
应该改为
nactive_vars=0
另外,你可以尝试调整term_crit参数。例如,尝试添加:
term_crit=(cv2.TERM_CRITERIA_MAX_ITER,1000,1)
到你的字典中。
我认为这将设置当森林中添加了1000棵树时终止的标准。