Cognitive Services Computer Vision Read OCR を Docker コンテナーで使ってみる

Microsoft Azure の AI サービスである [Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/) は Web API として利用できるだけでなく、Docker コンテナーとして稼働させることが可能です。エッジデバイス にインストールして利用するといった用途が考えられ、ダイレクトに (Web を介さずに) 分析できるので速い、クラウドへ分析データを送信しないというメリットがあります。

今回はローカル PC で稼働する Docker 環境で利用できる Cognitive Services コンテナーのうち、 Conputer Vision Read OCR (画像OCRサービス) を稼働させ、使ってみる方法を紹介します。

> クラウドに分析データを送信することはありませんが、サービスの利用量を計上するためのインターネット接続が必要になる場合があります。(完全にオフライン環境で利用できるサービスは Private Preview で提供中)

# 環境

以下の手順は、こちら↓の PC 環境で動作確認をしています;

Windows 11 Enterprise 21H2
x64 | Intel Core i7 | RAM 16 GB


# 準備

## Azure サブスクリプション申し込み & Cognitive Services Compter Vision サービス作成

[Microsoft Azure & Cognitive Services 利用準備](https://qiita.com/annie/items/3c9ddc3fb8f120769239) を参考に、Azure サブスクリプションの申し込み、および **Computer Vision** サービスを作成しておきます。(無料版でOKです。)

### Key, Endpoint の取得

[Azure Portal](https://portal.azure.com) にサインインして作成した Computer Vision のサービスを開きます。

左列メニューから **キーとエンドポイント** をクリックして開きます。**キー1** の右側にある青いアイコンをクリック or **キーの表示**をクリックして、表示されるキー (文字&数字の20文字程度) をコピーしてローカルに保存しておきます。
同様に **エンドポイント** に表示される値 (*https://YOUR_SERVICENAME.cognitiveservices.azure.com/* の形式) をコピーしてローカルに保存しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/4afe73e4-8b2e-e01d-a909-d1f53cdbe731.png)


## Docker 環境のインストール

Docker Desktop のインストールで Docker 環境を構築することが可能です。
[Docker: Getting Started](https://www.docker.com/get-started) のページから Docker Desktop を選択、ダウンロードしてインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a5a1a0e3-3a13-4254-631b-c4a47f5a5246.png)

> 2021年8月より Docker のサブスクリプションプランが変更されており、有償となる場合がありますのでご注意ください。(個人、OSSの開発、教育機関などの場合は無料で利用できるとのこと)
[Docker FAQs: Updated Docker Subscription and Licensing Questions](https://www.docker.com/pricing/faq)


# 手順

以下の手順は、Windows PowerShell および Docker Desktop で操作、確認を行います。
Windows PowerShell は管理者権限で起動しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/35bdc731-6b34-e3a9-62ec-986e2e2dc218.png)

## Computer Vision Read OCR コンテナーの Pull

PowerShell から Docker コマンド (**docker pull**) を使って、[Computer Vision Read OCR コンテナー](https://hub.docker.com/_/microsoft-azure-cognitive-services-vision-read) をローカルにダウンロードします。
パラメーターで 2022 年 3 月現在の最新モデル、v3.2 preview 2022-01-30 を指定しています。

```
docker pull mcr.microsoft.com/azure-cognitive-services/vision/read:3.2-model-2022-01-30-preview
```

ダウンロードが終わったら、**docker image** コマンドで、Read OCR イメージがローカルに作成されていることを確認します。

```
docker image ls
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ac229906-7cc6-7e1a-9838-6d52e0ae7b6d.png)


## Computer Vision Read OCR コンテナーの起動

PowerShell から **docker run** コマンドで 以下のパラメーターを設定して Read OCR コンテナーを起動します。

|パラメーター|内容|値||
|:----------|:-----------|:----------|:----------|
| -p | ローカルポート | **5000** | ※お好みのポートでOK |
| --name | コンテナー名 | **ReadOCR** | ※お好みの名前でOK |
| --memory | コンテナーのメモリー | **16g** | Read OCR コンテナーの最小値 |
| --cpus | コンテナーのCPU数 | **4** | Read OCR コンテナーの最小値 |
| Eula | 利用許諾 |**accept** | ※必須 |
| Billing | Read OCR 課金URL |ローカルに保存しておいた **エンドポイント** | ※必須 |
| ApiKey | Read OCR Key |ローカルに保存しておいた **キー1** | ※必須 |


```
docker run -itd -p 5000:5000 --name ReadOCR --memory 16g --cpus 4 mcr.microsoft.com/azure-cognitive-services/vision/read:3.2-model-2022-01-30-preview Eula=accept Billing=https://YOUR_SERVICENAME.cognitiveservices.azure.com/ ApiKey=YOUR_API_KEY
```

Docker Desktop を起動すると、*Container/Apps* 画面に **ReadOCR** コンテナーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/64552005-afe5-277b-5bcf-dbaf8ef443c2.png)

また、*Images* 画面で Read OCR のイメージが表示され、利用されているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ac49fbc5-7e88-046b-a133-708e574b1b59.png)

## Computer Vision Read OCR コンテナー を使ってみる

ブラウザーを開き、**http://localhost:5000** にアクセスすると、Cognitive Services コンテナーが起動している画面が表示されます。**Service API Desciption** をクリックして Swagger Document ページを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/072bac5a-9dd7-7cc6-0db0-c2a323f31ca3.png)

**[POST]/vision/v3.2/read/analyze** をクリックして表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/37604668-915a-0077-f25a-aa54039e6bf8.png)

Web API を利用する際のパラメーターなどの情報が表示されます。
こちらのページで使ってみるには、**[Try it out]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/6eb8943f-9d55-6ca4-2981-18b7a1f8f0d0.png)

**Request Body** のフォーマットで **application/octet-stream** を選択します。
**[ファイルを選択]** で分析したいローカルファイルを選択、**Execute** をクリックして送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/3c446a86-66c8-ea36-6d2b-bbaa54e0d721.png)

*Server Response* が **202** であれば正常に送信できています。
*Response Header* に表示される **operation-location** の値 (URL) で結果が取得できます。
*http://localhost:5000/vision/v3.2/read/analyzeResults/* に続く ID (operation Id) をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/39f21fe8-598d-5bdd-7021-7df8c036d8e3.png)

Swagger Document から **[GET]/vision/v3.2/read/analyzeResults/{operationId}** をクリックして表示し、**[Try it out]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/36acf692-5c99-3cbf-7487-111930c17b42.png)

*Parameters* にある *operationId* にコピーしておいた **Operation Id** をペーストして **[Execute]** をクリックして送信すると、*Server Response* の **Response Body** に分析結果が JSON 形式で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e11575b3-25b3-248c-0bbc-45aedda18ea7.png)

### Computer Vision Read OCR コンテナーによる画像分析例

例えば、こちらの画像を分析すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/1caf9178-b459-e15f-ae62-b00ce6f93966.png)

このような分析結果となります。検出される文字 (text) や信頼度 (confidence)、テキストの位置 (boundingBox)、画像内でのサイズ (width | height)、傾き (angle) などの情報が取得できます。

```
{
    "status": "succeeded",
    "createdDateTime": "2022-03-17T05:54:47Z",
    "lastUpdatedDateTime": "2022-03-17T05:54:59Z",
    "analyzeResult": {
        "version": "3.2.0",
        "modelVersion": "2022-01-30-preview",
        "readResults": [
            {
                "page": 1,
                "angle": 17.8705,
                "width": 822,
                "height": 379,
                "unit": "pixel",
                "lines": [
                    {
                        "boundingBox": [ 163, 55, 368, 142, 357, 167, 155, 79],
                        "text": "東海道·山陽新幹線",
                        "appearance": {
                            "style": {
                                "name": "other",
                                "confidence": 0.972
                            }
                        },
                        "words": [
                            {
                                "boundingBox": [ 171, 59, 185, 65, 177, 90, 163, 84 ],
                                "text": "東",
                                "confidence": 0.993
                            },
                            {
                                "boundingBox": [ 193, 69, 208, 75, 199, 100, 185, 94 ],
                                "text": "海",
                                "confidence": 0.995
                            },
                            {
                                "boundingBox": [ 219, 80, 234, 86, 225, 111, 210, 105 ],
                                "text": "道",
                                "confidence": 0.996
                            },
                   :
                 (以下省略)

```

## Computer Vision Read OCR コンテナーの停止 | 再起動 | 削除

**docker stop** コマンドで、Read OCR コンテナーの稼働を停止します。

```
docker stop ReadOCR
```

次回利用する際は **docker start** コマンドで Read OCR コンテナーを起動すればOKです。

```
docker start ReadOCR
```


削除したい場合は、**docker rm** コマンドで Read OCR コンテナーを削除します。

```
docker rm ReadOCR
```


> Docker Desktop からも停止、開始、削除を行うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/fa9a4e9e-7428-c839-e10e-d34b3d77b471.png)