shine-Notes

ゆるふわ思考ダンプ

Azure Custom Visionで訓練したモデルをローカルのTensorflow環境でササッと動かす

サマリ

  • 「学習済モデル取り出せます」って言ってるクラウドマネージドサービスってホンマに使えるんかな…試したろ!
  • Azure Custom Vision→Tensorflowと開発元を跨ぐアプローチだが、概ね問題なく動いた
  • 個人的にはいい塩梅で満足だったが、手が動く人からすると中途半端なやり方なのかも

モチベーション

ステイホーム。ということで連休で何か一つ作ってみたいなと思い、前述のモチベーションで作業してみた。
画像認識AIのクラウドマネージドサービスには、AWS Rekognition、Google AutoML Vision等が有るが、Azure Custom Vision(長いので以降ACSとする)に関しては学習済モデルの利用方法の選択肢が多めに用意されていて、特に「モデルをサードパーティのライブラリでも使える形式で取り出せる(CoreML,Tensorflow,ONNX)」らしい所は個人的に魅力に感じていた。(クラウドマネージドサービスは自サービスを使ってほしいがために学習完了したモデルはAPI提供する形式が多い)
azure.microsoft.com とはいえホンマに出来るのか?という疑念と、個人的にもTensorflowの推論環境を自力で動かす練習をしたかったので、取り組むことにした。

やったこと(と引っかかりどころ)

大きな流れとしては以下の通りだ。
1. 学習… Azure PortalよりAzure Custom Visionを起動して、適当に用意した画像で学習を行う。
2. エクスポート… 学習が完了してそれなりの精度が出たら望む形式でExportする。
3. 推論… ローカルPC環境でExportしたModelを取り込んで動かす。

先に結論から言っておくと、Microsoftの以下Docs2件を見つつやれば大体なんとかなるし(MSのDocsは偶に変な訳があるので英語と見比べることを推奨)、Docs内のチュートリアルを元に筆者が動かしたコードも(出来はさておき)GitHubに上げてある。
以降は筆者の備忘録を兼ねたメモと引っかかったところを記載していくことにする。

docs.microsoft.com docs.microsoft.com github.com

1. 学習

  • Azureアカウントはすでに持っている前提で以下進行する。
    • 今回の検証範囲内だと賦課費用はほぼ¥0のはずなので、Azure未体験の方も無償アカウントを作るなりでササっと実施いただければと思う(とはいえサービスがいつか有償化する可能性はあるので、使わなくなったリソースはこまめに消すこと)。
  • Azure Portalから「Custom Vision」を検索する。Marketplaceが開くのでそこでプロジェクトをCreateする。
    • 補足すると、MicrosoftのAI系マネージドサービスは「Cognitive Service」という名前でグルーピングされており、その中の画像認識系AIとして「Custom Vision」が存在するという位置づけ。
    • また、自分のAzure Portal内でつどプロジェクトのようなものを作ってから、Custom Vision用の別のポータルで作業を行うような構造となっている。リソースグループを割り当てられるので、課金単位を管理しやすく地味に便利。
  • リソースグループや名称は適宜任意で。ポイントは「Training pricing tier」で、2020年5月現在は「F0」を選ぶと小規模な利用は無償で利用できる。この辺の気前の良さがパブリッククラウドのいいところ。

  • リソースの作成が終わったら、ポータル内の表示に従ってCustom Vision専用のポータルに移動する。

    • ここからはhttps://www.customvision.ai/で作業することになる。
    • こちらで改めてログインして作業する。自分のMSアカウントに複数のサブスクリプションが紐付いている場合は切り替えを忘れないこと。
    • このポータルを用いずに以降の作業をSDK経由で行う方法もあるらしい。今回は行わない。
  • Custom Visionポータルで適宜プロジェクトを作成する。
    • 今回は「Project Types:Classification」(分類)「Multiclass」(1画像1クラス)「Domains:General(compact)」を選択する。
    • Domains:General(compact) としているかどうかでエクスポートできるモデルが左右されるので注意。 f:id:shinebalance:20200506111136p:plain
  • 画像を取り込んで学習を行う。
    • このあたりはゴッソリ説明を省く。
    • やってみると分かるが、UIがよくできており、かつナビゲートもついているので、適当に画像をDrug&Dropすれば出来る。
    • 画像は適当に用意しておく。筆者は部屋で撮影した人形の写真を各クラス20枚づつ準備した。 f:id:shinebalance:20200506111100p:plain
  • 学習が終わると「Predictions」でテストが可能できる。なるべく対象物以外の背景などが揃う条件にしておくと、少ない画像でも精度が出る。
    • その分汎化性能は無い訳だが、この辺の議論は今回の目的ではないので割愛。でも色々試すと面白い。

2. エクスポート

  • ちょっとわかりにくいのだが、「Perfomance」タブを選択して「Export」を押すとエクスポートが可能。 f:id:shinebalance:20200506111154p:plain f:id:shinebalance:20200506111216p:plain
  • 今回は「TensorFlow」を使う。ちなみにAndoroidと書いてあるがMacだろうがDebianだろうが関係なく動く。
  • エクスポート形式だが、筆者が今回動かせたのは以下の2種。これらの形式でDLする。
    • TensorFlow
    • SavedModel
  • 別記事でも書くが、TensorFlow liteはなぜか動かなかった…… f:id:shinebalance:20200506111302p:plainf:id:shinebalance:20200506111315p:plain
  • この辺のエクスポート機能の微妙なわかりにくさには、「どうせお前ら使わんやろ?APIで使ってよ」みたいな意思を感じなくもない。深読みし過ぎか。

3. 推論

  • 以降はローカルにTensorFlow環境がインストール済という前提で進める。
    • 筆者の環境(Mac OS)は以下の通り。
$ python3   
Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)    
[Clang 6.0 (clang-600.0.57)] on darwin   
Type "help", "copyright", "credits" or "license" for more information.   
>>> import tensorflow as tf   
>>> print(tf.__version__)   
2.2.0-rc3   
  • 公式チュートリアルに、DLしたモデルファイルを読み込んで、jpg画像に対して推論を実行するソースコードがおいてある。
  • ただこれだけだと面白みがない&挙動を理解しきれなかったので、チュートリアルのコードをオレオレで適当に関数にラップしつつ、インカメで撮影した結果を返すようなコードを以下に書いた。参考まで。 github.com
    • こんな感じで動く。
  • 筆者のMBP(2016,13inch)では目立つラグなく動いた。分類モデルなので然程のマシンパワーはなくても実行できるのではと思われる。

  • ソースコードを見る感じ、.pb(protocol buffer)で表現された計算グラフをパースして読み込み、配列化した画像を取り込んで計算する、というごくシンプルな処理を行っている。

    • ただ、Tensorflowの記法は1.0代のやり方(Sessionで計算グラフを有効化するやりかた)になっており、このへんは2.0相当に書き換えたい所。

所感

  • という訳で概ねチュートリアルの通りにやれば出来る。インカメ対応させるあたりは世間的には初歩の初歩なのだが、個人的にはOpenCVの復習になって良い感じだった。
  • モデルのエクスポート画面のわかりにくさは気になったが、Custom Visionのポータルが結構イケていて気楽に学習処理ができるので、今回のようにエクスポートしたモデルをすぐ動かせる状態にしてあるのであれば、結構良いじゃないのCustom Vision+Tensorflow、と思う。

つづく

  • ひとまずタイトルの範囲としては以上だが、個人的にはNext themeがありまだ取り組んだ内容があるので、別記事にて紹介する。

以上