Azure Form Recognizer v3.0で申請書（日本語手書き有り）の項目読み取りモデルを作ってみた

## はじめに
### 概要
Azure Form Recognizer v3.0で、申請書の項目読み取りモデルを作ってみました。
Form Recognizerは2022年2月にv3.0のパブリックプレビュー版がリリースされ、操作性や機能が大幅に向上しました。
v3.0のアップデートの詳細は[こちら](https://docs.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/whats-new?tabs=csharp#february-2022)からご確認ください。

文書データのOCRや項目読取りなど、ドキュメント活用にお困りの方にはとてもおススメの機能と感じました。
今回は、Form Recognizerのカスタムモデル機能を使って、項目読み取りモデルを作成する手順と、実際にモデルを使って項目読取りを実施した事例をご紹介します。

### この記事の想定読者
定型文書のAI活用をご検討中の方
Azure Form Recognizerに興味のある方

## Azure Form Recognizerの紹介
### Azure Form Recognizerとは
Azure Form Recognizerは、ドキュメントデータからテキストデータ、テーブル情報、キーと値のペアなどを抽出することが出来る[Azure Applied AI Services](https://docs.microsoft.com/ja-jp/azure/applied-ai-services/)の一つです。
詳しく知りたい方は[こちら](https://docs.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/overview?tabs=v3-0)を参照ください。

Azure Form Recognizerは3つの機能があります。(2022/05/06時点)
本記事では、No.3のカスタムモデル機能を使用して、項目読み取りモデルの構築を実施しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/1cd3aa4c-008f-317a-3170-652dc07540bb.png)

### Azure Form Recognizerの推しポイント
2022年2月にv3.0のプレビュー版がリリースされ、これまでのv2.1に比べてGUI等が大きく変わっています。
v3.0のアップデートの詳細は[こちら](https://docs.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/whats-new?tabs=csharp#february-2022)からご確認ください。

ここからは、私が個人的に良いなと感じているAzure Form Recognizerのポイントを紹介します。

#### GUIが洗練されている
これはv3.0で大きく変わったポイントです。
[Form Recognizer Studio](https://formrecognizer.appliedai.azure.com/studio)が出来て、操作性が大幅に向上しています。
また、Read API(AI-OCR)もForm Recognizer Studioから使えるようになっていて、OCR結果を可視化してくれるのも地味に嬉しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/d47c7109-3a89-dc51-700c-0f0e88e97e50.png)

#### 日本語手書きに対応している
これもv3.0で追加されました。
例えば自治体の申請書や会社の納品書や請求書など、まだまだ手書きの文化が残っているところは多くあります。
日本の企業や自治体でドキュメントの活用をする場合に、手書き文字を高精度に読み取れることはとても重要です。
v3.0のアップデートで、日本語の手書き文字を非常に高精度に読み取ることが出来るようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/15cda845-7784-07b9-2edf-d05374fea750.png)

AzureのAI-OCRに関しては以下の記事で詳しく紹介されていますので、興味のある人はこちらもご覧ください。
[【手書き文字認識】Azure-AI-OCRの進化がすごい！](https://qiita.com/org-yuta-tanabe/items/bdb11e0fccc4efc488a0)

#### チェックボックスが取れる
こちらはv2.1からあった機能ですが、非常に有用な機能だと考えています。
なぜならば、自治体の申請書などの日本の定型文書にはチェックボックスが含まれていることが多いからです。
Azure Form Recognizerでは、チェックボックスが選択されているかどうかを認識することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/8c66e9e1-96d8-c78d-d3e1-4886ecae1dbd.png)

#### 価格が安い
ドキュメント読み取り業務の運用を考えると、非常に多くのデータを読み取ることになります。
その為、ランニングコストは非常に重要なファクターの一つです。
Azure Form Recognizerは主要なクラウドサービスの同様のサービスと比べても価格が安く、1ページ辺り$0.05(≒6.5円)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/d93a16a3-ea26-c619-0094-03ed03791c8e.png)
ポイントは、**ページ内に読み取りたい項目がいくつあっても定額**という点です。
AI-Insideなどの既存のAI-OCRソリューションの場合、読み取りたい項目毎に課金されるスタイル（1項目1円等）が多く、読み取りたい項目が多いと非常に高コストになります。


## カスタムモデルの使い方
Azure Form Recognizerのカスタムモデルを実際に使ってみたい人向けの内容です。
項目読み取りモデルの検証結果事例を確認されたい方は、[検証結果](#検証結果)へ進んでください。

### 作業①：各種リソースの作成/設定
まず、Azure Form Recognizerのカスタムモデルを実行するために必要な各種リソースの作成と、設定を実施行います。
##### 1. リソースグループの作成
任意のリソースグループを作ります。
必要な情報を入力の上、［確認および作成］ボタンを選択してリソースグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/41d9e9f2-5cba-8448-6e37-f2ff60208ec4.png)

##### 2. Form Recognizerの作成
Azure Portalの全てのサービスからForm Recognizerを検索し、Form Recognizerリソースを作成します。
1.で作成したリソースグループを紐づけ、その他必要な情報を入力して［確認と作成］ボタンを選択してリソースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/8db8a038-c9c6-3666-553f-69329f086181.png)

##### 3. ストレージアカウントの作成
Azure Portalの全てのサービスからストレージアカウントを検索し、ストレージアカウントを作成します。
ストレージアカウントは、モデル構築に必要なデータセットを格納するために使用します。
1.で作成したリソースグループを紐づけ、その他必要な情報を入力して［確認と作成］ボタンを選択してリソースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/203068c3-1560-84a5-2789-156c38c17038.png)

##### 4. 新しいコンテナの作成、データセットの格納
[1] 3.で作成したストレージアカウントにアクセスし、以下の手順でコンテナを作成します。
パブリックアクセスレベルを、`コンテナー（コンテナーとBLOBの匿名読み取りアクセス）`に変更するのを忘れないように注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/c5f6569f-106f-6863-e5a4-3e780d7a4330.png)

[2] [1]で作成したコンテナーを選択し［アップロード］を選択します。
BLOBのアップロードより、カスタムモデルで使用するデータセットをアップロードします。
今回は、[こちら](https://github.com/c-makitahiroki/dataset_for_Qiita/tree/main/form_recognizer_demo/custom_model)の自作データセットを使用しました。※住所や氏名、電話番号などは全て架空の情報です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/1232617b-8a82-97ab-5290-08b3b9abd972.png)


##### 5. ストレージアカウントの設定変更
3.で作成したストレージアカウントにアクセスし、［リソースの共有（CORS）］を選択します。
BloB serviceに以下の設定を実施し、［保存］を選択します。
|項目名|設定値|
|---|---|
|許可されたオリジン|https://formrecognizer.appliedai.azure.com|
|許可されたメソッド|DELETE, GET, HEAD, MERGE, POST OPTIONS, PUT, PATCHの全てをチェック|
|許可されたヘッダー|*|
|公開されるヘッダー|*|
|最長有効期間|120|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/1c25fb8f-93d8-68e6-d927-6f78202553bb.png)


これでAzureの各種リソースの作成と、必要な設定変更は完了です。

### 作業②：プロジェクトの作成
次に、カスタムモデルを使用する為に必要なプロジェクトを作成していきます。
[1] [Form Recognizer Studio](https://formrecognizer.appliedai.azure.com/studio)にアクセスします。
[2] Form Recognizer Studioの下部にある［Custom model］を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/69a9bc61-5ec0-8be5-618d-58dc71f75e3d.png)

[3] Custom modelの下部にある［Create a project］を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/208739cb-fadf-f323-35a4-ccfb1e07057a.png)

[4] ナビゲーションに従って、必要な情報を入力します。

|画面名|入力が必要な項目|設定値|
|---|---|---|
|Enter project details|Project name|任意の文字列|
|Configure service resource|Subscription|今回作成したリソースグループが紐づくサブスクリプション|
|Configure service resource|Resource group|[「1.リソースグループの作成」](#1-リソースグループの作成)で作成したリソースグループ|
|Configure service resource|Form Recognizer or Cognitive Service Resource|[「2.Form Recognizerの作成」](#2-form-recognizerの作成)で作成したForm Recognizerリソース|
|Configure service resource|API version|2022-01-30-preview (※2022/05/07現在)|
|Connect training data source|Subscription|今回作成したリソースグループが紐づくサブスクリプション|
|Connect training data source|Resource group|[「1.リソースグループの作成」](#1-リソースグループの作成)で作成したリソースグループ|
|Connect training data source|Storage account|[「3.ストレージアカウントの作成」](#3-ストレージアカウントの作成)で作成したストレージアカウント|
|Connect training data source|Blob countainer|[「4.新しいコンテナの作成、データセットの格納」](#4-新しいコンテナの作成、データセットの格納)で作成したコンテナー|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/570dcd66-3126-86b4-9b61-76da1aed2697.png)


以下の画面が出ればプロジェクト作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/5c1e3ff2-ba42-0cb9-4be7-46bcef155922.png)


### 作業③：アノテーションの実施
項目読み取りモデルを作成するために、取り込んだ申請書に対してアノテーション作業を実施します。
Azure Form Recognizerでは、**５枚のデータに対してアノテーション**するだけでモデルの構築が可能です。
アノテーションデータが多いほど精度は良くなるので、項目の読み取り精度を検証しながら適宜アノテーションデータを増やすと良いと思います。

Form Recognizerでは、アノテーションの方法が大きく2種類ありますので、簡単に説明します。
##### アノテーション方法①：OCR結果／チェックボックス検出結果を使ってアノテーションする
1つ目は、OCRやチェックボックスを検出した結果が画面上に表示される為、その情報を指定してアノテーションを実施する方法です。
以下の動画の様に、OCR結果を指定して、指定した情報に対してラベルを付与します。
![OCR結果を指定してアノテーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/d12736c5-85b2-246d-0fbd-d8dfc010e225.gif)

##### アノテーション方法②：領域（Region）を指定してアノテーションする
2つ目は、領域を指定してアノテーションを実施する方法です。
RegionオプションをONにすると領域を指定できるようになります。
指定した領域に対してラベルを付与します。
![領域を指定してアノテーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/8f413983-870a-3115-5149-8a06723e5b0a.gif)

上記のいずれかの方法でアノテーションを実施し、モデル学習用のデータを作成します。
今回は５枚の申請書データに対して、以下の様に20か所ほどアノテーションを実施してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/93c8a114-db3d-ed98-50ad-4e4afdf6b081.png)

### 作業④：項目読み取りモデルの学習
データの準備が整ったら項目読み取りモデルの学習を実施します。
まず、画面右上の［Train］ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/c04b30d5-ff22-a9f7-c915-d1d1e695d1b3.png)

次に、Train a new model画面で、必要情報を入力して［Train］ボタンを選択すると学習が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/4e24e3ce-d003-6583-8888-2f429e4b3ad6.png)

Build ModeはNeuralとTemplateがありますが、Templateを選択してください。
Nueralオプションは、**英語しかサポートしていない**、**領域指定のアノテーションをサポートしていない**為です。（2022/05/06時点）
詳細は[こちら](https://docs.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/concept-custom#compare-model-features)をご確認ください。

学習が完了すると、Modelタブに学習済みモデルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/1dd96f10-cd79-a6ee-978c-09b9a352c814.png)

### 作業⑤：項目読み取りモデルを使って申請書の項目を読み取る
モデルの学習が完了したら、学習済みモデルを使って申請書の項目読み取りを実施します。
手順は以下の通りです。非常に簡単なステップで項目読み取りを実施できます。
[1]Testタブに切り替えます
[2]［Add］ボタンより読み取りたいデータを追加します
[3]［Analyze］ボタンで読み取りを実行します
[4]右側に読取結果が表示されるので、結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/91887458-6875-88ac-a3e3-0b429327bc7d.png)

## 検証結果
### 検証データ
今回の検証では、[こちらのデータ（自作）](https://github.com/c-makitahiroki/dataset_for_Qiita/tree/main/form_recognizer_demo/custom_model)を使用しました。
地方自治体（具体的には熊本県天草市）のHPに掲載されている住民票、印鑑申請書に対して、架空の住所や氏名の情報を入力した自作データです。
印刷文字、手書き文字、チェックボックス、手書きの丸囲みなどが含まれているデータです。

今回は、こちらのデータセットの５枚を学習データとし、残りの５枚で機能の検証を実施しました。
※各項目の読取精度の検証までは出来ておりません。

### 検証結果サマリ
項目読み取りモデルの検証結果サマリです。
実例をいくつか挙げながら紹介をしていきます。

|No.|概要|
|---|---|
|1|日本語手書きは高精度に項目読み取りできている|
|2|読み取りが失敗しているところはconfidenceが低く出る傾向にある|
|3|チェックボックスの状態は完璧に読み取れている|
|4|チェックボックスを入力ミスしても選択済み状態になる|
|5|丸囲みは検出できない|


#### 1. 日本語手書きは高精度に項目読み取りできている
さすがAzureのAI-OCRといった感じで、日本語の手書きは非常に高精度に読み取りができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/4859f8e4-d7e0-1258-0112-58002e6be4ac.png)

#### 2. 読み取りが失敗しているところはconfidenceが低く出る傾向にある
あくまで今回のデータセットでの結果なので一概には言えませんが、住所で番地の読み取りに失敗しているところなどで、confidenceの情報が低く出ている事例がいくつかありました。
以下の事例では、1番目のみ読取成功で、残りの3つは番地が読み取れていなかったり、日本語の読み取りが間違っていたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/da299e55-b65c-ea8a-d694-30d0d2cbbc07.png)
confidenceが低く出る部分は人間がダブルチェックするなどの対策に使えそうです。
また、これに関しては学習データを増やしてバリエーションを拡張することで精度が上がる様な気がします。

#### 3. チェックボックスの状態は完璧に読み取れている
チェックボックスは、選択されていれば`selected`、未選択であれば`unselected`が返ってきますが、今回のデータセットに関しては完璧に読み取れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/a75a91a7-308c-f661-bc16-b12134e5f9b2.png)


#### 4. チェックボックスを入力ミスしても選択済み状態になる
こちらは仕方ない部分ではありますが、チェックボックスのチェックを間違って二重線で消しても、`selected`が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/53ef6314-1cd3-0434-6e57-6eac6fc4aae3.png)

#### 5. 丸囲みは検出できない
申請書でよくみられる、生年月日やアンケート項目を丸で囲む記載方式は、現在検出が出来ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268929/4993f9fd-9f1c-aee2-1bcd-f587e55db96d.png)

これが出来るようになると申請書関連で読み取りたい項目はほぼカバーできるのではないかと思います。

## まとめ
今回は、Form Recognizer v3.0のカスタムモデルを使用して、申請書の項目読み取りモデルを作ってみました。
日本語の手書き文字やチェックボックスなど、日本企業の申請書にありがちな情報は、読み取りモデルを作成することで高精度に読み取れることを確認しました。
価格に関しても、他クラウドベンダーの同等サービスに比べて低価格で、**ページ内でいくつ項目を読み取っても定額**という点も非常にうれしいポイントです。

一方で、申請書によくみられる丸囲みの様な情報は取ることができず、別途画像処理や丸囲みを検出するAIモデルを構築するなどの対策が必要そうです。
これが出来ると日本における申請書関連の項目読み取りはForm Recognizerで一通り出来るといっても良いのではないでしょうか。

現時点で出来ること、出来ないことはありつつも、日本語も高精度に読み取れて、チェックボックスなどの記号検出も出来る、かつ低価格でたくさんの項目を読み取ることができるForm Recognizerは非常に高機能なサービスであると感じました。
ドキュメント活用でお悩みの方は、まずはAzureのForm Recognizerを試して頂くのも良いのではないでしょうか。