Microsoft Power AutomateからComputer Vision APIに接続して画像データをOCRする

<span style="color: #d61b09">※2019/10/4のMicrosoft社の発表の通り、従来の「Microsoft Flow」は新機能のUI Flowsが追加されて「Microsoft Power Automate」となりました。記事内の`Microsoft Flow`の記述は`Power Automate`に読み替えて下さい。</span>

# はじめに

Microsoft AzureのCognitive Servicesの一つである[Computer Vision API](https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/)をMicrosoft Flowから利用した際のメモ。

毎月書面で届く請求書から請求金額をOCRしてデータ化したかった。

# やってみる

## Azure PortalでComputer Vision APIのリソースを作成

Azureにログインし、Computer Vision APIのリソースを作成する。以下のURLを叩けば作成画面に行ける。

https://portal.azure.com/#create/Microsoft.CognitiveServicesComputerVision

[場所]は「(アジア太平洋) 東日本」を選択した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/506da2ed-f46b-e7c1-7d7f-ea370a66bc69.png)

作成が完了したらリソースのページを開き、[リソース管理]-[クイックスタート]より「Key 1」と「エンドポイント」の値を控える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/9419e2af-0487-0377-fbdb-d4ef7dc7f44c.png)

## フローの作成 - Computer Vision APIへの接続の作成

Microsoft Flowのページでフロー作成を行う。

フロー作成画面でアクションに「Optical Character Recognition (OCR) to Text」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/e602df08-52df-928e-0830-cadfcc35735c.png)

接続の構成を求められたので、[Account key]欄に先ほどAzureのComputer Vision APIリソースの画面で控えた「Key 1」のキー文字列を入力して[作成]をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/33ab105e-f9db-b04e-3774-2cb66b00678e.png)

「接続テストに失敗しました」と出た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/0fecc723-dc36-98c8-8bbf-1c18044c06c8.png)

Azureサポートに問い合わせたら以下のような回答があった。
Computer Vision APIリソースのリージョンに「東日本」を選択している場合は、フローからの接続作成時に[Site URL]にComputer Vision APIリソースの「エンドポイント」を指定する必要があるらしい。

> Computer Vision API のリソースを Azure ポータルから作成される際に、リージョンとして東日本を選択いただいているかと存じます。Computer Vision API はリージョン毎に異なるエンドポイントが用意されており、このエンドポイントは以下のスクリーンショットの通り、Azure ポータルの Computer Vision API のリソースの概要でご確認いただけます。API キーとエンドポイントが対応していない場合は認証エラーが発生いたしますので、Flow 側でも Computer Vision API の接続情報を設定する画面において、"Site URL" として上記エンドポイントの URL を設定いただく必要がございます。なお、"接続名" については任意の文字列を入力できる項目となっており、認証情報やエンドポイントの指定に使われることはございませんので、ご注意ください。

というわけで先ほど控えたエンドポイントのURLの方も[Site URL]で指定して、「作成」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/21daa509-41e7-795f-2ad8-9912653a70d2.png)

接続を作成できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/b2e5bfde-db87-5650-8e0d-ae7272b91927.png)

※下記記事で紹介されている手順では、場所に「米国西部」を指定していたためエンドポイントの指定が不要であったようだ。
https://zuvuyalink.net/nrjlog/archives/4270

※そして[Site URL]の入力欄内のプレースホルダテキストをよく見ると以下のように書いてある。既定だと「westus」のエンドポイントが使われるとのこと。同じ記載は[公式ページ](https://docs.microsoft.com/en-us/connectors/cognitiveservicescomputervision/#creating-a-connection)にもある。気づかなかった…。

``Root site url (Example: https://westus.api.cognitive.microsoft.com ).If not specified site url will be defaulted to 'https://westus.api.cognitive.microsoft.com'.``

※また更にAPI利用時のエラーの切り分けには下記ページが役立つとAzureサポートの方に教えてもらった。確かに役立ちそう。
https://blogs.msdn.microsoft.com/jpcognitiveblog/2018/02/01/troubleshooting-http-401-access-denied-invalid-subscription-key/

## フローの作成 - 実際にOCRさせてみる

OneDrive for Businessに請求書の画像をアップロードし、その画像ファイルのコンテンツを「Optical Character Recognition (OCR) to Text」と「Optical Character Recognition (OCR) to JSON」でOCR対象として指定。フロー実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/effcc152-5f5c-8fa3-e804-b8c75c95e06d.png)

OCR結果を取得できた。

Textの方。
OCRされた書面の位置エリアごとに「`\n`」、文字ごとに「` `(空欄)」で区切られている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/a04c4634-1322-dde7-a776-c88646bdb93a.png)

JSONの方。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/f152f3ba-2d54-8dc3-24db-1d852c8197b6.png)

JSONの結果の[本文]のJSON文字列の一部。
OCRされた書面の位置エリアごと、文字ごとにJSONグループや階層が作られている。

```json
{
  "language": "ja",
  "textAngle": 0.08901179185171143,
  "orientation": "Up",
  "regions": [
    {
      "boundingBox": "152,120,170,121",
      "lines": [
        {
          "boundingBox": "152,120,149,19",
          "words": [
            {
              "boundingBox": "152,120,24,18",
              "text": "＜氏名一文字目＞"
            },
            {
              "boundingBox": "177,120,23,18",
              "text": "＜氏名二文字目＞"
            },
            {
              "boundingBox": "219,120,23,18",
              "text": "＜氏名三文字目＞"
            },
            {
              "boundingBox": "244,120,24,18",
              "text": "＜氏名四文字目＞"
            },
            {
              "boundingBox": "277,121,24,18",
              "text": "様"
            }
          ]
        },
        {
          "boundingBox": "234,224,88,17",
          "words": [
            {
              "boundingBox": "234,224,20,17",
              "text": "調"
            },
            {
              "boundingBox": "257,224,19,17",
              "text": "求"
            },
            {
              "boundingBox": "279,224,19,16",
              "text": "金"
            },
            {
              "boundingBox": "301,224,21,17",
              "text": "額"
            }
          ]
        }
      ]
    },
    {
      "boundingBox": "438,169,180,79",
      "lines": [
        {
          "boundingBox": "496,169,122,34",
          "words": [
            {
              "boundingBox": "496,169,38,29",
              "text": "請"
            },
            {
              "boundingBox": "539,171,36,28",
              "text": "求"
            },
            {
              "boundingBox": "581,174,37,29",
              "text": "書"
            }
          ]
        },
        {
          "boundingBox": "438,225,112,23",
          "words": [
            {
              "boundingBox": "438,225,78,20",
              "text": "＜請求金額＞"
            },
            {
              "boundingBox": "525,228,6,19",
              "text": "一"
            },
            {
              "boundingBox": "532,228,18,20",
              "text": "月"
            }
          ]
        }
      ]
    }
  ]
}
```

ちなみにOCRされる画像のファイルサイズが大きいとこのようなエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/6a3dd843-7f6b-0cfa-2f78-aac15cd35002.png)

下記によると対応可能なファイルサイズは最大4MBまでらしい。

https://westus.dev.cognitive.microsoft.com/docs/services/56f91f2d778daf23d8ec6739/operations/56f91f2e778daf14a499e1fa

> Image file size must be less than 4MB.

# おわりに

請求書書面の様式が一様なら、OCR結果のJSON文字列から請求金額の数値をうまいことパースすればいけそう。

以上