2016-04-06 22 views
0

RTrees APIが異なるバージョン間で変更されているようです。 RTrees 2.4.1 documentationには、回帰と分類の両方がサポートされていると言われていますが、どうすればそれが可能かわかりません。バイナリ分類にOpenCV RTreesを使用するには?

OpenCV 3.1ではRTreesをバイナリクラシファイアとして使用したいと考えていますが、ドキュメンテーションでは何も言わず、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); 

EDIT:OpenCVのソースコードを調べました。 RTreesDTreesImplクラスを拡張するDTReesImplForRTreesオブジェクトの隠れた実装を作成します。このクラスは_isClassifierメンバ変数を管理し、train()に与えられたTrainDataの応答タイプに従ってそれを設定します。

OpenCVのソースコード

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

でtree.cppから瞬間に、私はこれを返すために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つのクラスラベル(コード内のレスポンス)を使用してデータを入力する必要があります。

関連する問題