2020年1月1日水曜日

C#で画像認識(Accord.Net) 3.BinarySplitクラス

前回の記事で、最低限の画像認識は動くようになると思います。
今回は「前回、よくわかんなくて曖昧にしていた」部分の追記です。

Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net) 


BinarySplitクラス

前回の記事では以下のように記載していました
BinarySplit binarySplit = new BinarySplit(CodeWordCount);
BagOfVisualWords bagofVW = new BagOfVisualWords(binarySplit);

BinarySplit は解析のためのデータ変換するクラス(BagOfVisualWords )のインスタンス作成時の引数として指定していました。

BinarySplitだけで検索しても、あまり関係のある情報が出てこないので、放置していましたが、Binary Splitting Algorithmのことのようです。
ただ、この言葉をググっても説明が難しいので、アルゴリズムの内容はよくわかんないです・・・
機械学習の本の索引にも出てないので、いったん放置。

このクラスの定義を確認すると、KMeansクラスを継承していることがわかります。

public class BinarySplit : KMeans

このKMeansk-平均法のことのようです。
こちらについても、解説を読んでもアルゴリズムの詳細は分かりませんが、Wikiによると
k平均法(kへいきんほう、英: k-means clustering)は、非階層型クラスタリングのアルゴリズム
とのこと。
ここのキーワードの「クラスタリング」というところが重要なようです。


// BagOfWordsでデータ変換
bagofVW.Learn(bmps.ToArray());

つまり、ここの記載は「画像の一覧をクラスタリングする」ということになります。

サンプルプログラムの場合
リンゴ、伊勢海老、バナナ、青空をデータを読み込んで、座標をプロットするような処理にあたるようです。

上記のイラストでは画像を色分けしてプロットしていますが、ロジック的にこの時点では「赤色黄色青色」のような情報は与えていません。
なので、3分類に分けるような処理は行わず、純粋に与えられた画像を座標としてプロットした状態になっているんだと思います。
こんな感じで、似ている画像どうしのプロットが近くにある感じ