SHOTech Blog

プログラミングに関する記録です

Custom Vision + logic Appsで画像分類

AzureのCognitive Servicesを使ったハンズオンを6月にやることになったので、そのネタ作りです。

azure.microsoft.com

Cognitive Servicesは、機械学習等で必要となる専門的な知識があまりなくとも目的に沿ったモデルを作ったり、利用できたりするサービスです。今回はこのサービスの中の1つであるCustomVisionを使って画像分類をします。

作るもの

OneDrive上に画像をアップロードすると、同じくOneDrive上に格納したExcelファイルに結果が出力されていくというもの。

準備

今回は使うのはこれ
* OneDriveのストレージ(個人の5Gの無料枠で良い)
* Excelファイル
* Azureのリソース
* 学習用画像

OneDriveにフォルダを作成

f:id:syota-y1989:20190528142841p:plain
画像をアップロードするためのフォルダと、Excelファイルを格納するためのフォルダを作成する。

Excelファイルにテーブルを作成

f:id:syota-y1989:20190528132417p:plain
2項目作って、それをテーブルとして書式設定しておく。テーブル名は「table001」

  • A列を予測結果
  • B列をパーセンテージ
    としておく

    OneDriveにExcelファイルを保存

    f:id:syota-y1989:20190528132651p:plain

    Azure上でリソースの作成

    f:id:syota-y1989:20190528132807p:plain
    ポータルから「リソースの作成」→「Custom Vision」で検索し「作成」
    f:id:syota-y1989:20190528133005p:plain

  • 名前:適当に
  • サブスクリプション:私の場合は従量課金(ここは個人でそれぞれ)
  • 場所:東日本
  • 予測の価格レベル:S0(無料がいいならF0を選んでください)
  • レーニングの価格レベル:S0(無料がいいならF0を選んでください)
  • リソースグループ:新しく作って今回作成するリソースは全部これにまとめる
    ※価格レベルはF0のリソースを既に作成済みの場合はS0しか選べません。

学習用画像

www.vision.ee.ethz.ch

スイスのチューリッヒ工科大学のコンピュータビジョン研究チームが公開しているデータセットを使います。 ダウンロードした中から5種類の食べ物をピックアップして使います。

ここまで用意出来たら作成開始

Custom Visionでモデル作成

www.customvision.ai

ここにアクセスしてサインインします。

プロジェクトの作成

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

学習に使う画像をアップロードする

f:id:syota-y1989:20190528134606p:plain
左上の「Add images」から画像をアップロードする。
f:id:syota-y1989:20190528134752p:plain
アップロードした画像にタグをつける。「My Tags」からタグを入力してEnterキーを押すと設定できる。同じタグをつけたい画像を複数舞まとめてアップロードすることも可能。

  • ケーキ
  • カレー
  • チャーハン
  • ピザ
  • 寿司
    f:id:syota-y1989:20190528151843p:plain 今回はこの5種類の画像を各20枚ずつアップロードした。

    学習させる

    f:id:syota-y1989:20190528135138p:plain
    画面右上の緑色で表示されている「Train」ボタンをクリックするだけで勝手に学習が始まるので、終わるまで待つ。
    f:id:syota-y1989:20190528135337p:plain
    学習が完了すると、Perfomanceに結果が表示される。

    テスト

    f:id:syota-y1989:20190528135512p:plain
    右上の「Quick Test」から確認が可能。ためしにカレーの画像をアップロードしてみる。
    青色の「Browse local files」というボタンから画像をアップロードする。
    f:id:syota-y1989:20190528135757p:plain
    アップロード後すぐに結果が返ってきて、98.8%の確率でこれはカレーであると判断されました。

    logic appsの作成

    リソースの作成

    f:id:syota-y1989:20190528140032p:plain
    Azureのポータルに戻り、「リソースの作成」から「Logic App」を検索し作成する。
    f:id:syota-y1989:20190528140212p:plain
    各項目を入力して作成する。

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

デザイナーでフローを作成

f:id:syota-y1989:20190528140553p:plain
左側の「ロジックアプリデザイナー」でフローを組み立てていく。
f:id:syota-y1989:20190528141805p:plain
f:id:syota-y1989:20190528141829p:plain
リソースを作ったときはこのような画面が開くので、少し下に行くと「空のロジックアプリ」があるので今回はこれを選択する。

トリガーの作成

f:id:syota-y1989:20190528142041p:plain
検索ボックスに「OneDrive」と入力し、「OneDrive」のアイコンを選択する。この時「OneDrive for Business」と2種類出てくるので注意してください。標準版とビジネス版は違います。今回準備で用意したのは標準なのでビジネスではない方を選択します。
f:id:syota-y1989:20190528142312p:plain
トリガーとなるアクションを選択します。今回は「ファイルが作成されたとき」を選択します。サインインを求められるのでサインインします。
f:id:syota-y1989:20190528142604p:plain
サインイン後、画像をアップロードするフォルダを選択し、30秒に1回フォルダを確認しに行くよう設定します。 これで、OneDriveに画像がアップロードされたらLogicAppが起動するようになります。

アクションの作成

f:id:syota-y1989:20190528143113p:plain
新しいステップを追加します。検索ボックスにHTTPと入力して「HTTP」コネクタを選択します。
f:id:syota-y1989:20190528143359p:plain
各項目を入力していきます。

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

URIとPrediction-keyの取得方法
f:id:syota-y1989:20190528144022p:plain
Custom Visionの学習結果に表示されている「Prediction URL」から取得します。クリックできない場合は、その左の「Publish」をクリックしてください。
f:id:syota-y1989:20190528144346p:plain
表示された画面の下半分の値を使います。「If you have an image file:」と書かれた方です。

  • URI:テキストボックスにあるhttpsで始まるURLをコピーして設定
  • Prediction-key:「Header to」の左側に設定されている半角英数字の羅列をコピーして設定

f:id:syota-y1989:20190528144707p:plain
新しいステップから「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"
}

f:id:syota-y1989:20190528150352p:plain
f:id:syota-y1989:20190528150642p:plain 新しいステップとしてExcel Onlineのコネクタを選択し、「表に行を追加」というアクションを選択します。

  • ファイル:OneDrive上に格納したExcelファイルを指定
  • テーブル:準備の時に作ったテーブル名の「table001」を指定
  • prediction:関数(body('JSON_の解析')?['predictions'][0]['tagName'])
  • percentage:関数(body('JSON_の解析')?['predictions'][0]['probability'])
    f:id:syota-y1989:20190528150755p:plain
    f:id:syota-y1989:20190528150832p:plain
    保存して実行

    保存ボタンをクリック後、実行をクリックする。
    f:id:syota-y1989:20190528151039p:plain
    f:id:syota-y1989:20190528151059p:plain
    OneDriveにファイルを格納すると作成したLogicAppが起動する。
    f:id:syota-y1989:20190528151146p:plain
    OneDriveに格納したExcelファイルにデータが保存されていれば成功です。

f:id:syota-y1989:20190528152442p:plain
使わない場合は、LogicAppの状態を「無効」にしておきましょう。でないと、30秒に1回OneDriveを見に行き続けることになります。

補足

f:id:syota-y1989:20190528151252p:plain
実は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

おわり