BEACHSIDE BLOG

Azure とか C# 好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

TensowFlow の学習モデルを C# で読み込む(コンソールアプリ編)

犬種の画像分類の学習モデルを C# のコンソールアプリに組み込みんで画像分類できるようにします。

Azure の Custom Vision で画像の分類器を秒殺で作成することで(盛りました、作成に数分くらいです)、TensorFlow の画像分類のモデル作成のターンでは、機械学習のアルゴリズムのコーディング無しです。

C#er なら誰でも(?)作れてしまう世界がここにあります。

(無意味に大げさに書いてみました...笑)

f:id:beachside:20190705171414p:plain

 

目次

Custom Vision での画像分類と TensorFlow モデルのエクスポート

まず、Custom Vision とはなんぞや?という方向けに、 Custom Vision を使うことでの利点を挙げておきます。

  • 機械学習の知識がなくても、GUIで学習モデルが作れる
  • 転移学習によるモデル作成を行うので、少ない画像枚数でモデルが作れる
  • 学習したモデルのバージョン管理ができる
  • REST API での公開もポチポチーで作成できる
  • Docker でのエクスポートや、TensorFlow, ONNX, CoreML でのエクスポートができる。詳細はこちら

お試しするなら、ゼロから作るよりも圧倒的なスピード感で PoC などが行えます。

さて本題に戻りますが、今回やることは以下です。

  • Custom Vision で犬の犬種を分類するモデル作る
  • TensorFlow のモデルをエクスポートする

GUI で画像をアップロードと、ポチポチとやってるだけで学習できるコンテンツとなります。

先日、何気に Custom Vision のハンズオンコンテンツを作っていまして、その Chapter 1 で手順を書きました。コンテンツのリンクは以下です。

CustomVision-ML.NET-Hands-on/01_create-custom-vision.md at master · beachside-project/CustomVision-ML.NET-Hands-on · GitHub

今回のコンテンツで Custom Vision のプロジェクトを作る際の注意点として、
「Domain」という項目の選択しで (compact) ってのが最後についてるものを選びましょうってだけです。
基本的には「General (compact)」を選択しておけばよいです。

選択肢として「General (compact)」以外に「Food (compact)」等のドメインがついたものもあります。以前は選択しても精度には影響ないものでしたが、いつのまにかそれぞれの選択したドメインに最適化されるようになるようです。多少考慮してみのもよさそうです。

プロジェクト作成後も変更できますので、気になるドメインがあったら検証して比べてみるとよいと思います。

参考: 新しいプロジェクトを作成する - 「3. プロジェクトの種類 で 分類 を選択します」

また、機械学習をしたら必ず気になるモデルの精度の改善については、公式ドキュメントの情報を読んでおくとよいでしょう。

分類子の改善 - Custom Vision Service - Azure Cognitive Services | Microsoft Docs

 

コンソールアプリでの実装

ハンズオン資料を作ったゆーてしまってのでもちろん手順もあります。前述で紹介した資料の次の Chapter です。

コンテンツでは、コンソールアプリを作って ML.NET の Version1.1 を使ってモデルを読み込んで画像分類を行う内容です。

CustomVision-ML.NET-Hands-on/02_create-console-app.md at master · beachside-project/CustomVision-ML.NET-Hands-on · GitHub

ML.NET 自体について簡単にふれておくと、
機械学習の回帰や分類、異常検知等のアルゴリズムが用意されており、モデルの学習や作成ができます。そのほかに 今回のように TensorFlow などのプリビルドのモデルを読み込んで転移学習したり、そのモデルをC#上で使うことができます。

ローカルで実行できるのは、REST API などでアプリの外部へ API を呼び出す必要がないのでネットワークレイテンシーもないというメリットが大きいですね。
今までのPCのアプリだけでなく IoT や VR系のプログラムに組み込むときの実用的な手段でしょう。

コーディングのポイントは、モデルのインプットとアウトプットを把握しましょうって点くらいでしょうか。そこも手順に書いています。また、ML.NET を使ってモデルのパイプライン構築時の設定も色々できるのも精度を上げるのに重要な要素ですが、今回のコンテンツでは詳しく触れていません。

終わりに

ここで紹介してるハンズオンコンテンツのトップはここです。

GitHub - beachside-project/CustomVision-ML.NET-Hands-on: Create Image classifier in Custom Vision(Microsoft Cognitive Services) and Create App using ML.NET.

このコンテンツの続きとして ASP.NET Core での実装を作成する予定ですが、コードがごちゃごちゃしそうでどうしよーかなーと思っています。ハンズオンとしてシンプルに作れるように、そのうち作成します。