Form Recognizerの"作成済みモデル"を試してみた

# はじめに
本記事はForm Recognizerの"作成済みモデル"がどういうものかよくわからない方向けです。

- Form Recognizerのドキュメントを見ても作成済みモデルだけ仕様があまりイメージできなかった
- 作成済みモデルでできることを知りたい
- カスタムモデルと作成済みモデルの出力内容の差分を知りたい

という皆様の助けになればと思っております。

# Form Recognizerって？
高度な機械学習モデルを適用してドキュメントから文字や表などの要素を抽出するAIサービスです。

いくつか提供されているモデルの中から、読み取りたいドキュメントに合わせて適切なものを選択します。
モデルは大きく分けると次の３種類があります。

①　汎用的な抽出ができるドキュメント分析モデル
②　特定の形式のドキュメントに特化した事前構築済みモデル
③　独自のデータを学習してモデルを作成できるカスタムモデル

本記事で取り上げるのは③カスタムモデルの一つ、作成済みモデルです。

|モデルの種類|モデル名|
|---|---|
|ドキュメント分析モデル|	● 読み取りOCRモデル<br>● 一般ドキュメントモデル<br>● レイアウト分析モデル|
|事前構築済みモデル|● W-2フォームモデル<br>● 請求書モデル<br>● 領収書モデル<br>● 身分証明書 (ID) モデル<br>● 名刺モデル|
|カスタムモデル|● カスタムモデル<br>● **作成済みモデル（本記事で取り扱うモデル）**|

# 作成済みモデルって？
作成済みモデル（Composed Model）は、composedの意味のとおり複数のカスタムモデルから構成されるモデルです。
そして、最も日本語訳がしっくりこないモデルです。

1つの作成済みモデルには複数のカスタムモデルを割り当てることができます。
そして作成済みモデルを使ってドキュメントの分析をすると、割り当てられたカスタムモデルの中でドキュメントのフォーマットに最も近いカスタムモデルを自動で選択し抽出を行ってくれるというわけです。

モデルの自動選択まで行ってくれるので、事前にどのカスタムモデルを使うか指定することが難しい場合に使えそうなモデルですね。


# 作成済みモデルを試す
今回はブラウザ上で学習から抽出まで簡単に行えるForm Recognizer Studioを使います。

ドキュメントはフォーマットの異なる２種類を用意します。
それぞれ学習して生成した2つのカスタムモデルから1つの作成済みモデルを作成し、抽出を行います。


## カスタムモデル1,2の生成
１つ目のドキュメントはアンケート用紙。
![スライド3_small.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/db66e5a4-236c-5873-66b3-87f9349c4c0e.png)
Form Recognizer Studioでアップロード後、項目名のラベル付けを行っていきます。
簡略化のため以下の項目のみラベル付けしました。
- 性別、年齢欄の各チェックボックス
- お住まい欄
![コメント 2022-12-22 191546.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/ee4a30ed-cc35-1c4a-4ff2-e701ffb57ea7.jpeg)

カスタムモデルの学習には最低5枚必要なため、同フォーマットで別の内容を記載したアンケート用紙を合わせて5枚用意し同様に作業します。
カスタムモデル1ができました。


２つ目は問診票。あまりにも異質な書類コンビですが、ご容赦ください。
![スライド1_small.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/d3644fdb-6d4d-1630-12e0-cac616c9dfdf.png)
問診票では以下の項目のみラベル付けしました。
- フリガナ、氏名、住所、電話番号欄
- 服用中のお薬の有/無のチェックボックス

同じく5枚でラベル付けして学習を行い、カスタムモデル2ができました。

## 作成済みモデルの生成
Form Recognizer Studio上でモデル一覧を確認すると、作成したモデルが2つ確認できます。（questionnaire5とmonshinhyou5）
これらを選択して[Compose]を押します。
![コメント 2022-12-22 194154.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/ee956869-b66b-9bc5-be94-0cf81bdf3b9b.jpeg)
ダイアログで名前を入力すると、作成済みモデルの完成です。
![コメント 2022-12-22 194230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/6eb751d8-5a04-b0dc-7347-380f87ebe263.jpeg)

## 作成済みモデルで抽出

### 出力されるjsonの内容
内容はカスタムモデルとほぼ同じでした。

"document"内に
- 適用したモデル "docType"
- 学習した項目それぞれの抽出結果 "fields"
- モデル適用の信頼度　"confidence"

等が入っています。

唯一異なる点ですが、カスタムモデルの場合は
```
"docType": "questionnaire5:questionnaire5",
```
と```カスタムモデル名:カスタムモデル名```の形式でしたが、作成済みモデルでは
```
"docType": "composedModel:questionnaire5",
```
と```作成済みモデル名:カスタムモデル名```の形式になります。


### アンケート用紙
![コメント 2022-12-22 194858.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/ac44f72f-16d3-7a0b-e325-9610079c9504.jpeg)
各チェックボックスもお住まいも問題なく読み取れていました。

jsonの"docType"と"confidence"は以下の通りです。
```
"docType": "composedModel:questionnaire5",
...
"confidence": 0.612,
```
confidenceはやや低く感じますが、アンケート用紙のカスタムモデルに近いと正しく認識されたようです。

### 問診票
![コメント 2022-12-22 194911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/443eecd9-0648-d4cb-7970-3670e8b88e95.jpeg)
氏名欄を除き、正しく読み取れていました。
氏名欄は別の欄の文字に繋がってしまいました。
　expect：戸中医　ベル
　actual：ベ ル ( 10 歳 )
また、こちらも問診票のカスタムモデルに近いと正しく認識されました。
```
"docType": "composedModel:monshinhyou5",
...
"confidence": 0.433,
```

氏名欄の誤読に関しては
元のカスタムモデルで5枚しか学習していないので、氏名の長さのバリエーションを変えつつ学習数を増やせば改善するかもしれません。


### それ以外
学習したアンケート用紙でも問診票でもない書類を入れるとどうなるのか...？
気になったので試してみました。

業務日報
![コメント 2022-12-22 200553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986264/d1b173bf-da4d-d6e6-1b1f-79658739f669.jpeg)

アンケート用紙のフォーマットに近いと判定され、アンケート用紙の想定で一部ラベル付けされた結果が返ってきました。
当然ながら結果の示すラベル付けは全く正しくない内容でした。
モデル適用のconfidenceの値も非常に低かったです。
```
"docType": "composedModel:questionnaire5",
...
"confidence": 0.005,
```


## 試してわかったこと
- カスタムモデルと出力形式は変わらない
- 全く関係ないフォーマットの書類を入れた場合でも、作成済みモデルに割り当てられたいずれかのカスタムモデルが適用されたうえで抽出される
- 結果のjsonファイルから適用されたモデル名とモデル適用のconfidenceがわかる

学習したフォーマットの書類が入れられたかどうかの判定は、confidenceから推測できそうです。


# まとめ
私の中でふんわりとしていたForm Recognizerの作成済みモデルの仕様が少し明らかになりました。
今回の調査で湧いた疑問点も今後調べていきたいと思います。
Form Recognizerは日本語対応していないモデルも未だ多いですが、対応言語は増えつつあるので今後に期待したいです。

# 参考
- [Azure Form Recognizer とは?](https://learn.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/overview?view=form-recog-3.0.0)
- [作成済みカスタムモデル](https://learn.microsoft.com/ja-jp/azure/applied-ai-services/form-recognizer/concept-composed-models?view=form-recog-3.0.0)
- [テンプルン](https://template-run.jp/)：各書類のテンプレートを拝借