Accord.Netを使用して、画像認識させる最低限の構成について記載します。
私自身が初心者で機械学習はサッパリなので、誤認識あったらゴメンナサイ
Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net)
1.機械学習に必要なもの
私の認識では画像認識処理の登場人物は以下です- BagOfWords
 - VectorMachine
 - 画像のリスト
 - 入力値のリスト
 - 分類結果のリスト
 - 判定したい画像
 
BagOfWords
画像のリストを読み込んで解析可能なデータに変換します。
BagOfWordsによる変換結果の一覧が入力値のリストです。
分類結果のリスト
画像のリストの分類の一覧です。
分類とはユーザが決めるもので、
- 赤い画像(0)、青い画像(1)、黄色い画像(2)
 - 人物(0)、風景(1)
 
などのように分類して、括弧のように数値を割り振ったリストです。
VectorMachine
機械学習のコアになるクラスです。
入力値のリストと分類結果のリストを読み込んで学習を行います。
その後、判定したい画像を読み込むことで、どの分類に属しているか判定します。
学習にはTeacherを定義します
2.処理の流れ
実際に処理をまとめると以下のようになります。サンプルでは
- 「リンゴ、伊勢海老、バナナ、青空」の画像を読み込み
 - 「赤色、黄色、青色」に分類
 - 「イチゴ」の画像を読み込み「赤」グループと判別させる
 
イメージです。
private void Study()
{
 // データ変換の配列の長さ
 const int CodeWordCount = 60;
 //データ解析のアルゴリズム
 BinarySplit binarySplit = new BinarySplit(CodeWordCount); 
 BagOfVisualWords bagofVW = new BagOfVisualWords(binarySplit);
 List<bitmap> bmps = new List<bitmap>();
 List<double> inputs = new List<double>();
 List<int> outputs = new List<int>();
 // 学習用画像の読み込み
 bmps.Add(new Bitmap("リンゴの画像のパス")); // 赤色の画像
 bmps.Add(new Bitmap("伊勢海老の画像のパス")); // 赤色の画像
 bmps.Add(new Bitmap("バナナの画像のパス")); // 黄色の画像
 bmps.Add(new Bitmap("青空の画像のパス")); // 青色の画像
 // BagOfWordsでデータ変換
 bagofVW.Learn(bmps.ToArray());
 foreach (var bmp in bmps)
 {
  var wordCount = bagofVW.Transform(bmp);
  inputs.Add(wordCount);
 }
 // 読み込んだ画像の分類
 outputs.Add(0); // 赤色の画像
 outputs.Add(0); // 赤色の画像
 outputs.Add(1); // 黄色の画像
 outputs.Add(2); // 青色の画像
 // 赤、青、黄の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());
 // 画像の判定
 Bitmap targetBmp = new Bitmap("イチゴの画像のパス");
 var codeword = bagofVW.Transform(targetBmp);
 // イチゴは赤いので「0」が返却されるはず
 var ret = msvm.Decide(codeword);
}