AzureのAIサービスを利用してみる2【Cognitive ServicesのCustom Vision】

## はじめに
AIの活用は、コスト削減や効率化に伴う売上向上、監視や管理の自動化、人的リソース不足解消といったようなメリットがあると言われてますが、実際にAIを使う事を考えた場合には、データを集めて学習して、コードを書いて、アプリケーションを作成して、運用まで実施といった事が常に必要ということは無く、既に作成及びサービス化されたAIを料金を払う事で利用することもできます。
(例えば、音声をテキストに変換とか、画像から文字の認識といったようなサービス)

この記事では、**以前記載した[Teachable Machineで気軽にAIを体験](https://qiita.com/s_yosh1d/items/0ac1e5c941ecda52b131)で実施したような内容をCustom Visionを利用し、自分で学習用画像とタグを用意し、未知の画像を用意したタグで分類されるようにしてみます。**
使い方によっては、自分の関係する製品の異常検知で利用といった使い方も考えられます。

| ![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a0a0086d-0ae4-c0da-3ec5-3bb3e09069d4.png)
|:-:|


 
## 何をしたい？できる？
- **Azure Cognitive ServicesのCustom Visionを使ってみる**
- <font color="Red">**サービス化されているAIに、自分で用意した画像とタグ設定の追加を行い分類の実行**</font>
- 用意されているサンプルコードに必要情報だけ書き換えて実行

## AI環境と利用について

この記事では、既に用意されているカスタマイズサービスを利用することで、比較的簡単に短時間で自分で用意した画像と定義したタグでの画像分類を試したいと思います。

| ![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a7162cfd-df19-6020-10da-ff65843e7925.png)
|:-:|

## 設定手順
基本的に無料を選ぶようにしてますが、<font color="Red">価格レベルの指定によっては、料金がかかる可能性があります。</font>
<font color="Red">**手順は記事作成時点のものなので、画面例は変更される可能性があります。**</font>

例で指定されている以下のパラメータは、環境によって異なる内容なので適宜変更して下さい。Custom Visionインスタンス名はURL名として利用されるので、一意の名前が必要です。

- リソースグループ名：ai_rg100
- Custom Visionインスタンス名：customv-neko100
- リソースを作成するリージョン：Japan East

<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/0b53b864-5946-62af-3159-4c300435974c.png>

#### 1.リソースグループ作成
サインインやAzureでリソースグループの作成については、
[AzureのAIサービスを利用してみる1](https://qiita.com/s_yosh1d/items/360834a8d4c6439abd2c#1-azure%E3%81%A7%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BD%9C%E6%88%90)の記事と同じ内容となりますので割愛します。


#### 2.Custom Visionリソースの作成
リソースグループの概要画面で、[作成]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c58dce10-9a6b-34d5-3187-6762852e5d88.png>

Marketplace画面に遷移するので検索部分に、[Custom Vision]と入力し検索を行い、表示されたCustom Visionを選択します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c9ed02b2-34a1-20c7-fd00-d00c8e4dd93f.png>

作成をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/32a7eef8-94a0-51a5-c92c-b56e5786caa7.png>

表示された画面で、作成オプションを選択します。
自分で用意した画像を用いて学習(トレーニング)を行いて、モデル作成後に未知の画像の分類(予測)を行いたいので、**作成オプションは両方を選択します。**
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9aa86b6c-a6ba-41bb-85d6-51fc79f48e12.png>


リージョンの選択とインスタンス名の入力を実施します。
**インスタンス名は外部インターネットに公開して利用する為、一意の名前が必要です。**
価格レベルについては、検証レベルで数回程度のサービス利用とするので、トレーニングも予測についても[Free F0]を選択し、画面下方にある[確認と作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f8b91fda-3a52-abe9-6fcc-f6e3bf9a1ac6.png>

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/74d9cec9-c393-d423-e347-fd5c277f75e9.png>


[検証に成功しました。]が表示されたら、[作成]をクリックします。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cca8575b-9efc-3731-976d-87b89702d783.png>

デプロイ完了後、[リソースに移動]をクリックします。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/af22789f-2ec5-b353-aef1-00cfbec1b714.png>



#### 3.Custom Vision ポータルでタグ定義と学習の実行
まだ推測は実施しないので、表示されたリソースで**Predictionがついていない方**を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cd39d355-3f48-6da1-6bf0-7542ba254996.png>

画面中央の[Custom Vision ポータル]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f567a202-dce2-b5a5-66b7-fc7461cb14de.png>

別タブで画面が表示されるので、表示された画面で[SIGN IN]をクリックします。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fc6f0201-6b95-b1ba-0fff-c0486d5c11fd.png>

表示された画面で[New Project]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/039c7d62-4d76-960d-d0c1-d45fcef6aad3.png>

任意のプロジェクト名を入力し、分類を行う為[Classfication]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/38741edb-d166-56ab-8d52-0bd0fb33e66c.png>


1画像に複数の分類タグを割り振る予定なので、[Muktilabel]を選択し、食品や服飾と異なり汎用的な画像分類を行う為、ドメインは[General]を選択し、画面下方の[Create Project]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/3c12c03b-aea3-c354-b679-510f04e34256.png>

表示された画面の左側のTagsにある[+]をクリックして、表示された画面でタグの定義を実施します。
(定義後に再度[+]をクリックして複数作成可能)

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6564519d-8346-e292-fe8e-feadf1a0f8b8.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5025dbf8-fd29-658d-873d-a10991e2ecdd.png>


画面上方か、画面中央の[Add images]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a5ddbf7e-d69a-1a37-5218-a319226c9a2c.png>

ローカルPC上から学習に使う画像を選択後、表示された画面の[My Tags]部分で事前に登録していたタグを選択し[Upload file]をクリックします。**タグ毎に30枚程度の画像を使う事が推奨となってます**がここでは7枚程度で進めます。

形式やサイズについては以下の制約があります。
- jpg、.png、.bmp、または .gif 形式 (サイズが 6 MB 未満で予測用画像は 4 MB)
- 最短の辺が 256 ピクセル以上 (これより短い画像は自動的にスケール アップされる)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/84cef8a3-beef-23ff-7192-86306b326fd7.png>

学習に使う画像を一通りUpload後、画面上方の[Trarin]をクリックして学習を進めます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/09cd741f-9f11-0946-5a84-15b9ed89969f.png>


精度を重視するために時間を多くかけるかける事もできますが、ここでは[Quick Traning]を選択し[Train]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/64ccad02-7b28-a511-e22e-1389881a5b17.png>

学習が完了するまで暫く待ちます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/901ffcad-aa04-43b5-e096-8fcc8a8ab8cb.png>

学習が完了すると、精度等が表示されます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a9f93f0b-f1d1-29da-b8ef-5a82829cb58b.png>


#### 4.推測の実行
学習完了後のCustom Vision ポータル画面上部で[Publish]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a5a6017a-2d9e-524c-db7b-36cbb9437ce4.png>


表示された画面において、推測を実施したいのでPredictionがついているリソースを選択し、[Publish]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ec443a45-6cfb-5076-df73-afbc6ee3e93b.png>

画面上部の[Quick Test]で、学習で使用してない画像を使って分類を試す事が可能です。
(学習に使ったものだと高確率の回答となるし、実際には未知の画像を使うはずなので)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c4655075-d263-a0f8-f376-8035e29a11ac.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ee16f700-94df-33ed-f6b9-15fa7971c464.png>


#### 4.Pythonコードからの実行
ここでは、[Google Collaboratory](https://colab.research.google.com/?hl=ja)にUploadしている学習には未使用の画像を用いて分類を試してみます。

コードに必要な環境情報は、Custom Vision ポータル画面の[Prediction URL]やプロジェクト上に表示されている値を使う為、コピーしておきます。

:::note info
**推論時に使う画像のURLを指定するか、ローカルのファイルを指定するかでエンドポイントが異なるので注意が必要です。**
:::

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f8ff4982-6faa-84b2-4f90-428efcbde20d.png>


<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/92058246-5bb9-26a3-3c36-e870f2887827.png>

サンプルコードとしては以下のものを利用しています。
```python:
import requests
import json

# 環境に合わせて変更するID等
prediction_endpoint="Custom Vision ポータル画面のPrediction URLの表示からコピー"
iteration_id="Custom Vision ポータル画面のIteration idをコピー"
prediction_key="Custom Vision ポータル画面のPrediction URLの表示からコピー"

# 予測に使うファイル名
prediction_filename="ローカルファイルのファイル名"

# APIのPOST要求部分
url="https://"+prediction_endpoint+"?iterationId="+iteration_id
headers={'content-type':'application/octet-stream','Prediction-Key':prediction_key}
response =requests.post(url,data=open(prediction_filename,"rb"),headers=headers)
response.raise_for_status()

# 結果の表示
result = response.json()
name, pred = result["predictions"][0]["tagName"], result["predictions"][0]["probability"]
print(name, pred)
name, pred = result["predictions"][1]["tagName"], result["predictions"][1]["probability"]
print(name, pred)
```

以下の画像のように推論を実施することができます。
![032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/4a908061-8eb8-7133-6ccd-c58164239000.png)




## 関連記事
[Teachable Machineで気軽にAIを体験](https://qiita.com/s_yosh1d/items/0ac1e5c941ecda52b131)
[AzureのAIサービスを利用してみる1](https://qiita.com/s_yosh1d/items/360834a8d4c6439abd2c)


## 参考及びリンク
[Cognitive Services API Reference](https://southcentralus.dev.cognitive.microsoft.com/docs/services/Custom_Vision_Prediction_3.0/operations/5c82db60bf6a2b11a8247c14)
[Custom Vision SDK または REST API の使用](https://learn.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?tabs=visual-studio&pivots=programming-language-python)
[Custom Vision のドキュメント](https://learn.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/)