【问题标题】:Random Forest not working in opencv python (cv2)随机森林在opencv python(cv2)中不起作用
【发布时间】:2013-12-13 16:14:15
【问题描述】:

我似乎无法正确传递参数以从 python 的 opencv 中训练随机森林分类器。

我用 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 的行为。

想法?

【问题讨论】:

    标签: python opencv machine-learning classification random-forest


    【解决方案1】:

    不确定这是否会有很大帮助,但我相信:

    n_active_vars=0
    

    应该是

    nactive_vars=0
    

    另外,您可能希望尝试使用 term_crit 参数。 例如,尝试添加:

    term_crit=(cv2.TERM_CRITERIA_MAX_ITER,1000,1)
    

    进入你的字典。

    我相信这将设置在森林中添加 1000 棵树时终止的标准。

    【讨论】:

    • 第二个建议似乎奏效了,但你是怎么想出来的?这只是一个有根据的猜测,看看其他一些分类器是如何训练的? CvRTreeParams 数据结构在这里定义:docs.opencv.org/modules/ml/doc/…你如何弄清楚 C++ 类型和它的 python 表示之间的映射?
    • 我在 cv2.so 文件中搜索了文本符号,但没有看到 max_num_of_trees_in_the_forest,因此我在 C++ 源代码中挖掘了其他设置方法。据我所知,映射是自动生成的,因此逐渐了解如何映射它只是经验/实践的问题。这对我来说似乎不是很满意——尽管我更喜欢使用 Python 绑定而不是一般的 C++ 绑定。
    猜你喜欢
    • 2011-11-28
    • 2014-08-17
    • 2014-01-20
    • 2013-12-03
    • 2014-11-21
    • 2012-10-25
    • 2014-03-17
    • 2016-05-15
    • 2018-04-10
    相关资源
    最近更新 更多