0

RTrees API は、バージョンごとに変更されているようです。RTrees 2.4.1のドキュメントには、回帰と分類の両方をサポートしていると書かれていますが、それがどのように可能かはわかりません。

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

編集:さらに足を踏み入れて、OpenCV のソース コードを調べました。 クラスを拡張する objectRTreesの隠し実装を作成します。このクラスはメンバー変数を管理し、 に与えられた TrainData の応答タイプに従って設定します。DTReesImplForRTreesDTreesImpl_isClassifiertrain()

OpenCV ソース コードの tree.cpp から

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

現時点では、これを返すように TrainData オブジェクトを構成する方法はありません。おそらく、トレーニング クラスが整数ではなく浮動小数点数として格納されているためでしょうか? 私の記憶が正しければ、データ型は CV_32F である必要がありましたが、どこかでエラーを起こした可能性があります。

4

2 に答える 2

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());
于 2016-04-06T22:05:55.723 に答える
0

例を確認してください ~/opencv/samples/cpp/letter_recog.cpp 26 クラス (文字) の RTree を使用した例です。バイナリ クラス データに使用するには、データに 2 つのクラス ラベル (コード内の応答) を入力するだけです。

于 2016-04-14T22:06:41.830 に答える