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

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

この記事では、以前記載した[自分で用意した学習データでAIタスクの体験](https://qiita.com/s_yosh1d/items/0ac1e5c941ecda52b131)のように自分で学習を含めて一から実施するのでは無く、マイクロソフト社が提供するクラウドサービスである[Microsoft Azure](https://azure.microsoft.com/ja-jp/)**で用意されているAIサービスを利用して画像分類を行なってみる**事にします。

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

## AI環境と利用について
機械学習のプロジェクトでは、**コードを書いて行うモデルの作成・学習(画像の黒い部分)は工数全体から見てほんの一部**で、事前に必要なデータの収集や分析、システム基盤構築の役割は大きい割合を占め、時間が必要な項目となります。
<img width="800" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/0d282870-b6c8-0144-c072-dbd7a1b8e9cc.png>
|:-:|
引用元： [From the paper Hidden Technical Debt in Machine Learning Systems](https://proceedings.neurips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf)


**この記事では、既に用意されているサービスを利用することで、比較的簡単に短時間で画像分類を試したいと思います。**
<img width="800" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5e148dfc-ba4a-9233-7ad8-b83b73374cad.png>
|:-:|


## 設定手順
<font color="Red">**基本的に無料を選ぶようにしてますが、一部クラウドストレージを利用して実施している項目があるので、料金がかかる可能性があります。(Azureのストレージ利用)**</font>
Azureに新規アカウント作成をするような場合には、最初の30 日間に使用できる200ドルのクレジットが付与されるので、アカウントを作成する機会に合わせてAIサービスを試してみると良いかと思います。
<font color="Red">**手順は記事作成時点のものなので、画面例は変更される可能性があります。**</font>

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

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


<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8addc736-539f-8999-c635-a578bfda619e.png>

#### 1. Azureでリソースグループの作成
この記事ではマイクロソフト社のクラウドである[Microsoft Azure](https://azure.microsoft.com/ja-jp/)を利用します。


**1-1.Azureへのサインインを実施**
AzureのWebサイトで画面右側の[サインイン]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d6672301-b74c-2451-e833-11efc8c7df97.png>


**1-2.リソースグループの作成を実施**
Azureのポータル画面に遷移後、画面上部の検索部分に[リソースグループ]と入力し、[サービス]に表示された[リソースグループ]を選択します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ac278b97-d0e7-eefb-ba89-abbf4648218b.png>

表示された画面で作成をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bac5d8d1-bc00-dd00-7436-a55e60442ff4.png>

使用するサブスクリプションの選択、リソースグループ名の入力、リージョンの選択を行い、[確認及び作成]をクリックします。
(新規でAzure利用で無料枠だと、サブスクリプション名は1つしか表示されないはずです)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/393fca57-55a8-e8e5-07b4-2b5a8b439585.png>

[検証に成功しました。]が表示されたら、[作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/089cdd0d-505c-b26f-fd80-e987cc9089f3.png>

作成に成功すると、通知に表示がなされます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c75bf7a8-6547-f69b-afc5-587874ff128f.png>

#### 2. Computer Visionリソースの作成

リソースグループの概要画面で、[作成]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/26d669cd-916e-7a7b-391c-1596ca406bdd.png>

Marketplace画面に遷移するので検索部分に、[Computer Vision]と入力し検索を行い、表示されたComputer Visionを選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/32fbda3e-ae5d-7e83-7ed0-acc2cd133698.png>

作成をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7cc97fc1-5752-ae7f-af47-350c2b45eaa1.png>

表示された画面で、リージョンの選択とインスタンス名の入力を実施します。
**インスタンス名は外部インターネットに公開して利用する為、一意の名前が必要です。**
価格レベルについては、検証レベルで数回程度のサービス利用とするので、[Free F0]を選択し、画面下方にある、同意の承認にチェックを入れて[確認と作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ff23dea8-d338-54e0-6e07-abf3efd077e0.png>

[検証に成功しました。]が表示されたら、[作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f9da45c4-76b3-5c54-ff1a-9d39f6648598.png>

デプロイ完了後、[リソースに移動]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e3ca7da6-6f1f-f46d-19f8-c8f3fea3ed3b.png>

#### 3. Computer Visionのキーとエンドポイント確認
画面左側の[キーとエンドポイント]を選択し、**表示された画面でキーとエンドポイントをコピーしてメモ帳等に張り付けておきます。**
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6c19f271-ac90-b3c5-e134-bd8d6543e797.png>

#### 4. Computer Visionを使って画像分類
画面左側の[概要]を選択し、[APIコンソール]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/70b472a4-d2e0-e928-2ec8-b63b24db5eea.png>

別のタブでAPIコンソール画面が立ち上がるので、画面上方に左側から[Analyze Image]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/24aad995-6644-7324-bfd4-50e34137b61f.png>


画面下方まで移動し、リソースを作成したリージョンの選択を実施します。
(手順例では[Japan East])
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/898fafbe-e2b6-155f-54a9-c1d9b32e64d3.png>

[HOST]の項目で[japaneast.api.cognitive…]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/2eade0c4-0db8-7f05-66d8-016a94656769.png>

[Language]をja(日本語)を選択し、
[Ocp-Apim-Subscription-Key]には、リソース作成時に[キーとエンドポイント]からメモ帳等にコピーしておいた[キー1]をコピーします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9d29f041-14c8-e32b-1b42-4e499e4d8dd4.png>

[Request body]の項目で、分類したい画像の置いてあるURLを記載します。
ここでは、[クイックスタート](https://learn.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=visual-studio&pivots=programming-language-python)で利用されている[サンプル](https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/landmark.jpg)を指定します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ba489217-8026-3d5f-ef32-08649e09582b.png>

画面下方の[Send]をクリックして結果を確認します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fbb6181a-5b93-a951-9b57-898b7efd53c0.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a450af5a-84ef-e9d0-3004-bf67e79e0188.png>


#### 5. ストレージにアップロードした画像を分類
AzureのBLOBコンテナにアップロードした画像はURLを取得できるので、サンプルと同じように分類を試してみます。([Request body]の項目のURLを変えて繰り返し)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/90dd6f42-570a-6bd3-513a-2fc2c2487fc8.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ac4e37e6-65ee-22cb-4789-f46156790792.png>

結果は以下のように、コンソールからだと、低確率+その他という扱いとなります。
(車とかについては、高確率で分類できるのは確認できてます。)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e931a65c-7016-003a-c550-ddf98918f012.png>

## Google Colaboratoryからの実施例
Computer Visonサービスを作成後は、外部からPythonを使って画像分類を実施することもできます。ここでは、[Google Colaboratory](https://colab.research.google.com/?hl=ja)から実施してみます。
サンプルコードは、[クイックスタート: 画像分析](https://learn.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=visual-studio&pivots=programming-language-python)のものをコピーし、必要情報を書き換えて利用します。

#### 1. 必要なライブラリの導入
```python:
pip install --upgrade azure-cognitiveservices-vision-computervision
pip install pillow
```
#### 2. コードのコピーと編集
以下の部分の書き換えが必要です。
**subscription_keyとendpointはメモ帳にコピーする旨を記載した部分です。**

subscription_key = "[キーとエンドポイント]を選択し、表示されたキーのコピー"
endpoint = "[キーとエンドポイント]を選択し、表示されたエンドポイントのコピー"

images_folder = os.path.join部分のコメントアウト
remote_image_url ="分類したい画像の置いてあるURL"

<details><summary><strong>サンプルコード</strong></summary>
<div>

```python:
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from azure.cognitiveservices.vision.computervision.models import VisualFeatureTypes
from msrest.authentication import CognitiveServicesCredentials

from array import array
import os
from PIL import Image
import sys
import time

'''
Authenticate
Authenticates your credentials and creates a client.
'''
subscription_key = "キーのコピー"
endpoint = "エンドポイントのコピー"

computervision_client = ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
'''
END - Authenticate
'''

'''
Quickstart variables
These variables are shared by several examples
'''
# Images used for the examples: Describe an image, Categorize an image, Tag an image, 
# Detect faces, Detect adult or racy content, Detect the color scheme, 
# Detect domain-specific content, Detect image types, Detect objects
#images_folder = os.path.join (os.path.dirname(os.path.abspath(__file__)), "images")
remote_image_url = "分類したい画像の置いてあるURL"
'''
END - Quickstart variables
'''


'''
Tag an Image - remote
This example returns a tag (key word) for each thing in the image.
'''
print("===== Tag an image - remote =====")
# Call API with remote image
tags_result_remote = computervision_client.tag_image(remote_image_url )

# Print results with confidence score
print("Tags in the remote image: ")
if (len(tags_result_remote.tags) == 0):
    print("No tags detected.")
else:
    for tag in tags_result_remote.tags:
        print("'{}' with confidence {:.2f}%".format(tag.name, tag.confidence * 100))
print()
'''
END - Tag an Image - remote
'''
print("End of Computer Vision quickstart.")
```

</div>
</details>

#### 3. コードの実行結果
pythonで実行すると、コンソールで実施したよりも詳細な分類結果が確認できます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ff039ece-5d75-ee25-a69b-5a79bcd7949a.png>

:::note warn
**検証完了後は、リソースグループを削除し、余計なコストが掛からないようにしてます。**
:::

## 参考及びリンク
[Computer Vision のドキュメント](https://learn.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/)
[イメージのタグ付け](https://learn.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/concept-tagging-images)
[クイックスタート: 画像分析](https://learn.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=visual-studio&pivots=programming-language-python)