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

今回は 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/252441de-beae-d28c-7bdc-06336207d6cb.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/43a24c83-a954-adee-5bd2-d27958785b5e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/378c13fc-709e-069f-e4e5-20c869c5452c.png)

Logic Apps が起動すると、指定したメールアドレスにメールが送付されます。今回は以下のドキュメントを送付しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/396f6e41-30cb-c066-16da-c5486550313a.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