tonkunの備忘録

色々調べた事、試した事などを載せます

XamarinでAzure Custom Visionを使ってみた

qiita.com

の9日目の記事になります。

今回は Azure Cognitive Servicesの中からCustom Visionを使います。

azure.microsoft.com

やってみたこと

私の住んでる石川県には「金沢カレー」と言う食べ物があります。
何種類かお店があるのですが、その中の1つのチャンピョンカレーのカレーの画像を学習させて、 Xamarinで撮影した写真から判定できるか試してみました。

Custom Visionの準備

https://customvision.ai からサインインする。

[NEW PROJECT]を選択する。
f:id:tonkun_no:20181203023748p:plain

各項目を入力する。
f:id:tonkun_no:20181203024114p:plain

今回はカレーの判定なので
[Classification Types]はMulticlass (Single tag per image)
[Domains]はFood
にしてみました。

作成直後は以下のような画面になります。
f:id:tonkun_no:20181203025431p:plain

Tagsから新しいタグを登録する(Is Negative?はどういう時に使うんだろう)
f:id:tonkun_no:20181205024142p:plain

学習用の画像を[Add images]から追加する。
[My Tags]からに登録したタグを選んで、今回は40枚画像を登録しました。
この為にお店で写真撮りまくりました(*ノωノ)
f:id:tonkun_no:20181209030029p:plain

[Train]から学習させます。
Trainするためには、最低2つタグが必要だそうで、慌ててもう1つタグを追加して 別のカレーの画像を登録しました。
f:id:tonkun_no:20181209033838p:plain

学習が完了すると[Performance]に内容が表示されます。
[Probabily Threshold]を変更すると調整できるようですが、とりあえずこのままにします。
f:id:tonkun_no:20181209034208p:plain

実装

SDKが用意されているので、そちらを使います。
NugGetのパッケージマネージャーから[Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction]で検索してインストールします。
この記事を書いている時点ではプレビュー版なので[プレリリースを含める]にチェックを入れないと見つかりません
また似た名前でMicrosoft.Cognitive.CustomVision.Predictionと言う物もありますが公開日が2017.12.20なので恐らく以前のものかと思います。

f:id:tonkun_no:20181209040528p:plain

Apiを使用する際のApiKeyとEndpointは [Performance]の[Prediction URL]から確認できます。
f:id:tonkun_no:20181209042318p:plain

カメラ部分についてもPluginにお任せです。

github.com

実行部分はこんな感じです。
以下抜粋

            // 写真撮影
            // Cameraを起動して写真を撮影(Plugin任せ)
            var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                DefaultCamera = CameraDevice.Front,
                AllowCropping = false,
                PhotoSize = PhotoSize.Medium,
            });

            // 撮影しなかった場合は何もしない
            if (file == null) return;

            // 画像を表示
            image.Source = ImageSource.FromStream(() => file.GetStream());

            try
            {
                // CustomVision用クライアント準備
                // ApiKeyにはPredictionKeyを指定
                // Endpointにはhttps://southcentralus.api.cognitive.microsoft.comを指定
                var client = new CustomVisionPredictionClient()
                {
                    ApiKey = PredictionKey,
                    Endpoint = Endpoint
                };

                // 画像を解析(IterationIDを指定しないとうまくいかない)
                var resul = await client.PredictImageAsync(Guid.Parse(ProjectID), file.GetStream(), iterationId: Guid.Parse(IterationID));
                // 結果取得
                var prediction = resul.Predictions.FirstOrDefault();

                await DisplayAlert("判定結果", $"タグ名: {prediction.TagName} Probability: {prediction.Probability}", "OK");
            }
            catch
            {
                await DisplayAlert("判定結果", $"エラー", "OK");
            }

不明点

IterationIDを指定しないとAPI呼び出しがNot Foundになってうまくいきませんでした。
オプション項目なのになんでだろう???

ソースは以下に置いています。

github.com

実行

f:id:tonkun_no:20181209065722p:plain

結果からすると、期待した結果にはなりませんでした。( 一一)
もちろん学習させた画像であれば正しく判定される場合もありますが、似たような画像を撮影してみてもチャンカレとは判断されず。
何だろう学習させた画像が悪いのか?そもそもお題が悪かったのか?調査が足りませんでした。。。orz

もうちょっと調べてみないと、お仕事などで実際にどう使っていけるかわからないので、
時間のある時にまた調べてみたいと思います。