内定者ライターがML.NETを使って機械学習にチャレンジ!【C#】_ver.1

内定者ライターの鎌田です。今回はMicrosoftが提供するML.NET(.NETプラットフォーム上で動作可能なMITライセンスの機械学習フレームワーク)の公式チュートリアルを試し、実際にML.NETの画像分類モデルを構築してみたいと思います。

一般的に機械学習をする場合、【Python】というプログラミング言語を使うことがほとんどです。逆に記事のタイトルにある【C#】はあまり機械学習に使われていません。
ですがC#で開発するメリットは多くあります。
 
C#で機械学習をするとどんなメリットがあるのか、
私なりに考えてみた結果が以下になります。
・.NET Core で開発できる(クロスプラットフォーム)
・Microsoftが積極的に開発している言語(Windowsとの相性がいい)
・Visual Studioで簡単に開発環境を構築できる
・.NETベースの様々な統合開発環境(Unity、Xamarin)で使用されている言語
 
上記だけでも、汎用性の高いC#を使い機械学習をすることで、得られるメリットは大きいのではないでしょうか?
 
1.ML.NETについて
ML.NETは.NETプラットフォーム上で動作する機械学習のためのフレームワークです。
また、ML.NETは.NET Coreを使用しているため、1つの実行ファイルを、AndroidなどWindows以外の様々な環境で動作させることができます。
 
(詳細は文末記載のリンクから確認できます。)
 
2.チュートリアルについて
文末記載のリンクのチュートリアルではML.NETを使い、TensorFlowのInceptionモデルという学習済みモデルを利用して、転移学習を行っています。
最終的に転移学習で作成したモデルを使い、テスト画像を正しいカテゴリに分類することができれば成功です。
 
正しいカテゴリ
分類する画像 / 分類したカテゴリ
・ブロッコリー(broccoli.jpg)→ 食べ物(food)
・ピザ(broccoli)→ 食べ物(food)
・テディベア(teddy)→ おもちゃ(toy)
・トースター(toaster)→ アプライアンス(appliance)

今回使用する画像の枚数(そのうち1枚はテストに使用)
※画像はチュートリアルで配布されています。
・ブロッコリー(2枚)
・ピザ(3枚)
・テディベア(4枚)
・トースター(3枚)

3.転移学習とは
転移学習というのは機械学習の考え方の1つです。
例えば、精度の高い学習モデルを作成するためには、膨大な学習データが必要になりますが、そのデータを用意するのはとても大変です。また、大きなデータを学習するのにもかなり時間がかかります。
そこで、1から用意したデータで学習したモデルよりは多少精度が落ちる可能性はありますが、すでにある程度の精度で予想できている学習済みモデルを利用することで、少ないデータと学習時間で独自の目的に沿った新たな学習モデルを作成することです。

チュートリアルを試してみた
※こちらの記事では細かいソースコードや説明などは省略します。詳細は今回参考にさせていただいた、文末記載のリンクから確認できます。

1.開発環境
それでは、これから実際に試した際の手順について説明したいと思います。
また、下記の開発環境がある前提でお話しします。
・Windows 10
・Visual Studio 2019
・.NET Core クロスプラットフォームの開発(ワークロード)


2.プロジェクト作成(任意の名前)
・Visual Studioを起動
・新しいプロジェクト作成を選択
・C#の「.NET Core Console」テンプレートを選択し次へ
・プロジェクト作成完了
 
3.NuGet でパッケージをインストール
インストール方法
まずは、NuGetの管理画面を開きます。
画面右側のソリューションエクスプローラーにある、先程作成したプロジェクトを右クリックし「NuGet パッケージの管理」を選択します。
別の方法で画面上側の「ツール」→「NuGet パッケージ マネージャー」→「ソリューションのNuGetパッケージの管理」の順で選択しても開くことができます。※またこの方法ではどのプロジェクトに追加するのか選択する必要があります。
 
次に、「参照」タブ選択→パッケージソース「nuget.org」を選択→パッケージを検索し選択→バージョンは最新の安定板を選び「インストール」→パッケージのライセンスに同意の順でインストールができます。
 

パッケージは以下の4つをインストールします。
・Microsoft.ML
・Microsoft.ML.ImageAnalytics
・SciSharp.TensorFlow.Redist
・Microsoft.ML.TensorFlow

4.使用するモデルやデータをディレクトリに含める
チュートリアルで配布されているzipファイルを展開し次の画像のように構成します。

その後ソリューション エクスプローラーで、追加したファイル全てのプロパティを次のように変更します。ファイルを右クリック→「プロパティ」を選択→プロパティの「出力ディレクトリにコピー」の設定を「新しい場合はコピーする」に変更。

5.ソースコードの追加
ソースコードはチュートリアルの内容の手順に従って追加するか、先程のzipファイルを配布しているチュートリアルのGitHubから入手できます。
また、入手先の各リンクは文末に記載しています。

6.コンソール アプリを実行
ここまでの手順が終われば後は実行するだけです。
画像が正しいカテゴリに分類されているのか確認したいと思います!

Ctrl + F5 キーで「デバック無しで実行」ができます。

上の画像はML.NETの画像分類モデルで、入力された画像をテストした結果です。
 
左から順に、テスト画像の名前「broccoli2.jpg」予測した分類結果「food」予測精度「score:0.906664」となっています。
 
「LogLoss」(全体の差異)と「PerClassLogLoss」(クラスごとの差異)は0~1の値を取り、0に近いほど今回与えられた画像データに対する画像分類モデルの性能が高く、逆に値が大きいほど画像分類モデルの性能が低いということになります。
 
全ての画像を正しいカテゴリに分類することができましたね。
 
以上でMicrosoft ML.NETのチュートリアルの紹介は終わりになります。
ここまでお付き合いいただきありがとうございました。
 
感想
私がチュートリアルをしている時にずっと思っていたことは、Microsoftのドキュメントが凄く分かりやすい!ということです。ずっと「ML.NET」ばかり言っていたのに、真っ先に思いつく感想がそれでいいのかと思われてしまうかもしれません。
 
大体のドキュメントが日本語で読めますし、手順や用語の説明などが丁寧に書かれていました。

今回はコンソール上での実行でしたが、画面を追加してスマホやWeb上で動くアプリケーションとして作るのも面白いのではないでしょうか。
 
今まで、機械学習 = C#という印象はありませんでしたが、今後はC#も機械学習のおすすめ言語として色々なサイトで紹介されるようになるかもしれませんね。




新卒エンジニア募集中

株式会社キャパでは21卒、22卒新卒募集をしています。
私たちと一緒に働きませんか?
募集概要について詳しくは



  
参考リンク
【Microsoft Docs】

チュートリアル:事前トレーニング済みの TensorFlow モデルから ML.NET 画像分類モデルを生成する

ML.NET の概要とそのしくみ

チュートリアルのGitHub


関連記事一覧