多機能すぎる Computer Vision の機能をおさらい(2020年12月版) ~ Microsoft Azure Cognitive Services | Vision

他の多彩な(?)サービスに紛れて、案外注目されていない [Computer Vision](https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/) サービスの機能いろいろを紹介します。

[Microsoft Azure > Cognitive Services > Computer Vision](https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/)

Microsoft Store アプリとして無料で公開されている [Intelligent Kiosk](https://www.microsoft.com/ja-jp/p/intelligent-kiosk/9nblggh5qd84) をインストールすると、Computer Vision の機能を気軽に試すことができます。例えば、画像の分析機能↓

![20201204_ComputerVision_Kiosk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/af88b69a-dda4-8f88-ced1-35ffff6df058.png)

コンピュータビジョン（computer vision）とは: 

> コンピュータビジョン（computer vision）はコンピュータがデジタルな画像、または動画をいかによく理解できるか、ということを扱う研究分野である。工学的には、人間の視覚システムが行うことができるタスクを自動化することを追求する分野である。
> from [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3)

ということで、Cognitive Services の Computer Vision も全般的な画像の分析を行うサービスです。(用語なのか、サービス名なのか分かりにくい💧。以下、"Computer Vision" と記載するときは Cognitive Services の Computer Vision (サービス) のこととします。)


# Computer Vision の主な機能

Computer Vision の主な機能を紹介します。

- 物体認識 (Object Detection)
- OCR
- タグ、キャプション作成
    - 認識した物体の情報から、その画像を説明するタグを選定し、キャプション(説明、文章) を生成します。
- 色
    - 画像に使われている色、トーンからメインカラー、サブカラーを選定します。
- サムネイル作成
    - 画像の主題を中心にサムネイル画像を作成します。
- 空間認識 (Spatial Analysis)
    - 2次元の動画 (＝ 深度カメラによる Depth は不要) から人物を認識 (Object Detection) します。

# Computer Vision の使い方

## 必要な準備

- Azure サブスクリプション (無料試用版でOK)
- Computer Vision サービスの作成 (Free版でOK)

[Azure 無料試用版 & Cognitive Services 準備](https://qiita.com/annie/items/3c9ddc3fb8f120769239) の手順を参考に作成しておきます。

## Web API リクエストなど使い方

Web API リクエスト、または SDK ( .NET C# ( [.NET Document](https://docs.microsoft.com/ja-jp/dotnet/api/overview/azure/cognitiveservices/client/computervision?view=azure-dotnet) |[nuget](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Vision.ComputerVision/)), [Node.js(JavaScript)](https://docs.microsoft.com/ja-jp/javascript/api/@azure/cognitiveservices-computervision/?view=azure-node-latest), [Python](https://docs.microsoft.com/ja-jp/python/api/azure-cognitiveservices-vision-computervision/azure.cognitiveservices.vision.computervision?view=azure-python), [Java](https://docs.microsoft.com/ja-jp/java/api/overview/azure/cognitiveservices/client/computervision?view=azure-java-stable), [Go](https://godoc.org/github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v2.1/computervision) ) も利用できます。

Web API の仕様は API リファレンスから確認できます
- [v3.1](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/5d986960601faab4bf452005)
- [v3.2 Preview (Read のみ)](https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2-preview-1/operations/5d986960601faab4bf452005)

Web API なので、例えば以下のように情報をセットしてリクエストを送信、結果を取得します。

```
// Request URL
POST https://YOUR_CV_URL/vision/v3.1/detect
// Header
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUB_KEY
// Body
{"url":"http://example.com/images/test.jpg"}
```

YOUR_CV_URL(エンドポイント) と YOUR_SUB_KEY(キー) は Computer Vision のサービス作成時や Azure Portal から確認してください。

![20201201_AzPortal_ComputerVisionKey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/5ff188b3-b5b6-1012-afae-fd9b1153e5b7.png)

## コンテナーの利用

Web API リクエストで利用できる Computer Vision は、ローカル環境に配置して利用できる Docker コンテナー も用意されています。(Dockerコンテナーで稼働させる Web サービスに API Request して利用します。)
Computer Vision の機能では、OCR (Read API) と 空間認識 (Spatial Analysis) がコンテナーとして提供されています。

[Microsoft Docs > Azure Cognitive Services コンテナー](https://docs.microsoft.com/ja-jp/azure/cognitive-services/cognitive-services-container-support)

利用イメージ↓
[Cognitive Services Containers を利用して ローカルの Docker コンテナで Text Analytics Sentiment を試す](https://qiita.com/annie/items/21bb726e9bbc8db56e54)

> 空間認識の機能はコンテナーのみの提供です。

# 利用できる Web API と機能

| # | 機能 | API 名称 | API Call 先(v3.1, v3.2 preview) |
|---|----------|--------------------|------------------------------|
| 1 | **画像分析**<br/>コンテンツカテゴリー、色の選定<br/>人物の顔、物体認識、タグ、ロゴ、不適切、著名人、名所旧跡の認識 | [Analyze Image](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f21b) | https://YOUR_CV_URL/vision/v3.1/analyze|
| 2 | 物体認識 | [Detect Objects](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/5e0cdeda77a84fcd9a6d4e1b) | https://YOUR_CV_URL/vision/v3.1/detect |
| 3 | タグ付け | [Tag Image](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f200) | https://YOUR_CV_URL/vision/v3.1/tags |
| 4 | キャプション作成 | [Describe Image](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f21f) | https://YOUR_CV_URL/vision/v3.1/describe |
| 5 | 主題となる画像領域の抽出 | [Get Area of Interest](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/b156d0f5e11e492d9f64418d) <br/> [Get Thumbnail](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f20c) | https://YOUR_CV_URL/vision/v3.1/areaOfInterest <br/> https://YOUR_CV_URL/vision/v3.1/generateThumbnail |
| 6 | OCR | [Read](https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2-preview-1/operations/5d986960601faab4bf452005) <br/>※3.2 Preview を推奨 | https://YOUR_CV_URL/vision/v3.2-preview.1/read/analyze |
| 7 | 特定ドメインの検出 | [Recognize Domain Specific Content](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f311) | https://YOUR_CV_URL/vision/v3.1/models/{model}/analyze <br/>※{model} は特定ドメインモデル名 |

## 1. 画像分析

一番多機能な API です。
コンテンツカテゴリー、色、人物の顔、物体認識、タグ、ロゴ、不適切、著名人、名所旧跡 の検出が可能です。
Analyze で以下のパラメーター(出力の有無)を設定します。

- VisualFeatures
    - Adult: 不適切なコンテンツ
    - Brands: ロゴ、ブランド
    - Categories: カテゴリー
    - Color: メイン、サブカラー
    - Description: キャプション(説明文)
    - Faces: 人物の顔 (年齢と表情
    - ImageType: 画像情報(サイズ、ファイルタイプ)
    - Objects: オブジェクト検出
    - Tags: 画像タグ
- details
    - Celebrities: 著名人
    - Landmarks: 名所旧跡

また、パラメーターで言語設定(language=ja だと日本語)も可能です。
例えば Postman で API Request を行うと、以下のように出力結果が JSON が取得できます。

![20201204_ComputerVision_Analyze.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b3289f52-b284-01e1-6e6e-dc8a09ab7bd5.png)


## 2. 物体認識

画像の Object Detection を行い、Object とその位置(rectangle の座標)を出力します。

![20201204_ComputerVision_Detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e61257ea-43e7-31c8-5ec6-55a1b6693802.png)

JSON で出力されたこの情報を Intelligent Kiosk でユーザーに分かりやすい UI で表示するとこのようになります。

![20201204_ComputerVision_DetectImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/4ad99e88-93a8-8e75-58f5-eea95dd21ac8.png)

## 3. タグ付け

画像から検出した Object や推測される動作、状況などをタグとして選定し、関連度 (confidence) スコアと共に出力します。パラメーターで言語設定(language=ja で日本語)も可能です。

![20201204_ComputerVision_Tag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a27b1176-9c50-3f58-1586-5e796160652b.png)


## 4. キャプション作成

画像の説明に合ったキャプション(文章)を生成して出力します。こちらもパラメーターで言語設定も可です。

![20201204_ComputerVision_Describe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7d51b20e-34d5-4a50-2099-72ce1d0bce9e.png)

## 5. 主題となる画像領域の抽出

[Get Area of Interest](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/b156d0f5e11e492d9f64418d) で主題となる画像領域の座標を出力し、[Get Thumbnail](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f20c) で主題領域を目途に指定サイズに切り出しを行います。

![20201204_ComputerVision_AreaofInterest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0315ef49-da32-770c-b9f2-44fb635d5221.png)

Get Thumbnail では、パラメーターでサイズ(width & height)や、主題に沿った切り出し(smartCropping)の指定を行います。

[元の画像](https://azurecomcdn.azureedge.net/cvt-1009be30bf9d8d3eff7a5d1f26065b033b93d09039c202bc704a01f99d63c9eb/images/page/home/hero-tablet.jpg)

結果↓

![20201204_ComputerVision_Thumbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/1b234e86-d3a1-7a89-7e82-28dc878b9066.png)

## 6. OCR

OCR という名前の Web API もありますが、ぜひ [Read](https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2-preview-1/operations/5d986960601faab4bf452005) (※ 最新の日本語対応版の 3.2 preview) を使ってください。

まず、[Read](https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2-preview-1/operations/5d986960601faab4bf452005) に POST すると、Resonse Header で結果のURLを取得できます。

![20201204_ComputerVision_PostRead.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/38b10b59-53e0-8943-be62-4d265f4ab712.png)

結果の URL  (→ [Get Read Result] (https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2-preview-1/operations/5d9869604be85dee480c8750)) に GET Request して結果を取得します。(Header に Subscription Key のセットをお忘れなく)

![20201204_ComputerVision_GetReadResult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/09255844-26fc-71d8-195b-f8ed9457dfc4.png)

この情報を画像上に配置してみると、このようになります。

![20201204_ComputerVision_ReadResult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/65978196-8531-3d85-e436-ad0a5a425de0.png)


## 7. 特定ドメインの検出

特定ドメインのオブジェクトを検出します。
利用できるドメインは [List Domain Specific Models](https://westcentralus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-1-ga/operations/56f91f2e778daf14a499f20e) で取得できます。 (現在は 著名人(celebrities) と 名所旧跡(landmark)) 

[元画像](https://upload.wikimedia.org/wikipedia/commons/f/fc/%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC_%28214699253%29.jpeg)
![20201204_ComputerVision_TokyoTower.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/6045d89b-c112-cf5a-027e-148bd26c3b02.png)

↓結果

![20201204_ComputerVision_DomainModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/241fa784-3ead-eb80-ccbe-dd172986acec.png)