今回はML.NET による画像分類をおこないます。

ここでは犬、猫、鳩の画像を読み込ませて、それがどの画像なのかを推論させます。推論のための学習用の画像データと実際に推論させる画像データは検索して適当に集めます。

上は学習用のデータの一部です。下はテスト用のデータです。

分類結果は以下のように出力されます。

Microsoft.MLで検索してもMicrosoft.MLがでてこない

WindowsForms(.NET Framework)でプロジェクトを作成するのですが、いきなりハマりどころがあります。ML.NETをNuGetでインストールしたいのですが、Microsoft.MLで検索してもMicrosoft.MLがでてこないのです。

解決法は対象プラットフォームをAny CPUからX64に変更します。これでMicrosoft.MLが表示されます。

インストールするのは以下のものです。


Microsoft.ML
Microsoft.ML.Vision
Microsoft.ML.ImageAnalytics
SciSharp.TensorFlow.Redist V2.3.1

最新のSciSharp.TensorFlow.Redistでは例外が発生する

ここもハマりどころがあってSciSharp.TensorFlow.Redistの最新のものをいれると実行時に例外が発生します。バージョン2.3.1のものをインストールします。

WindowsForms(.NET Framework)でアプリを作成する

それから以下のようなクラスを定義します。

学習させる

button1がクリックされたら学習用の画像ファイルで学習させます。ファイル名は cat_XX.png とか dog_XX.png のような名前にしてファイル名から答えがわかるようにしておきます。

第二引数にフォルダのパスを指定しているので、そこにあるファイルをすべて取得します。

PetDataオブジェクトを生成してファイルのパスと品種名を格納します。品種名はファイル名に書かれているのでそれを切り出して使います。オブジェクトをpetDataSetに格納したらMLContext.Data.LoadFromEnumerable(petDataSet)を実行してデータのロード、シャッフルします。

そのあと若干の加工を加えます。品種文字列を数値に変換して列名を Label とします。パスから画像をロードしてデータセット用に Transformer を生成します。そのあとデータセットを学習データ(70%)と検証データ(30%)に分割します。

どのように学習するのかを定義して学習させ、学習モデルをファイルに保存します。

推論させる

学習モデルが生成されたらこれをもとに推論させます。button2がクリックされたら、_testFilesFolderで指定されたフォルダ内にある画像データが犬なのか猫なのか鳩なのかを推論させ、その結果をHTMLファイルとして出力します。

ここではフォルダ内のファイルから自作メソッドのCreateTestDataでIDataViewを取得して、自作メソッドのCreateHTMLに渡して結果を出力しています。

フォルダ内のファイルからデータをロードしてIDataViewを取得しています。

CreateHTMLメソッドはモデルデータを読み出し、テストデータを推論しています。また犬、猫、鳩のスコアも出力しています。