0

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.

Antwort

0

Ich werde meine eigene Frage beantworten, da ich es ein wenig verwirrend und hart fand, irgendeine offensichtliche Dokumentation auf zu finden. Ich habe nur verstanden, dass die Daten kategorisiert werden müssen, indem man sich den Quellcode für DTreesImpl ansieht.

Obwohl ich nicht sicher bin, ob es einen großen Unterschied machen wird. Zugegebenermaßen bin ich sehr neu in der Umsetzung von ML und OpenCV.

/** @brief Creates training data from in-memory arrays. 

@param samples matrix of samples. It should have CV_32F type. 
@param layout see ml::SampleTypes. 
@param responses matrix of responses. If the responses are scalar, they should be stored as a 
    single row or as a single column. The matrix should have type CV_32F or CV_32S (in the 
    former case the responses are considered as ordered by default; in the latter case - as 
    categorical) 
*/ 
CV_WRAP static Ptr<TrainData> create(InputArray samples, int layout, InputArray responses, 
          InputArray varIdx=noArray(), InputArray sampleIdx=noArray(), 
          InputArray sampleWeights=noArray(), InputArray varType=noArray()); 
0

Kasse das Beispiel ~/opencv/samples/CPP/letter_recog.cpp Es ist ein Beispiel RTrees für 26 Klassen (Buchstaben) verwenden. Um es für binäre Klassendaten zu verwenden, müssen Sie nur Daten mit 2 Klassenbezeichnungen (Antworten im Code) einspeisen

Verwandte Themen