普通はPythonだろうけど、C#でもAccord.Netで使用可能なようなので、触ってみました。
まずはNugetでAccordやらAccord.Imagingあたりを適当にダウンロード
その後に、ネットで出回っているサンプルなどを参考にコーディングしてみたんだけど、古い情報も多く、そのまま実装できない部分がありました。
なので、動作させるまでに必要だったことを覚書として記載しておきます。
Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net)
1.目標
インターネットからの画像抽出アプリで画像をダウンロードすると、広告的な画像が多く含まれていた。それらの画像を自動で除外したい・フォルダ内の画像を探索して、類似の画像を抽出する
・抽出対象は「QRコード」と「線画」
2.機械学習の流れ
Accord.Netは初めて使用するので、機械学習の処理の流れをまとめると以下のような手順でした。- BinarySplitクラスのインスタンスを作成(解析アルゴリズムの指定)
- BagOfVisualWordsクラスのインスタンスを作成(機械学習の本体)
- BagOfVisualWordsクラスのインスタンスに画像を読み込んで機械学習
- 学習結果で、画像を振り分け
3.BagOfVisualWordsクラスの参照が見つからない
いきなり躓きました。
キモとなるであろうクラスの「BagOfVisualWordsクラス」が見つかりません・・・
BagOfVisualWordsクラスのnamespaceは「Accord.Imaging」ですが、アセンブリの参照先は「Accord.Imaging」ではなく「Accord.Vision」のようです。
なのでNugetから「Accord.Vision」のインストールが必要でした。
BagOfVisualWords.Compute()で、学習を行わせるように記載されています
そのまま実装すると「Compute(Bitmap[])は旧型式です」という警告が表示されます。
現在はLearn()メソッドに代わっているようです。
これはメソッド名を変更するだけで、引数などは変更不要のようです。
また、学習結果での画像の判別時にはDecide()メソッドを使用するようです。
これも元々はComputeメソッドだったのかな?
同様にGetFeatureVectorメソッドはTransformメソッドに変更となったようです。
MulticlassSupportVectorMachine<ChiSquare>などに置き換えます。
同様にMulticlassSupportVectorLearningクラスも、ジェネリッククラスに変更となっています。
とりあえず、これでビルドができるようになると思います。
キモとなるであろうクラスの「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クラスも、ジェネリッククラスに変更となっています。
とりあえず、これでビルドができるようになると思います。