色相値に基づいてオブジェクトを識別するために、K 最近傍分類子を作成しようとしています。それぞれ約 100 のサンプルを含む 2 つの別々のオブジェクトのこれらのカラー値で満たされた 2 つの CSV ファイルがあります。これらはすべて、行ごとにこのオブジェクトの平均色を表す 40 個の整数を含むように正規化されています。K値10として使っています。
私の分類器は、トレーニング データとして準備した同じデータで使用した場合でも、常にラベル「1」を返します。関数によって返された最も近い点を調べるfind_nearest
と、入力データに関係なく、1、1、0、1、1、1、1、1、1、1 の同じ 10 個の点が常に表示されます。入力データと学習データのどちらかが間違っているようですが、CvMat*
オブジェクトの内容を確認すると、すべて問題ありません。
以下のコードで私が間違っていることを誰でも見ることができますか? 私は通常、c++ API を使用しますが、k 最近傍の例を見つけるのはより困難であることがわかりました。openCVとこのブログで例を確認しました
int dataArray[amountCategories_][amountSamples_][dataBandWidth_];
//Fill dataArray with data from csv files here (tested this and looks fine)
CvMat* trainData = cvCreateMat(amountCategories_ * amountSamples_, dataBandWidth_, CV_32FC1);
CvMat* trainClasses = cvCreateMat(amountCategories_ * amountSamples_, 1, CV_32FC1);
for (int categories = 0; categories < 2; categories++) {
for (int samples = 0; samples < amountSamples_; samples++) {
trainClasses->data.fl[samples] = categories;
cout << samples << ": ";
for (int datas = 0; datas < dataBandWidth_; datas++) {
trainData->data.fl[samples * dataBandWidth_ + datas] = (float) dataArray[categories][samples][datas];
cout << trainData->data.fl[samples * dataBandWidth_ + datas] << ", ";
}
cout << " and is type " << trainClasses->data.fl[samples] << endl;
}
}
knn_.train(trainData, trainClasses);
オブジェクトを識別するには:
vector<int> lineColors;
//fill lineColors with integers of the hue value
CvMat *playerRow = cvCreateMat(1, 40, CV_32FC1);
CvMat* nearests = cvCreateMat(1, kValue_, CV_32FC1);
cout << "Input vals: ";
for (int c = 0; c < dataBandWidth_; c++) {
playerRow->data.fl[c] = (float) lineColors.at(c);
cout << playerRow->data.fl[c] << ", ";
}
cout << " " << endl;
float outcome = knn_.find_nearest(playerRow, kValue_, 0, 0, nearests, 0);
cout << "Type: " << outcome << endl;