5

Ich kann nicht scheinen, die Parameter korrekt zu übergeben, um einen Random Forest-Klassifizierer in opencv von Python zu trainieren.Random Forest funktioniert nicht in opencv python (cv2)

Ich schrieb eine Implementierung in C++, die richtig funktioniert, aber nicht die gleichen Ergebnisse in Python erhalten.

fand ich einige Beispiel-Code hier: http://fossies.org/linux/misc/opencv-2.4.7.tar.gz:a/opencv-2.4.7/samples/python2/letter_recog.py

die, dass Sie in den Parametern in einem dict passieren sollte, um anzuzeigen scheint. Hier ist der Code Ich verwende:

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); 

Ich kann sagen, dass der Klassifikator richtig trainiert wird immer, aber es ist bei weitem nicht so genau wie die, die ich mit den gleichen Parametern in C++ trainiert. Ich bin ziemlich sicher, dass die Parameter bestätigt werden, weil ich unterschiedliche Ergebnisse erhalte, wenn ich die Werte tweeze.

Ich habe festgestellt, dass, wenn ich den Klassifizierer in eine Datei ausgeben, hat es nur einen Baum. Ich bin mir ziemlich sicher, dass das das Problem ist. Ich schaute auf die OpenCV Umsetzung:

http://www.code.opencv.org/svn/gsoc2012/denoising/trunk/opencv-2.4.2/modules/ml/src/rtrees.cpp

meine Parameter gegeben, es ausgeben soll einen Wald mit 1000 Bäumen. Ich habe versucht, die max_num_of_trees_in_the_forest Argumente auf alle möglichen verrückten Werte zu setzen, und es hat das Verhalten von OpenCV nicht verändert.

Gedanken?

Antwort

4

nicht sicher, ob dies viel helfen, aber ich glaube:

n_active_vars=0 

sollte

nactive_vars=0 

auch sein, können Sie mit dem term_crit Parameter experimentieren, um versuchen wollen. Zum Beispiel versuchen Sie:

term_crit=(cv2.TERM_CRITERIA_MAX_ITER,1000,1) 

in Ihrem Wörterbuch.

Ich glaube, dies wird die Kriterien für die Beendigung festlegen, wenn 1000 Bäume in den Wald hinzugefügt werden.

+0

Dieser zweite Vorschlag schien zu funktionieren, aber wie haben Sie es herausgefunden? War es nur eine begründete Vermutung, wie einige der anderen Klassifikatoren trainiert wurden? Die Struktur CvRTreeParams Daten werden hier definiert: http://docs.opencv.org/modules/ml/doc/random_trees.html#cvrtparams-cvrtparams Wie Sie die Zuordnung zwischen dem C++ Typ herauszufinden, do und seine Python-Darstellung? – user3043337

+0

Ich suchte in der cv2.so-Datei nach den Textsymbolen und sah max_num_of_trees_in_the_forest nicht, also ging ich durch die C++ - Quelle, um weitere Möglichkeiten zu finden, dies zu tun. Soweit mir bekannt ist, wird das Mapping automatisch generiert, so dass es nur eine Frage der Erfahrung/Praxis ist, schrittweise zu lernen, wie es kartiert wird. Es scheint mir nicht sehr befriedigend - obwohl ich viel lieber Python-Bindungen als die C++ - im Allgemeinen verwenden. –

Verwandte Themen