Azure Machine Learning ことはじめ（Custom Vision による画像分類）

Azure の機械学習サービスのうち、Custom Vision を使った画像分類について勉強します。

Microsoft Learn から AI-900 の学習コンテンツで、画像分類のサンプル練習課題にそって進めます。

https://microsoftlearning.github.io/AI-900-AIFundamentals/instructions/03a-classify-images.html

なお、Microsoft アカウントと Azure のサブスクリプションを用意しておきます。

# Custom Vision の準備

Azure Portal で Cognitive Services を検索し、そのページに進みます。

Cognitive Services には、画像系だけでなく、音声や言語など、様々な認識サービスが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/010a527c-3884-a645-cf9e-7b734fc856ac.png)

今回使用する Custom Vision は画像系のサービスの一つで、自分で用意した学習素材を使ってトレーニングを行い、画像の分類を行います。

Cognitive Services のサービス一覧から Custom Vision の「＋作成」をクリックします。

Custom Vision の作成画面が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/615f691e-49f4-a41d-125f-cdf05650a800.png" width="600">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/27c4f381-f90f-c226-7ab7-b4cd601ec571.png" width="600">

作成オプションでは「両方」を指定します。
サブスクリプションやリソースグループ、リージョンは適当なものを選びます。名前も入力します。ここでは「my-image-vision」としました。

トレーニングリソースや予測リソースは、とりあえず「Free F0」としておきます。
入力を行い、作成を行います。

# Custom Vision ポータル

Custom Vision には [Custom Vision ポータル](https://customvision.ai)という専用のサイトが用意されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/8ba5c7ce-c744-3681-43bf-153a5d1dc553.png" width="500">

ここでは、トレーニング用画像をアップロードし、オブジェクト検出モデルをトレーニングさせることができます。

NEW PROJECT から新規にプロジェクトを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/3e966c4b-567c-c0dc-4160-f1fa4c297eaa.png" width="400">

名前、説明などを指定していきます。次のように設定を行いました。

今回は、
* 名前：Grocery Checkout
* 説明：Image classification for groceries
* リソース：Azure Portal の Cognitive Services で作成した Custom Vision を指定します
* プロジェクトタイプ：Classification
* 分類タイプ：Multiclass (single tag per image)
* ドメイン：Food

しばらくすると、作成したプロジェクト「Grocery Checkout」用のページが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/487cc739-e103-8f2f-ab8d-4269183d8976.png" width="600">

## トレーニング画像のアップロード

まず最初にトレーニング用の画像を登録します。

トレーニング用の画像ですが、３種類のフルーツの画像のセットが用意されています。下の URL をクリックしてダウンロードを行います。zip ファイルですので解凍します。展開後、３種類のフォルダがありますので、これをアップしていきます。

https://aka.ms/fruit-images

プロジェクトページの Add Images をクリックし、まずは「apple」の画像をアップします。
この際、My Tags に「apple」と入力するのを忘れないようにします。

画像の指定と、タグの入力が終われば、Upload ボタンを押します。

これを、「orange」、「banana」の画像に対しても行います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/177e83b2-7413-809f-819d-c3e446a28aeb.png" width="500">

## トレーニング

３種類の画像の登録が終われば、トレーニングを開始します。プロジェクトのトップページの右上にある「Train」ボタンを押します。

トレーニングのタイプを聞いてきます。Quick Traning を指定してトレーニングを開始します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/10729c47-cf8b-590b-bde4-84e9392dc6d2.png" width="600">

トレーニングの完了を待ちます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/244b0548-c9e3-eba4-ed8d-632bc9f6beed.png" width="500">

## Quick Test で確認する

トレーニングが終わったら、ちゃんと分類できるか簡易的に確認します。

プロジェクトトップページの右上にある「Quick Test」をクリックします。

簡易テスト用の画像が用意されているので、その URL を Image URL に入力し、「－＞」をクリックします。

簡易テスト用URL　https://aka.ms/apple-image

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/3bf42faf-ade5-a71e-68df-8b0f84cbde48.png)

簡易テスト用の画像は、見ての通りリンゴです。

簡易検索結果ですが、その下にある Predictions の Tag では apple が 98% となっていました。
ちゃんと分類できそうです。

# 予測モデルを公開する

Quick Test をパスしたら、いよいよ予測モデルを公開し、実稼働を意識した最終テストを行います。

まずは、予測モデルを公開します。ポータルトップの上部にある「Performance」をクリック、次に「Publish」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/fbe7c104-eeb8-24ee-67c3-a78a331c46ac.png" width="400">

必要事項を入力します。

* Model Name：トレーニングで使用したモデルの名前です。
* Prediction resource：Cognitive Services で作成したリソースがプルダウンで選べるようになっています。 

公開ができたら、「Prediction URL」をクリックします。ここで画像分類で使用するエンドポイントとキーを確認することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/4e911655-f140-fe8a-03b1-2da59841160b.png" width="500">

# プログラムから予測モデルを使用する

プログラムから予測モデルの API をコールして結果を表示してみます。

用意されているプログラムを使用します。github で公開されていますので、git コマンドを使ってダウンロードします。

```bat:git コマンドを使ってダウンロード
git clone https://github.com/MicrosoftLearning/AI-900-AIFundamentals ai-900
```

ダウンロードができたら、ai-900 フォルダの下にある「classify-image.ps1」ファイルをエディタで開き、1-2行目にある $predictionUrl と $predictionKey 変数の値を書き換えます。

これらの値は、予測モデルを公開した時のエンドポイント URL とキーになります。
※Image URL の方です

```powershell:classify-image.ps1
01 $predictionUrl="https://myimagevision-prediction.cognitiveservices.azure.com/customvision/v3.0/Prediction/********************"
02 $predictionKey = "16******************22"
03 
04 # Code to call Custom Vision service for image classification
05 
06 $img_num = 1
07 if ($args.count -gt 0 -And $args[0] -in (1..3))
08 {
09     $img_num = $args[0]
10 }
11
12 $img = "https://raw.githubusercontent.com/MicrosoftLearning/AI-900-AIFundamentals/main/data/vision/fruit-$($img_num).jpg"
13 
14 $headers = @{}
15 $headers.Add( "Prediction-Key", $predictionKey )
16 $headers.Add( "Content-Type","application/json" )
17 
18 $body = "{'url' : '$img'}"
19 
20 write-host "Analyzing image..."
```

編集が終われば保存してエディタを終了します。

Powershell コンソールから次のコマンドを実行します。

```powershell:分類を実行
PS ./classify-image.ps1 1
Analyzing image...

 apple
```

引数は、1、2、3 のいずれかを指定可能です。

ソースをみれば分かりますが、引数の 1、2、3 は、あらかじめ Web で用意されている３種類のサンプルを指定して、$img 変数に、その URL を格納しています。

そこで、Web で公開されている リンゴ or バナナ or オレンジの URL を $img に代入してみます。

写真素材ルームさんの画像をお借りしてみます。

https://photo-room.net/

このページのリンゴ画像紹介ページ https://photo-room.net/2559/ から、画像の URL https://photo-room.net/photos/pr01012.jpg を使用します。


```powershell:classify-image.ps1 の編集
11 # オリジナルをコメントアウト
12 #$img = "https://raw.githubusercontent.com/MicrosoftLearning/AI-900-AIFundamentals/main/data/vision/fruit-$($img_num).jpg"
13 # 写真素材ルームさんのリンゴの画像の URL を指定する
14 $img = "https://photo-room.net/photos/pr01012.jpg"
15 
16 $headers = @{}
17 $headers.Add( "Prediction-Key", $predictionKey )
18 $headers.Add( "Content-Type","application/json" )
19 
20 $body = "{'Url' : '$img'}"
```

保存した後、Powershell のターミナルから次のコマンドを実行します。引数は不要です。

```powershell:classify-image.ps1を実行
PS ./classify-image.ps1 
Analyzing image...

 apple
```

ちゃんと認識できました。

続いてバナナの画像を試します。https://photo-room.net/511/ から、画像の URL https://photo-room.net/wp-content/uploads/pr00226.jpg を分類させてみます。

```powershell:classify-image.ps1を実行
PS ./classify-image.ps1 
Analyzing image...

 banana
```

うまくいきました。

最後にオレンジです。https://photo-room.net/1315/ からオレンジの画像の URL https://photo-room.net/wp-content/uploads/pr00454.jpg を使用します。

```powershell:classify-image.ps1を実行
PS ./classify-image.ps1 
Analyzing image...

 orange
```

これも問題なく分類できました。

# 関連記事

[Azure Machine Learning ことはじめ（Azure Machine Learning Studio を使ったデータ分類）](https://qiita.com/tnishiki/items/e33142a68dcdcede27d9)

[Azure Machine Learning ことはじめ（テキスト分析）](https://qiita.com/tnishiki/items/d4df523866683cd6ecf2)