2013年11月28日木曜日

OpenCVでBOWで辞書作成ではまった

BOWの辞書作成プログラムを作ろうとしているが、試験的に作成したプログラムが作成した辞書と
リファクタリングしたプログラムで作成した辞書の値が異なり悩んでしまった。

乱数を使用しているか思ったが、同じプログラムでは、ソースを変更しても結果は同じとなるため
原因がつかめなかった。

そこで、同一プログラム内で

cv::BOWKMeansTrainer bowTrainer1(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定
cv::BOWKMeansTrainer bowTrainer2(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定

int size = mLstMat.size();
for (int i = 0 ; i < size ;i++) {
bowTrainer1.add(mLstMat.at(i));
bowTrainer2.add(mLstMat.at(i));
}

cv::Mat f1 = bowTrainer1.cluster();
std::cout << f1 << std::endl << std::endl;

cv::Mat f2 = bowTrainer2.cluster();
std::cout << f2 << std::endl << std::endl;

のようのBOWKMeansTrainerのインスタンスを2つ作成し、同一データで辞書を作成したところ、値が異なることがわかった

再度ドキュメントのBOWKMeansTrainerのコンストラクタの説明をみると
パラメータは、kmeans()をみとろのこと

kmeans()の説明では、flagパラメータのKMEANS_PP_CENTERSは、 kmeans++の初期化を使用とのこと

wikiのK-means++法の説明をみると、
「まず始めにデータ点をランダムに選び1つ目のクラスタ中心とし」
と記載されている



同じプログラムを使用しないと、辞書が異なる可能性が大きい
同じプログラムでも実行マシンを変えるとどうなるのだろうか

0 件のコメント:

コメントを投稿