Die RTrees-API scheint sich in verschiedenen Versionen geändert zu haben. Die RTrees 2.4.1 documentation sagt, dass es sowohl Regression und Klassifizierung unterstützt, obwohl ich nicht sehe, wie es möglich ist, dies zu tun.Wie verwende ich OpenCV-RTrees für die binäre Klassifizierung?
Ich möchte RTrees als binären Klassifizierer in OpenCV 3.1 verwenden, obwohl die Dokumentation nichts darüber sagt und RTrees :: isClassifier() gibt false zurück.
m_pTrees->setMaxDepth(20);
m_pTrees->setMinSampleCount(10);
cv::TermCriteria criteria(cv::TermCriteria::EPS, 0, 0);
m_pTrees->setTermCriteria(criteria);
m_pTrees->setCalculateVarImportance(false);
m_pTrees->setRegressionAccuracy(0);
// I assumed setting categories makes it a classifier.
m_pTrees->setMaxCategories(2);
// Always returns a float (that looks like the average of votes).
// I expected a single 0 or 1 (since max categories is 2).
m_pTrees->predict(sample);
EDIT: Ich habe etwas mehr Arbeit geleistet und schaute in den OpenCV-Quellcode. RTrees
erstellt eine versteckte Implementierung von DTReesImplForRTrees
Objekt, das die DTreesImpl
Klasse erweitert. Diese Klasse verwaltet die Elementvariable _isClassifier
und legt sie entsprechend dem Antworttyp der TrainData fest, die an train()
übergeben wird.
Von tree.cpp in OpenCV Quellcode
_isClassifier = data->getResponseType() == VAR_CATEGORICAL;
Im Moment sehe ich keine Methode, um die TrainData Objekt der Konfiguration dieser zurückzukehren. Vielleicht liegt es daran, dass meine Trainingsklassen als Floats statt als Ganzzahlen gespeichert sind? Wenn ich mich richtig erinnere, musste der Datentyp CV_32F sein, aber vielleicht habe ich irgendwo einen Fehler gemacht.