2020年1月1日水曜日

C#で画像認識(Accord.Net) 1.ビルドエラーが出た時の確認点

今更ですが画像の自動振り分け処理を作りたくなったので、機械学習に手を出してみました。
普通はPythonだろうけど、C#でもAccord.Netで使用可能なようなので、触ってみました。
まずはNugetでAccordやらAccord.Imagingあたりを適当にダウンロード
その後に、ネットで出回っているサンプルなどを参考にコーディングしてみたんだけど、古い情報も多く、そのまま実装できない部分がありました。
なので、動作させるまでに必要だったことを覚書として記載しておきます。

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



1.目標

インターネットからの画像抽出アプリで画像をダウンロードすると、広告的な画像が多く含まれていた。それらの画像を自動で除外したい

・フォルダ内の画像を探索して、類似の画像を抽出する
・抽出対象は「QRコード」と「線画」

2.機械学習の流れ

Accord.Netは初めて使用するので、機械学習の処理の流れをまとめると以下のような手順でした。

  1. BinarySplitクラスのインスタンスを作成(解析アルゴリズムの指定)
  2. BagOfVisualWordsクラスのインスタンスを作成(機械学習の本体)
  3. BagOfVisualWordsクラスのインスタンスに画像を読み込んで機械学習
  4. 学習結果で、画像を振り分け
こんな感じでしょうか

3.BagOfVisualWordsクラスの参照が見つからない

いきなり躓きました。
キモとなるであろうクラスの「BagOfVisualWordsクラス」が見つかりません・・・
BagOfVisualWordsクラスのnamespaceは「Accord.Imaging」ですが、アセンブリの参照先は「Accord.Imaging」ではなく「Accord.Vision」のようです。
なのでNugetから「Accord.Vision」のインストールが必要でした。

4.メソッドが古い形式

サンプルソースによると
BagOfVisualWords.Compute()で、学習を行わせるように記載されています
そのまま実装すると「Compute(Bitmap[])は旧型式です」という警告が表示されます。
現在はLearn()メソッドに代わっているようです。
これはメソッド名を変更するだけで、引数などは変更不要のようです。

また、学習結果での画像の判別時にはDecide()メソッドを使用するようです。
これも元々はComputeメソッドだったのかな?

同様にGetFeatureVectorメソッドはTransformメソッドに変更となったようです。


5.MulticlassSupportVectorMachineクラスが古い形式

MulticlassSupportVectorMachineクラスではなく、ジェネリッククラスのMulticlassSupportVectorMachine<TKernel>クラスに変更となったようです。
MulticlassSupportVectorMachine<ChiSquare>などに置き換えます。

同様にMulticlassSupportVectorLearningクラスも、ジェネリッククラスに変更となっています。


とりあえず、これでビルドができるようになると思います。