2016-04-06 77 views
0

RTrees API似乎在不同版本中發生了變化。 RTrees 2.4.1 documentation表示它支持迴歸和分類,但我不知道如何做到這一點。如何使用OpenCV RTrees進行二進制分類?

我想使用RTrees作爲OpenCV 3.1中的二進制分類器,儘管文檔沒有提及它,RTrees :: isClassifier()返回false。

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

編輯:我已經做了一些更多的工作,並看着OpenCV的源代碼。 RTrees創建了一個隱藏實現DTReesImplForRTrees對象,它擴展了DTreesImpl類。該班級管理_isClassifier成員變量,並根據給定的train()的TrainData響應類型進行設置。

從tree.cpp在OpenCV的源代碼

_isClassifier = data->getResponseType() == VAR_CATEGORICAL; 

目前,我沒有看到配置TrainData對象返回此的任何方法。也許這是因爲我的訓練課程是作爲花車而不是整數存儲的?如果我沒有記錯,數據類型必須是CV_32F,但也許我在某處出錯了。

回答

0

我會回答我自己的問題,因爲我發現它有點混亂和難以找到任何明顯的文檔。我只理解,通過查看DTreesImpl的源代碼,需要將數據視爲分類。

雖然我不確定它是否會產生重大差異。無可否認,我對ML和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

結帳的示例〜/ OpenCV的/樣品/ CPP/letter_recog.cpp 它是使用了26類(字母)的rtrees一個例子。要將其用於二進制類數據,您只需使用2個類別標籤(代碼中的響應)提供數據