日本語特化のAI OCR「YomiToku」で帳票を解析する

[YomiToku](https://github.com/kotaro-kinoshita/yomitoku)は、日本語に特化したAI OCRソフトウェアです。Pythonで作られており、 `pip` コマンドでインストールできます。日本の帳票にあるような複雑なレイアウトや、縦書きの解析も可能です。

今回はYomiTokuを使って、帳票を解析してみます。帳票を自動で取り込んだり、帳票に出力されているテキストを使ってシステムを自動化したいと言ったニーズに使えるはずです。

## YomiTokuのセットアップ

YomiTokuは `pip` でインストールします。

```bash
pip install yomitoku
```

ONNX Runtimeの実行にGPUを利用する場合は、以下のコマンドになります。

```bash
pip install yomitoku[gpu]
```

### 注意点

pytorchはCUDAのバージョンに合わせて選択してください。デフォルトではCUDA12.4以上を想定してインストールされます。また、pytorch自身は2.5以上のバージョンが必要です。[Dockerfile](https://github.com/kotaro-kinoshita/yomitoku/blob/main/dockerfile)もあります。

## 今回の帳票

今回は[請求管理ロボ](https://www.robotpayment.co.jp/service/mikata/template/invoice/)にて公開されているテンプレートをベースにさせてもらっています。住所などの情報は[個人情報テストデータ生成ツール](https://testdata.userlocal.jp)を使って生成したダミーデータです。

![スクリーンショット 2025-02-21 17.07.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/e13303e0-2178-45a2-ac85-69189344e257.png)


一般的な帳票にあるように、以下の3パターンで構成されています。

- ヘッダー
- リスト
- フッター

この帳票をYomiTokuで解析します。

## OCR処理を行う

### ファイルを配置する

解析対象とするファイルは、ExcelファイルではなくPDFファイルになります。ExcelからPDFとしてエクスポートしたものを、 `docs` フォルダ以下に保存しています。

### 解析を実行する

以下のコマンドで解析を実行します。

```bash
# HTMLファイルを出力
yomitoku ./docs -f html
# JSONファイルを出力
yomitoku ./docs -f json
# Markdownファイルを出力
yomitoku ./docs -f md
# CSVファイルを出力
yomitoku ./docs -f csv
```

コマンドを実行すると、最初にモデルをダウンロードします。これは自動的に行われ、初回のみです。

```bash
model.safetensors: 100% 102M/102M [00:02<00:00, 42.4MB/s]
model.safetensors: 100% 200M/200M [00:04<00:00, 42.7MB/s]
model.safetensors: 100% 172M/172M [00:04<00:00, 37.0MB/s]
model.safetensors: 100% 172M/172M [00:04<00:00, 41.2MB/s]
```

そして解析を実行し、 `results` ディレクトリに結果が出力されます。出力先フォルダは変更可能で、なければ自動で作成されます。

```bash
yomitoku.cli.main - INFO - Total Processing time: 4.81 sec
```

## 解析結果

実行時に `-v` を付けると、レイアウト解析とテキスト認識結果を画像で出力します。このファイルを見れば、どう認識されたのかが確認できます。

### レイアウト認識

レイアウト認識結果は、 `*_layout.jpg` というファイルになります。ヘッダーとフッターはページ中に1回しか出てこない情報として認識されています。そして、明細部分は表として認識しています。

![images_template_02_p1_layout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/f4a65099-eb59-48bc-aa31-962644a838d2.jpeg)


赤い線でつながっている部分はJSONで `paragraphs` として出力されます。表の部分は `tables` になります。

### テキスト認識

テキスト認識結果は、 `*_ocr.jpg` というファイルになります。テキスト認識された部分を枠で囲み、その左上にテキストが出力されます。この結果を見れば、目的のテキストが正しく認識されているか、すぐに分かります。

![images_template_02_p1_ocr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/59c44855-658c-4e6c-a044-a18db8b5e991.jpeg)


### Markdown

Markdownでの出力結果です（一部）。テキストが正しく認識されているのはもちろんのこと、電話や郵便のようなマークも正しく出力されていたり、振込先の半角カタカナは全角カタカナとして認識されているのが確認できます。

```markdown
# 請 求 書

# 合名会社小田部石材商会 東京支社 御 中

〒 919\-5359 福井県福井市日之出1\-4\-4<br>営業部 担当者:北岡 泰典 様

下記の通りご請求申し上げます。

請求金額

¥2,855,600\-

|No\. :|123456\-123|
|-|-|
|請求日:|令和13年12月21日|

株式会社ナカヤマ<br>〒 456\-0029<br>愛知県春日井市如意申町<br>4\-1\-10 東城ビル 1F<br>☎ 0531\-50\-0057 0531\-50\-0058<br>sato\_415@example\.org

|No\.|商品名 / 品名|数 |単価|金 額|
|-|-|-|-|-|
|1|ノートパソコン|5 |120,000|600,000|
|2|スマートフォン|8台|80,000|640,000|
  :
|24|||||

備考欄:

|小 計\(税抜\)|¥2,596,000|
|-|-|
|消費税\(10%\)|¥259,600|
|合 計\(税込\)|¥2,855,600|

振込先: あおぞら 銀行 夕立 支店 普通口座 No 0123456 カ\) ナカヤマ

お支払い期限:令和13年12月31日<br>\(※お振込手数料は御社ご負担にてお願い致します\)
```

### HTML

HTMLは、MarkdownをHTMLに変換した場合と同じように解析されているのが確認できます。特徴的なのは表のセル結合も想定し、 `colspan` なども付与されていることです。

```html
    <table border="1" style="border-collapse: collapse">
      <tr>
        <td rowspan="1" colspan="1">No. :</td>
        <td rowspan="1" colspan="1">123456-123</td>
      </tr>
      <tr>
        <td rowspan="1" colspan="1">請求日:</td>
        <td rowspan="1" colspan="1">令和13年12月21日</td>
      </tr>
    </table>
    <p>株式会社ナカヤマ<br/>〒 456-0029<br/>愛知県春日井市如意申町<br/>4-1-10 東城ビル 1F<br/>☎ 0531-50-0057 0531-50-0058<br/>sato_415@example.org</p>
    <table border="1" style="border-collapse: collapse">
      <tr>
        <td rowspan="1" colspan="1">No.</td>
        <td rowspan="1" colspan="1">商品名 / 品名</td>
        <td rowspan="1" colspan="1">数 </td>
        <td rowspan="1" colspan="1">単価</td>
        <td rowspan="1" colspan="1">金 額</td>
      </tr>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/daaba416-3f0e-4afc-80ad-a5cad7aeedef.png)


### JSON

JSONはシステム連携に適したフォーマットです。前述の通り、ヘッダーやフッター部は `paragraphs` に、表の部分は `tables` として出力されます。システム連携する際に役立つはずです。

また、JSONでは認識されている座標（左上と右下）が `box` の中に入ります。以下は出力結果の一部です。

```json
{
    "figures": [
        {
            "box": [
                1310,
                274,
                1473,
                430
            ],
            "direction": "horizontal",
            "order": 7,
            "paragraphs": [
                {
                    "box": [
                        1313,
                        280,
                        1470,
                        426
                    ],
                    "contents": "コロ尚\n山手式\n隠せ風\n証二軸",
                    "direction": "horizontal",
                    "order": 0,
                    "role": null
                }
            ]
        }
    ],
    "paragraphs": [
        {
            "box": [
                249,
                168,
                476,
                216
            ],
            "contents": "請 求 書",
            "direction": "horizontal",
            "order": 0,
            "role": "section_headings"
        },
        :
    ],
    "tables": [
        {
            "box": [
                186,
                601,
                1453,
                1743
            ],
            "cells": [
                {
                    "box": [
                        189,
                        660,
                        245,
                        705
                    ],
                    "col": 1,
                    "col_span": 1,
                    "contents": "1",
                    "row": 2,
                    "row_span": 1
                },
                {
                    "box": [
                        246,
                        660,
                        773,
                        705
                    ],
                    "col": 2,
                    "col_span": 1,
                    "contents": "ノートパソコン",
                    "row": 2,
                    "row_span": 1
                },
                {
                    "box": [
                        773,
                        660,
                        1014,
                        705
                    ],
                    "col": 3,
                    "col_span": 1,
                    "contents": "5 ",
                    "row": 2,
                    "row_span": 1
                },
                {
                    "box": [
                        1015,
                        660,
                        1205,
                        705
                    ],
                    "col": 4,
                    "col_span": 1,
                    "contents": "120,000",
                    "row": 2,
                    "row_span": 1
                },
                {
                    "box": [
                        1205,
                        660,
                        1450,
                        705
                    ],
                    "col": 5,
                    "col_span": 1,
                    "contents": "600,000",
                    "row": 2,
                    "row_span": 1
                },
```

### CSV

CSVファイルは表形式が多い帳票では便利に使えるフォーマットです。また、Excelで開いて情報を取り出すのにも役立つでしょう。以下は、その出力結果の一部です。

```csv
請 求 書
""
合名会社小田部石材商会 東京支社 御 中
""
"〒 919-5359 福井県福井市日之出1-4-4
営業部 担当者:北岡 泰典 様"
""
下記の通りご請求申し上げます。
""
請求金額
""
"¥2,855,600-"
""
No. :,123456-123
請求日:,令和13年12月21日
""
"株式会社ナカヤマ
〒 456-0029
愛知県春日井市如意申町
4-1-10 東城ビル 1F
☎ 0531-50-0057 0531-50-0058
sato_415@example.org"
""
No.,商品名 / 品名,数 ,単価,金 額
1,ノートパソコン,5 ,"120,000","600,000"
2,スマートフォン,8台,"80,000","640,000"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/8bfca1e6-9b28-4f35-b0fc-fa976e6f87cd.png)


YomiTokuを使えば、帳票から情報を抽出したり、簡単にシステム連携できるのが分かってもらえるかと思います。

## YomiTokuの特徴

YomiTokuの特徴は、以下の通りです。

### AIを活用

YomiTokuでは、以下の4種類のAIモデルを搭載しています。

- 文字位置の検知
- 文字列認識
- レイアウト解析
- 表の構造認識

いずれも日本語データセットで学習しています。

### 日本語、英語に対応

日本語の文書画像に特化して学習しており、日本の商習慣で使われる複雑な表であったり、縦書き文書にも対応しています。7,000文字を超える大規模な日本語文書でも利用できます。

### レイアウト解析・表の構造認識

段組や、帳票や書面の中で使われている表の構造認識ができ、レイアウトの意味的構造を正しく認識、情報を抜き出します。

### 多様な出力フォーマット

出力は以下の4フォーマットに対応しています。

- Markdown
- JSON
- HTML
- CSV

システム連携も容易なJSON、見やすいMarkdown、表計算ソフトでの利用に便利なCSVなど、用途に合わせて使い分けることができます。

### セキュリティ

クラウドサービスではないので、自社サーバー内に閉じた環境下で解析できます。請求データなど、機密情報を取り扱う上でも安心です。

### GPU利用

GPU環境下で高速に動作します。VRAMは8GB以内で動作しますので、ハイエンドなGPUでなくても利用できます。

## 注意点

### CPUでの利用について

YomiTokuはGPUでの利用を推奨していますが、CPU環境下でも実行は可能です。ただし、解析には数分かかるので注意してください。

### 手書き文字について

2025年2月現在のYomiTokuでは、活字のみサポートしています。手書き文字については、公式にはサポートしておりません。また、看板など紙以外にプリントされた情景OCRについては、最適化されていません。

### 画像サイズについて

低解像度画像では識別精度が低下します。画像の短辺を720px以上の画像で解析することを推奨します。

## ライセンス

YomiTokuのライセンスは[コモンズ証 \- 表示 \- 非営利 \- 継承 4\.0 国際 \- Creative Commons](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ja)です。非商用での個人利用、研究目的においては、ご自由に利用できます。商用目的での利用に関しては、商用ライセンスが必要です。

## まとめ

今回はYomiTokuを使って、帳票を解析しました。表部分の構造を維持したまま解析できることを確認してもらえたかと思います。この出力をシステム側で受け取れば、必要な情報を使ったシステム連携も容易になるはずです。

[kotaro\-kinoshita/yomitoku: Yomitoku is an AI\-powered document image analysis package designed specifically for the Japanese language\.](https://github.com/kotaro-kinoshita/yomitoku?tab=readme-ov-file)