XamarinでAzure Custom Visionを使ってみた
の9日目の記事になります。
今回は Azure Cognitive Servicesの中からCustom Visionを使います。
やってみたこと
私の住んでる石川県には「金沢カレー」と言う食べ物があります。
何種類かお店があるのですが、その中の1つのチャンピョンカレーのカレーの画像を学習させて、
Xamarinで撮影した写真から判定できるか試してみました。
Custom Visionの準備
https://customvision.ai からサインインする。
[NEW PROJECT]を選択する。
各項目を入力する。
今回はカレーの判定なので
[Classification Types]はMulticlass (Single tag per image)
[Domains]はFood
にしてみました。
作成直後は以下のような画面になります。
Tagsから新しいタグを登録する(Is Negative?はどういう時に使うんだろう)
学習用の画像を[Add images]から追加する。
[My Tags]からに登録したタグを選んで、今回は40枚画像を登録しました。
この為にお店で写真撮りまくりました(*ノωノ)
[Train]から学習させます。
Trainするためには、最低2つタグが必要だそうで、慌ててもう1つタグを追加して
別のカレーの画像を登録しました。
学習が完了すると[Performance]に内容が表示されます。
[Probabily Threshold]を変更すると調整できるようですが、とりあえずこのままにします。
実装
SDKが用意されているので、そちらを使います。
NugGetのパッケージマネージャーから[Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction]で検索してインストールします。
この記事を書いている時点ではプレビュー版なので[プレリリースを含める]にチェックを入れないと見つかりません
また似た名前でMicrosoft.Cognitive.CustomVision.Predictionと言う物もありますが公開日が2017.12.20なので恐らく以前のものかと思います。
Apiを使用する際のApiKeyとEndpointは
[Performance]の[Prediction URL]から確認できます。
カメラ部分についてもPluginにお任せです。
実行部分はこんな感じです。
以下抜粋
// 写真撮影 // 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になってうまくいきませんでした。
オプション項目なのになんでだろう???
ソースは以下に置いています。
実行
結果からすると、期待した結果にはなりませんでした。( 一一)
もちろん学習させた画像であれば正しく判定される場合もありますが、似たような画像を撮影してみてもチャンカレとは判断されず。
何だろう学習させた画像が悪いのか?そもそもお題が悪かったのか?調査が足りませんでした。。。orz
もうちょっと調べてみないと、お仕事などで実際にどう使っていけるかわからないので、
時間のある時にまた調べてみたいと思います。