ML.NETで機械学習③-UIの開発-
こんにちは。
前回「ML.NETで機械学習②-画像で転移学習-」では画像の転移学習を行い、結果をコンソール上で確認するプログラムを動かしてみました。
ただ、結果をコンソールで確認するだけでは、ハイパーパラメータ等の設定をプログラム上で行う必要がありましたし、結果をグラフ表示したりもできませんでした。そこで、今回は学習の設定を行ったり、結果をグラフで確認するようなUIを開発していきたいと思います。
作成した画面
作成した画面は以下のような画面です。
データセットを選択すると、自動的に学習するラベルと画像枚数が下に表示されるようにしました。
学習するデータセットを選択したあと、学習するのに必要なパラメータを設定します。
パラメータは以下の4つです。
・使用モデル
-Resnet101、Inception、MobileNet、Resnet50の中から選びます
・検証用データセット比率
-データセットの何割を検証用として使用するのかを指定します
・バッチサイズ
・エポック数
設定を行い、学習開始ボタンを押すと学習を開始します。
モデルを初めて使用する際、使用するモデルをダウンロードしてくるのに時間がかかることがあります。
学習を行う環境次第では、モデルのダウンロードに時間がかかりタイムアウトする可能性もあるのでご注意ください。
学習中は、1エポック進むごとにグラフで現状の正解率が表示されるようになっています。
学習したモデルは、実行ファイルと同じフォルダに「result」というフォルダが作成され、日付ごとに管理されていきます。
プログラムの構成
ソースコードはGitHubにあげています。
プログラムはWPFアプリケーションで開発してます。このプログラムを開発するにあたり、DMSkinとLiveChartsを使用させていただきました。ありがとうございます。
プログラムは2つのプロジェクトで構成されており、UIについて記述している「TransferUI」とAIの学習部分を記述している「LearningProcessor」があります。
プログラムを実行する際は、Nugetで以下のライブラリを各プロジェクトごとにダウンロードしてください。
TransferUI
・LiveCharts.Wpf(v0.9.7)
・WindowsAPICodePack-Shell(v1.1.1)
LearningProcessor
・Microsoft.ML(v1.4.0)
・Microsoft.ML.Vision(v1.4.0)
・SciSharp.TensorFlow.Redist(v1.15.0)
・Microsoft.ML.ImageAnalytics(v1.4.0)
UIで学習開始ボタンが押されたときに、「LearningProcessor」プロジェクトにあるProcessorクラスを呼び出し、学習を実行しています。
/// <summary>
/// 学習開始
/// </summary>
public ICommand LearningStartCommand => new DelegateCommand(obj =>
{
State = "学習中...";
Processor processor = new Processor();
processor.LearningCallBackEvent += LearningCallBack;
processor.Initialize(DatasetPath, ValidationRate);
var task = processor.Run(BatchSize, Epoch, UseModel);
Task.Factory.StartNew(() =>
{
task.Wait();
State = "学習完了!!";
});
});
Processor.LearningCallBackEventで学習途中の正解率に関する情報をUI側に通知しています。
このイベントは1エポック学習が進むごとに実行されます。
また、Processor.Initialize関数でデータセットのパスと検証用データセットの比率を、Processor.Run関数でバッチサイズとエポック数、使用するモデルを引数として渡し学習を実行しています。
まとめ
UIの作成自体もとても簡単に行うことができました。
今回、開発したのが学習を行うまでの部分で、そのあとの学習したモデルを使ってテストデータを検証してみるといったことがまだ実装できておりません。
ML.NET自体はTensorflowで作成したモデルを読み込むことができます。実際、このアプリケーションで保存されるモデルと、Tensorflowで保存されるモデルのフォーマットは同じです。
今後は、このTensorflowモデルの読み込みと評価について開発していこうかと思います。
興味のある方は、アプリケーションもぜひ遊んでみてください!
この記事が気に入ったらサポートをしてみませんか?