2020年1月1日水曜日

C#で画像認識(Accord.Net) 4.MulticlassSupportVectorMachineクラス

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

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


MulticlassSupportVectorMachineクラス

前回のBinarySplitクラス同様、MulticlassSupportVectorMachineクラスの名前をそのままググってもあまり良い情報が出てこず・・・

どうやらMulticlassなSupportVectorMachineということのようです。

Wiki先生によると
サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。
だそうです。

教師あり学習というのは、入力データと正解データを使った学習方法のことです。
こちらは、プロットした点に「赤色黄色青色」のような情報を追加して、区切り線を作る処理にあたるようです。

こんな感じかな

ロジックは以下の部分が該当すると思います。

 // 赤、青、黄の3分割
 var classes = 3;

 // 機械学習の実施
 var msvm = new MulticlassSupportVectorMachine<chisquare>(0, new ChiSquare(), classes);

 var teacher = new MulticlassSupportVectorLearning<chisquare>(msvm)
 {
  Learner = (param) => new SequentialMinimalOptimization<chisquare>()
  {
   UseComplexityHeuristic = true,
   UseKernelEstimation = true
  }
 };
 msvm = teacher.Learn(inputs.ToArray(), outputs.ToArray());

処理は最後の
msvm = teacher.Learn(inputs.ToArray(), outputs.ToArray());
がメインです。


そして、最後にBagOfWordsで判別したい画像のプロット位置(★マーク)を取得し、MulticlassSupportVectorMachineクラスで、どの分類に含まれるのか判定を行っています。



 // 画像の判定
 Bitmap targetBmp = new Bitmap("イチゴの画像のパス");

 var codeword = bagofVW.Transform(targetBmp);

 // イチゴは赤いので「0」が返却されるはず
 var ret = msvm.Decide(codeword);




ちなみに、前回のBinarySplitは読み込んだ画像を正解がないままで分類わけするので教師なし学習にあたるみたいです。