Amazon Textractを試してみた

これまで承認制だったAmazon textractがついに一般公開となりました。
現段階では日本リージョンには来ておらず、また、日本語にも未対応ですが、今後各種言語に対応していくとのこと。

Textractとは、伝票などの画像ファイルを渡すと、そこに書かれているテキストを読み取った結果を返してくれるサービスです。
通常のOCRのように、読み取った文字列をただ返してくれるだけでなく、顧客名、住所、合計金額などの意味までを読み取ってくれるのが特徴です。
この処理には、機械学習の技術を使っているとのこと。
今回はブラウザ上からデータを渡して結果を参照しましたが、REST形式でデータを渡して結果をCSVで受け取ることなどもできます。

どの程度の精度を誇るのか以前から気になっていたので、実際に試してみました。


##実験１
### 帳票データ
まず最初に渡したのが以下のデータ。
これはインターネット上から探してきたサンプルの請求書の画像データです。
保存形式はPNG形式で、解像度もそんなに高くはありません。(690×702)

ダウンロード元：
https://docs.civicrm.org/user/en/latest/img/invoice.png

<img width="500" alt="invoice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/07b895f8-0e8d-2611-917d-7631f1b0139a.png">
※Textractに対応しているデータはpdf, png, jpgです。アップロードするデータはいずれかの形式のデータになっている必要があります。



###実行結果
Textracでの実行結果がこちら。
読み取った帳票の横にRawText, Forms, Tablesの３つが並んでいるのがわかります。
RawTextには読み取った文字列がそのまま表示されます。Formsには、KeyValue形式で項目名と値がセットになって表示されます。
Tablesには、商品名と数量、金額などの表形式のデータが表示されます。これらの読み取った値は、APIを使うとそれぞれCSVで取得することができます。
<img width="955" alt="2019-06-01_14h08_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/caf74a51-a8d3-15ac-7516-bfb585c9a647.png">

次に、それぞれのタブに出力されている内容を見てみます。

#### Formsタブ
Formsタブで参照できたのはこちら。サブトータル金額やトータル金額、Due Date（支払期限）などが読み取れていることがわかります。中でも、Customerの値としてKate Sneedと書かれていますが、こちらは請求書上にはどこにもCustomerとは書かれていません。にもかかわらずこのテキストをCustomerと認識する点に驚きました。

<img width="875" alt="2019-05-31_18h09_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/2f164200-2b08-9068-ece1-c549d52a7ef1.png">



#### tablesタブ
次にTables。一行しかないのでちょっとサンプルが悪かったですが、先頭行に項目名が入っており、正確に読み取れている事がわかります。
今回の場合、テーブル部分の読み取り精度は１００％正確で、このままシステムで処理できてしまうレベルです。すごい。

<img width="500" alt="invoice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/1c5c7a62-a5f8-3ec8-2ded-472054659ae1.png">
<img width="800" alt="invoice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/18132e4e-17ce-c394-0799-102f117e5148.png">


##実験２
もう一つの帳票をアップしてみた結果がこちら。

### 帳票データ
アップロードした帳票データはこちら
（これもインターネット上に落ちてたやつをそのまま利用しました）
<img width="345" alt="invoice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/8411a93e-8f01-6bfb-a55e-ce7f8c72ae05.png">

###実行結果
####Formsタブ
Formsタブの結果は、以下の通りとなりました。
Invoce番号やサブトータル、トータル金額は読み取れていますが、Bill To（請求先）が読み取れていないのが惜しいところです。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/03a1d250-559c-b1c2-c650-f07db9c87395.png)


#### tablesタブ
Tablesタブの結果がこちら。
表示されている３件の数量、説明（品名）、金額が完璧に読み取れています。
これはこのままシステムで処理できるレベルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/b0921a2a-7cf1-f8ba-203a-74370de5dffa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/38ffd3a6-2a22-dc51-bda1-0dd0cd9be44e.png)

#### Tablesタブ２ページ目

こちらの帳票の場合は、先程は１つしかなかったテーブルが２つありました。
切り替えてみると、帳票の上部にある項目をテーブルと認識して読み取ってくれているみたいです。
線などが引いてなくても項目がテーブル形式っぽく並んでいれば認識してくれるんですね。

結果を見ると…先程読み取れていなかったBillToShipToの項目もちゃんと読み取ってくれています。
実際の業務で利用する場合、FormsがだめならTableｓを使えば良い。ということもありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/b76020b1-37cd-d3ba-cb9a-a17cea05de8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/a8720392-6738-a90e-b3dd-9476ec0f806c.png)


## まとめ

まだ精度は１００％ではなく改善の余地はありますが、英語圏限定なら、すぐに業務で使えるくらい精度が高いサービスであると感じました。
当たり前かもしれませんが、レイアウトによってTextractの認識精度も変わってくるみたいです。今後は帳票デザインするときも、機械に認識されやすい帳票を意識してデザインすることが必要となってくるかもしれません。


今後日本語に対応したら、このサービスは色んな所で利用できそうです。
商社の様に日々大量の伝票をさばいている会社などに導入したら、とても大きな効果を生むのではないでしょうか。


＃このあと、試しに日本語の請求書を読み込ませてみましたが、うまく読み込めませんでした。まだ非対応と言っているのだから当たり前ですね。

いつになるかはわかりませんが、今後、日本語対応版のtextractが公開されるのが楽しみです。


# 参考ページ
- Amazon Textract  
https://aws.amazon.com/textract/
- Textract FAQS  
https://aws.amazon.com/textract/faqs/