Custom Vision + logic Appsで画像分類
AzureのCognitive Servicesを使ったハンズオンを6月にやることになったので、そのネタ作りです。
Cognitive Servicesは、機械学習等で必要となる専門的な知識があまりなくとも目的に沿ったモデルを作ったり、利用できたりするサービスです。今回はこのサービスの中の1つであるCustomVisionを使って画像分類をします。
作るもの
OneDrive上に画像をアップロードすると、同じくOneDrive上に格納したExcelファイルに結果が出力されていくというもの。
準備
今回は使うのはこれ
* OneDriveのストレージ(個人の5Gの無料枠で良い)
* Excelファイル
* Azureのリソース
* 学習用画像
OneDriveにフォルダを作成

画像をアップロードするためのフォルダと、Excelファイルを格納するためのフォルダを作成する。
Excelファイルにテーブルを作成

2項目作って、それをテーブルとして書式設定しておく。テーブル名は「table001」
- A列を予測結果
- B列をパーセンテージ
としておくOneDriveにExcelファイルを保存
Azure上でリソースの作成

ポータルから「リソースの作成」→「Custom Vision」で検索し「作成」

- 名前:適当に
- サブスクリプション:私の場合は従量課金(ここは個人でそれぞれ)
- 場所:東日本
- 予測の価格レベル:S0(無料がいいならF0を選んでください)
- トレーニングの価格レベル:S0(無料がいいならF0を選んでください)
- リソースグループ:新しく作って今回作成するリソースは全部これにまとめる
※価格レベルはF0のリソースを既に作成済みの場合はS0しか選べません。
学習用画像
スイスのチューリッヒ工科大学のコンピュータビジョン研究チームが公開しているデータセットを使います。 ダウンロードした中から5種類の食べ物をピックアップして使います。
ここまで用意出来たら作成開始
Custom Visionでモデル作成
ここにアクセスしてサインインします。
プロジェクトの作成

「New PROJECT」からプロジェクトを作成します。
* Name:適当に
* Decription:何もか書かない(コメントを入れたければ入れる)
* Resource Group:準備で作成したリソースグループを選択
* Project Types:Classification(今回は分類をしたいので)
* Classification Types:Multiclass(今回は画像1つにつき1つのタグをつける)
* Domains:Food(食べ物の分類なので) ※アプリケーションに組み込みたい場合はCompactの方を選択しておくと良い
学習に使う画像をアップロードする

左上の「Add images」から画像をアップロードする。

アップロードした画像にタグをつける。「My Tags」からタグを入力してEnterキーを押すと設定できる。同じタグをつけたい画像を複数舞まとめてアップロードすることも可能。
- ケーキ
- カレー
- チャーハン
- ピザ
- 寿司
今回はこの5種類の画像を各20枚ずつアップロードした。
学習させる

画面右上の緑色で表示されている「Train」ボタンをクリックするだけで勝手に学習が始まるので、終わるまで待つ。

学習が完了すると、Perfomanceに結果が表示される。テスト

右上の「Quick Test」から確認が可能。ためしにカレーの画像をアップロードしてみる。
青色の「Browse local files」というボタンから画像をアップロードする。

アップロード後すぐに結果が返ってきて、98.8%の確率でこれはカレーであると判断されました。logic appsの作成
リソースの作成

Azureのポータルに戻り、「リソースの作成」から「Logic App」を検索し作成する。

各項目を入力して作成する。 - 名前:適当に
- サブスクリプション:従量課金(私の場合)
- リソースグループ:既存の物を使用(準備で作ったものを選択)
- 場所:東日本
- Log Analytics:Off
デプロイが終わったらリソースに移動します。
デザイナーでフローを作成

左側の「ロジックアプリデザイナー」でフローを組み立てていく。

リソースを作ったときはこのような画面が開くので、少し下に行くと「空のロジックアプリ」があるので今回はこれを選択する。
トリガーの作成

検索ボックスに「OneDrive」と入力し、「OneDrive」のアイコンを選択する。この時「OneDrive for Business」と2種類出てくるので注意してください。標準版とビジネス版は違います。今回準備で用意したのは標準なのでビジネスではない方を選択します。

トリガーとなるアクションを選択します。今回は「ファイルが作成されたとき」を選択します。サインインを求められるのでサインインします。

サインイン後、画像をアップロードするフォルダを選択し、30秒に1回フォルダを確認しに行くよう設定します。 これで、OneDriveに画像がアップロードされたらLogicAppが起動するようになります。
アクションの作成

新しいステップを追加します。検索ボックスにHTTPと入力して「HTTP」コネクタを選択します。

各項目を入力していきます。
- 方法:POST
- URI:後述します
- ヘッダー:下記の2つのキーと値を設定してください。
キー:Content-Type / 値:multipart/form-data
キー:Prediction-key / 値:後述します - 本文:ファイルコンテンツ(OneDriveのアイコンの物を選択します)
- 認証:なし
※URIとPrediction-keyの取得方法

Custom Visionの学習結果に表示されている「Prediction URL」から取得します。クリックできない場合は、その左の「Publish」をクリックしてください。

表示された画面の下半分の値を使います。「If you have an image file:」と書かれた方です。

新しいステップから「JSONの解析」を追加。コンテンツはHTTPのコネクタから返ってくる本文を設定します。 スキーマはこれをコピーして設定します。
{
"properties": {
"created": {
"type": "string"
},
"id": {
"type": "string"
},
"iteration": {
"type": "string"
},
"predictions": {
"array": {
"properties": {
"probability": {
"type": "number"
},
"tagId": {
"type": "string"
},
"tagName": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"project": {
"type": "string"
}
},
"type": "object"
}

新しいステップとしてExcel Onlineのコネクタを選択し、「表に行を追加」というアクションを選択します。
- ファイル:OneDrive上に格納したExcelファイルを指定
- テーブル:準備の時に作ったテーブル名の「table001」を指定
- prediction:関数(body('JSON_の解析')?['predictions'][0]['tagName'])
- percentage:関数(body('JSON_の解析')?['predictions'][0]['probability'])

保存して実行
保存ボタンをクリック後、実行をクリックする。


OneDriveにファイルを格納すると作成したLogicAppが起動する。

OneDriveに格納したExcelファイルにデータが保存されていれば成功です。
使わない場合は、LogicAppの状態を「無効」にしておきましょう。でないと、30秒に1回OneDriveを見に行き続けることになります。
補足

実はLogic AppにはCognitive Services関連のコネクタが用意されていて、CustomVisionのコネクタも存在しています。しかし、このコネクタが使用しているAPIのバージョンが古く、認証エラーになってしまうので今回は使用していません。
もし、このコネクタが使用できれば今回作成した「HTTP」と「JSONの解析」コネクタは不要になるはずです。
カスタムコネクタといってLogicApp用のコネクタを自作することも可能なので、ないものは作ってみても良いかもです。
cognitive serviceにはCustomVision以外にも様々なサービスがあります。
全体的にさらっと学びたい方はこちらの書籍がお勧めです。
https://www.amazon.co.jp/dp/4865941045/ref=cm_sw_r_tw_dp_U_x_ueT8Cb1J1V45J www.amazon.co.jp
おわり