Amazon Textract による「画像からの表データ読込」をブラウザから試す

## はじめに

AWS は様々な AI サービスを提供しています

そして、それらのサービスはブラウザから簡単に試せるようになっています

https://aws.amazon.com/jp/free/machine-learning/

| サービス    | 機能                     | お試し記事     | Elixir 実装例 |
|:------------|:-------------------------|:----------------| :-----|
| Transcribe  |音声の文字起こし（音声認識）| [参照](https://qiita.com/RyoWakabayashi/private/396e2047d377e258950f)  | [参照](https://qiita.com/RyoWakabayashi/items/1fc64587c9fa352935c6) |
| Polly       |文書の読み上げ（音声合成）  | [参照](https://qiita.com/RyoWakabayashi/private/2aad1952f63b4e76b652) | [参照](https://qiita.com/RyoWakabayashi/items/93adae047ccb4fee8d78) |
| Lex         |チャットボット             | [参照](https://qiita.com/RyoWakabayashi/private/6c7e7a248e192f3a8afc) | Coming Soon... |
| Translate   |翻訳                      | [参照](https://qiita.com/RyoWakabayashi/private/688418e52cde44871c1e) | [参照](https://qiita.com/RyoWakabayashi/items/5f262ba0d1e11219edec) |
| Rekognition |画像認識<br/>顔認識        | [参照](https://qiita.com/RyoWakabayashi/private/d8c7f57a71e83d9140d5)<br/>[参照](https://qiita.com/RyoWakabayashi/private/10f93c3417041b005c31)  | [参照](https://qiita.com/RyoWakabayashi/items/2219e84642ff2d05481c) |
| Textract    |画像からの表データ読込     | [参照](https://qiita.com/RyoWakabayashi/private/b7bd7079d20326d9e4be) | [参照](https://qiita.com/RyoWakabayashi/items/7c26d0dda7d566adc694) |
| Bedrock     |生成AIによるチャット、画像生成| [参照](https://qiita.com/RyoWakabayashi/private/5680a4bac246a1a0c532) | [参照](https://qiita.com/RyoWakabayashi/private/bb85dd2286420205e2da) |

本記事では AWS の文字認識サービス Textract をブラウザから試してみます

## Amazon Textract とは

Amazon Textract　は AI モデルによって画像からテキストを読み取る、いわゆる OCR（Optical Character Recognition) のようなサービスです

しかし、単なる文字認識にとどまらず、文書の構造を理解し、表データなどをそのまま使いやすい形式で返してくれます

https://aws.amazon.com/jp/textract/

### Amazon Textract の使い途（ユースケース）

Amazon Textract は 2023年11月現在、 6 つの言語・国に対応していますが、日本語には対応していません

- 英語
- スペイン語
- イタリア語
- ポルトガル語
- フランス語
- ドイツ語

https://aws.amazon.com/jp/textract/faqs/

従って、日本で使う場合は数字などに対してのみ使用しましょう

入力形式は以下のものをサポートしています

- PNG
- JPEG
- TIFF
- PDF

Amazon Textract は以下のような用途に使用可能です

- 印刷された英語文書の電子化
- 印刷された数値データの電子化
- Fax やアンケートなど、手書き文字の自動読取、後続処理への自動取込

### Amazon Textract の料金

https://aws.amazon.com/jp/textract/pricing/

AWS の料金は基本的に従量課金制です

また、料金はリージョン（サービスを提供しているサーバーが設置されている地域）によって変動します

Textract は日本語をサポートしていないこともあり、東京リージョンでは使用できません

バージニア北部リージョンを使った場合、以下のような料金になります

| 機能                   | 料金              |
| :-------------------- | ----------------: |
| 通常の文字認識          | $1.5 / 1,000 ページ |
| 署名                  | $3.5 / 1,000 ページ |
| レイアウト               | $4 / 1,000 ページ |
| クエリ                  | $15 / 1,000 ページ |
| テーブル                | $15 / 1,000 ページ |
| フォーム                 | $50 / 1,000 ページ |
| クエリ + テーブル         | $20 / 1,000 ページ |
| クエリ + フォーム          | $55 / 1,000 ページ |
| テーブル + フォーム        | $65 / 1,000 ページ |
| テーブル + フォーム + クエリ | $70 / 1,000 ページ |

ただし、 AWS のサービスの多くには無料利用枠が存在します

> Amazon Textract は AWS 無料利用枠に含まれており、無料で使用開始できます。無料利用枠は 3 か月間有効で、新規に AWS をご利用になるお客様は、最大で次の分析が可能です。
>
> Detect Document Text API: 1,000 ページ/月
> Analyze Document API:
> 1,000 ページ/月 (署名のみを使用する場合)
> フォーム、テーブル、およびレイアウトの機能を使用する場合、100 ページ/月
> クエリ、フォーム + クエリ、テーブル + クエリ、フォーム + テーブル + クエリ、それぞれ 100 ページ/月

無料利用期間中の場合、 本記事で実行する程度の処理であれば無料範囲内に収まります

## アカウント作成

Amazon Textract を使うためには、 AWS のアカウント作成が必要です

以下の公式手順に従って、アカウントを作成してください

:::note warn
クレジットカードと電話番号が必要になります

予めご用意ください
:::

https://aws.amazon.com/jp/register-flow/

## ブラウザからの文書分析

### Amazon Textract への移動

AWS のマネジメントコンソールにログインすると、以下のような画面が表示されます

https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#

![スクリーンショット 2023-11-26 9.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ccb18a17-4e2e-e5e6-098f-e779c8f69eef.png)

この画面から最近使ったサービスなどにアクセスできるようになっています

上メニューにある検索ボックスに `tex` と入力してみましょう

![スクリーンショット 2023-12-02 10.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f6fbec97-fad4-adf0-8f3a-2a8b75482153.png)

サービスの候補として Amazon Textract が表示されます

Amazon Textract をクリックしましょう

もし東京リージョンなど、サポートされていないリージョンで AWS のページを開いていた場合、以下のような画面が表示されます

![スクリーンショット 2023-12-02 10.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/854546bd-94d9-fcfc-8a21-e795c573394e.png)

米国東部（バージニア北部）をクリックし、リージョンを移動しましょう

:::note warn
他のサービスを使うとき、東京リージョンに戻るのを忘れないようにしましょう

リージョンは上部メニューの右側、リージョン名をクリックすると変更可能です

![スクリーンショット 2023-12-02 10.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2b1cfe6a-5196-1b69-93ed-246b86bf7bc1.png)
:::

リージョンを選択すると、以下のような画面が表示されます

https://us-east-1.console.aws.amazon.com/textract/home?region=us-east-1#/

![スクリーンショット 2023-12-02 10.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d9be3ea9-6992-b73b-733d-65f712e468f9.png)

### 生のテキスト

左メニューの「文書を分析する」をクリックすると、以下のような画面が表示されます

![スクリーンショット 2023-12-02 10.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/76e46a7d-bdbb-f4db-b77c-68f41c1ec897.png)

このデモでは、左側の給与明細の画像を分析し、右側に認識できたテキストを表示しています

左側画像内の各テキストを囲っている四角形は Textract がテキストを認識できた位置情報です

右側の各テキストをクリックすると、左側の該当箇所の色が変化します

![スクリーンショット 2023-12-02 10.20.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f26d0dbf-0450-21c0-2412-927976d03397.png)

実のところ、これだけのことであれば Rekognition で十分です

https://qiita.com/RyoWakabayashi/items/d8c7f57a71e83d9140d5

例えば画像のこの箇所

![スクリーンショット 2023-12-02 10.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f325b1b8-09ae-68d7-6ab2-409da7571fac.png)

Textract は以下のように認識しています

- CO. FILE DEPT. CLOCK NUMBER
- ABC 126543 123456 12345 00000000

しかし、実際にこのデータを使う場合、本来は以下のような紐付きが欲しいはずです

- CO.: ABC
- FILE: 126543
- DEPT.: 123456
- CLOCK: 12345
- NUMBER: 00000000

画像上のテキストに対して、単なる文字認識ではなく、このような意味的な紐付き、構造を理解できるのが Textract の強みです

### レイアウト

右側、結果の上にある「レイアウト」タブをクリックしてみましょう

![スクリーンショット 2023-12-02 10.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/92c8ec51-d716-448b-f18b-fe4faa7b5444.png)

各テキストが文書内で「構造上どういう意味合いになっているか」が分析されています

先ほどの画像先頭の箇所は「ヘッダー」として認識されています

少し結果を下っていくと、テーブルなども正しく認識されています

![スクリーンショット 2023-12-02 10.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/9d9cc2e2-d767-a1be-7eff-5d55fdcc6ae8.png)

単に「ヘッダーに何が書いてあるか」や「どのあたりに表があるか」だけであれば、この「レイアウト」で比較的安く分析可能です

結果は右上「結果をダウンロードする」から CSV 形式で取得可能です

ダウンロードした ZIP を展開して、 `layout.csv` を開きます

```csvs
'ページ番号,'レイアウト,'テキスト,'Reading Order,'Confidence score % (Layout)
'1,'図 1,"",'0,'26.39160156
'1,'ヘッダー 1,"'CO. FILE DEPT. CLOCK NUMBER ABC 126543 123456 12345 00000000 1",'1,'25.68359375
'1,'テキスト 1,"'ANY COMPANY CORP. 475 ANY AVENUE ANYTOWN USA 10101",'2,'65.38085938
'1,'セクションヘッダー 1,"'Earnings Statement",'3,'44.45800781
...
```

Textract 自体は日本語に対応していませんが、ユーザーが日本語を使っている場合、デモの CSV もちゃんと日本語にしてくれているのは親切ですね

各値の先頭 `'` は、おそらく Excel が勝手に形式を変えるのを回避するためでしょう

macOS の場合、 Numbers で開くと以下のような表示になります（Windows なら Excel で開きましょう）

![スクリーンショット 2023-12-02 10.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3389d808-f8c2-b100-de1b-92ab897e667a.png)

右端列の「Confidence score % (Layout)」は結果の確信度（AI がどれくらい答えに自信があるか）を表します

### フォーム

「フォーム」タブをクリックしてみましょう

![スクリーンショット 2023-12-02 10.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e64dbf97-d709-94ed-6c7b-be42aef17eea.png)

「フォーム」の場合、項目と値が紐づいて認識されています

ただし、あくまでも項目と値が 1 対 1 の場合についてのみ分析できており、テーブルの場合は認識できていません

ダウンロードした結果から `keyValues.csv` を開いてみましょう

![スクリーンショット 2023-12-02 10.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0b7824aa-8247-2707-3945-59f17c41d703.png)

こちらは残念ながら日本語になっていませんが、 `Key` が項目で `Value` が値です

それぞれに `Confidence Score` がありますが、このデモ上ではどちらも同じ値になっていますね

### テーブル

「テーブル」タブをクリックすると、テーブル毎の分析結果が表示されます

![スクリーンショット 2023-12-02 10.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c798a1f8-d19b-08bd-9194-d322dcea8295.png)

先頭のテーブルについて、正しくセル毎に分割できている事がわかります

「現在閲覧中のテーブル」から「4」をクリックします

![スクリーンショット 2023-12-02 11.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/dcdeecc6-507f-38f5-0e0b-6cdb3f586714.png)

テーブルのタイトル、ヘッダーが認識できており、行毎に高さが違っても正しく認識できています

ダウンロードしたファイルでは、テーブルの結果は table-1.csv から table-7.csv に分かれています

![スクリーンショット 2023-12-02 11.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3b253367-8f95-8bce-4ba3-b0e2c6c22033.png)

### クエリ

「クエリ」タブでは、画像に対して直接質問を投げる事ができます

「クエリを入力してドキュメント内を検索」というところに「what is the regular hourly rate?」と入力してから「クエリを送信」ボタンをクリックします

すると、以下のように結果が正しく取得できます

![スクリーンショット 2023-12-02 11.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7776c246-8bb0-9d1c-ba11-e18701c20688.png)

### JSON 形式

ダウンロードしたファイルの中に `analyzeDocResponse.json` というファイルがあるので開いてみましょう

```json
{
  "DocumentMetadata": {
    "Pages": 1
  },
  "Blocks": [
    {
      "BlockType": "PAGE",
      "Geometry": {
        "BoundingBox": {
          "Width": 1,
          "Height": 0.9965640306472778,
          "Left": 0,
          "Top": 0.003435956547036767
        },
        "Polygon": [
          {
            "X": 0,
            "Y": 0.003435956547036767
          },
          {
            "X": 1,
            "Y": 0.0039773182943463326
          },
          {
            "X": 1,
            "Y": 1
          },
          {
            "X": 0,
            "Y": 1
          }
        ]
      },
      ...
```

実際にプログラムから Textract を使う場合、このような形式で分析結果が取得されます

Elixir というプログラミング言語での実装例はこちら

https://qiita.com/RyoWakabayashi/items/7c26d0dda7d566adc694

## まとめ

Amazon Textract によって、単なる OCR ではなく、意味や構造も含めた分析結果を得る事ができました

ただし、日本語には対応していないため、あくまでも英語文書や英数字だけの文書を対象として使用しましょう

また、機能によって料金が異なるため、やりたいことに合わせて選択しましょう