LoginSignup
5
2

More than 3 years have passed since last update.

Azure Form Recognizer を使って領収書の値を AI に認識させる

Posted at

今回は Azure Form Recognizer (プレビュー) と Logic Apps を用いて、AI で領収書を分析するシステムを作成します。記事執筆時点では Azure Form Recognizer はプレビュー版となっており、開発チームへ申請することでリソースを作成することができます。

Form Recognizer の全体像

Form Recognizer のコンセプトは以下 MSDN の Channel 9 に動画がアップロードされています。
Learn about AI-powered robotic process automation with Form Recognizer
https://channel9.msdn.com/Shows/AI-Show/Learn-about-AI-powered-robotic-process-automation-with-Form-Recognizer
データが重要な時代にも関わらず、建設業等では紙で大事なデータを扱っています。Form Recognizer では PDF 等の紙データを AI が分析し、瞬時にデータをデジタル化することができます。(的なコンセプトです)

Form Recognizer は「フォームを解釈し、ドキュメントを抽出できる AI サービス」です。
Form Recognizer プレビュー
https://azure.microsoft.com/ja-jp/services/cognitive-services/form-recognizer/

マイクロソフトドキュメントによると、Form Recognizer は 3 つのサービスから構成されます。

  • カスタムモデル
    フォームからキーと値のペアおよびテーブル データを抽出します。 これらのモデルは自分が用意した独自のデータでトレーニングされるため、実際のフォームに合わせて調整されます。

  • あらかじめ構成されたレシートモデル
    事前構築済みモデルを使用して米国のレシートからデータを抽出します。
    【補足】
    英語で書かれた米国のレシートを読み取るためのモデルも付属しています。—レストランやガソリン スタンド、小売店などで使用されるタイプのレシートが対象となります。 このモデルでは、取引日時、販売店情報、税金と合計金額などの主要な情報が抽出されます。 さらに、あらかじめ構築されたレシート モデルは、レシート内のすべてのテキストを認識して返すようにトレーニングされています。

  • Layout API
    テキストおよびテーブルの構造を、対応する境界ボックスの座標と共にドキュメントから抽出します。
    【補足】
    Form Recognizer は、高精細の光学式文字認識 (OCR) を使用して、テキストやテーブル構造 (テキストが関連付けられた行番号と列番号) を抽出することもできます。

このうちのカスタムモデルでは、ラベルを使用しないトレーニング、ラベルを使用したトレーニングがあります。

  • ラベルを使用しないトレーニング
    Form Recognizer は、既定では教師なし学習を使用して、フォーム内のレイアウトを解釈し、フィールドとエントリ間の関係を解釈します。 入力フォームを送信すると、アルゴリズムによって種類別にフォームが分類されて、存在するキーとテーブルが検出されます。また、値がキーに、エントリがテーブルに関連付けられます。 手動によるデータのラベル付けは不要であり、大量のコーディングやメンテナンスも必要ありません。最初は、この方法を試すようお勧めします。

  • ラベルを使用したトレーニング
    ラベル付けされたデータによるモデルのトレーニングでは、ラベル付けされた指定のフォームを使用して教師あり学習を行うことで、目的とする値が抽出されます。 こちらの方が、複雑なフォームや、キーのない値を含んだフォームでも機能する性能のよいモデルが得られます。
    Form Recognizer は、印刷されたテキストや手書きのテキストの要素について、Layout API を使用して予想されるサイズや位置を学習します。 その後、ユーザーによって指定されたラベルを使用して、ドキュメントに含まれるキーと値の関係を学習します。 新しいモデルをトレーニングする際はまず、手動でラベル付けされた同じタイプのフォーム 5 つを使用し、そのうえで、モデルの精度を改善するために必要であれば、ラベル付けされたデータを追加することをお勧めします。

今回のデモでは、ラベルを使用しないトレーニングをカスタムモデルを使用します。

Form Recognizer の利用申請をする

Preview Version のため、Azure アカウントを使って Form Recognizer の利用を申請する必要があります。
https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbRyj5DlT4gqZKgEsfbkRQK5xUMjZVRU02S1k4RUdLWjdKUkNRQVRRTDg1NC4u
申請後1,2日で開発チームから承諾メールが届きます。承諾メールの中に、Azure Portal から Form Recognizer をデプロイするためのリンクや、カスタムモデルを構築するためのクイックスタートへのリンクが記載されています。
image.png

必要なリソースを作成する

Form Recognizer の他に必要なリソースは以下の二つです。
Azure Account Storage
Azure Logic Apps

この二つのリソースを下記のチュートリアルに従いながらデプロイします。
Tutorial: Use Form Recognizer with Azure Logic Apps to analyze invoices
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/tutorial-form-recognizer-with-logic-apps

Logic Apps を準備し、メールを送付する

Logic Apps ではメールを受信したことをトリガーとして、Logic Apps が起動します。
image.png

image.png

Logic Apps が起動すると、指定したメールアドレスにメールが送付されます。今回は以下のドキュメントを送付しました。
image.png

送付し、Form Recognizer で分析した結果、以下の JSON がメールで送付されてきます。

sample.json
[
    {
        "id": "table_0",
        "columns": [
            {
                "header": [
                    {
                        "text": "Invoice Number",
                        "boundingBox": [
                            38.5,
                            585.2,
                            113.4,
                            585.2,
                            113.4,
                            575.8,
                            38.5,
                            575.8
                        ]
                    }
                ],
                "entries": [
                    [
                        {
                            "text": "AC-32322",
                            "boundingBox": [
                                38.5,
                                549.5,
                                83.4,
                                549.5,
                                83.4,
                                535.9,
                                38.5,
                                535.9
                            ],
                            "confidence": 1
                        }
                    ]
                ]
            },
            {
                "header": [
                    {
                        "text": "Invoice Date",
                        "boundingBox": [
                            139.7,
                            585.2,
                            198.5,
                            585.2,
                            198.5,
                            575.8,
                            139.7,
                            575.8
                        ]
                    }
                ],
                "entries": [
                    [
                        {
                            "text": "03 March 2018",
                            "boundingBox": [
                                139.7,
                                549.5,
                                206.1,
                                549.5,
                                206.1,
                                535.9,
                                139.7,
                                535.9
                            ],
                            "confidence": 1
                        }
                    ]
                ]
            },
            {
                "header": [
                    {
                        "text": "Invoice Due Date",
                        "boundingBox": [
                            240.5,
                            585.2,
                            321,
                            585.2,
                            321,
                            575.8,
                            240.5,
                            575.8
                        ]
                    }
                ],
                "entries": [
                    [
                        {
                            "text": "06 Nov 2019",
                            "boundingBox": [
                                240.5,
                                549.5,
                                297,
                                549.5,
                                297,
                                535.9,
                                240.5,
                                535.9
                            ],
                            "confidence": 1
                        }
                    ]
                ]
            },
            {
                "header": [
                    {
                        "text": "Charges",
                        "boundingBox": [
                            341.3,
                            585.2,
                            381.2,
                            585.2,
                            381.2,
                            575.8,
                            341.3,
                            575.8
                        ]
                    }
                ],
                "entries": [
                    [
                        {
                            "text": "$110,153.22",
                            "boundingBox": [
                                380.6,
                                548.7,
                                436,
                                548.7,
                                436,
                                535.9,
                                380.6,
                                535.9
                            ],
                            "confidence": 1
                        }
                    ]
                ]
            },
            {
                "header": [
                    {
                        "text": "VAT ID",
                        "boundingBox": [
                            442.1,
                            590,
                            474.8,
                            590,
                            474.8,
                            575.8,
                            442.1,
                            575.8
                        ]
                    }
                ],
                "entries": [
                    [
                        {
                            "text": "RT",
                            "boundingBox": [
                                447.7,
                                549.5,
                                461,
                                549.5,
                                461,
                                535.9,
                                447.7,
                                535.9
                            ],
                            "confidence": 1
                        }
                    ]
                ]
            }
        ]
    }
]

上のサンプルレシートと照らし合わせると、Invoice Number、Invoice Date、Invoice Due Date、Charges、VAT ID がちゃんと認識されていることが分かります。

これまで人の目で見て人の手で入力していた作業が AI で補うことができるので非常に便利ですね!

参考 URL

Train without labels
QuickStart: Train a Form Recognizer model and extract form data by using the REST API with cURL
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/curl-train-extract
QuickStart: Train a Form Recognizer model and extract form data by using the REST API with Python
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/python-train-extract
Train with labels
QuickStart: Train a Form Recognizer model with labels using the sample labeling tool
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/label-tool
QuickStart: Train a Form Recognizer model with labels using REST API and Python
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/python-labeled-data
Prebuilt receipts - extract data from USA sales receipts
Quickstart: Extract receipt data using cURL
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/curl-receipts
Quickstart: Extract receipt data using Python
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/python-receipts
Layout - extract text and table structure (row and column numbers) from your documents
Quickstart: Extract layout data using Python
https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quickstarts/python-layout

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2