5

我似乎無法正確傳遞參數來訓練python中的opencv隨機森林分類器。隨機森林不工作在opencv python(cv2)

我在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的行爲。

想法?

回答

4

不知道這是否會多大幫助,但我相信:

n_active_vars=0 

應該

nactive_vars=0 

此外,您不妨嘗試用term_crit參數試驗。 例如,嘗試添加:

term_crit=(cv2.TERM_CRITERIA_MAX_ITER,1000,1) 

進入您的字典。

我相信這會設置標準來終止1000棵樹被添加到森林中。

+0

第二個建議似乎可行,但你是怎麼弄明白的?這只是一個有教育的猜測,看看其他一些分類器是如何訓練的? 的CvRTreeParams數據結構定義如下: http://docs.opencv.org/modules/ml/doc/random_trees.html#cvrtparams-cvrtparams 你如何找出C++類型之間的映射其蟒蛇表示? – user3043337

+0

我在cv2.so文件中搜索了文本符號,沒有看到max_num_of_trees_in_the_forest,所以然後通過C++源代碼來尋找其他設置方法。就我所知,映射是自動生成的,所以它只是逐步學習如何映射的經驗/實踐問題。對我來說這似乎不太令人滿意 - 儘管我一般更喜歡使用Python綁定而不是C++。 –