日本語に特化したAI OCR「YomiToku」の紹介

OCR（Optical Character Recognition）というのは、手書きや印刷された文字を読み取り、デジタルデータに変換する技術です。スキャナーや、スマホアプリなどで使ってみた経験がある方も多いかと思います。

OCRはさまざまな場面で利用されていますが、たとえば既存の紙データのデジタル化であったり、ビジネス上やり取りされる帳票を使ったシステムの自動処理などで活用されています。

[YomiToku](http://bit.ly/4jzDHh5)もそんなOCRソフトウェアの一つです。日本語に特化しており、複雑な表組みなども読み取れるのが特徴です。

今回は、YomiTokuの簡単な使い方を紹介します。

## YomiTokuの特徴

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

### AIを活用

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

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

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

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

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

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

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

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

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

- Markdown
- JSON
- HTML
- CSV

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

### セキュリティ

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

### GPU利用

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

## 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)もあります。

### 解析対象を用意する

解析対象になる画像ファイルを用意します。今回は例として、[請求書エクセルテンプレート\(無料\)\_タテ型\_001](https://template.the-board.jp/invoice_templates/article/invoice_template_001/)よりダウンロードした請求書を使わせてもらっています。

![invoice.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/239909f4-a2a3-443a-94cb-e231ac73d5cb.jpeg)


請求書のテンプレートをダウンロードしたら、PDFファイルに変換しています。YomiTokuでは、PDFや画像ファイルを解析対象として利用できます。そのファイルを `images` ディレクトリに格納しています。

### 解析を実行する

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

```bash
# HTMLファイルを出力
yomitoku ./images -f html
# JSONファイルを出力
yomitoku ./images -f json
# Markdownファイルを出力
yomitoku ./images -f md
# CSVファイルを出力
yomitoku ./images -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
```

### 実行時間について

実行時間はGPUによって異なりますが、 Google ColabのA100で実行した場合は2.5〜3.5秒程度でした。T4 GPUなどにしても高速になる訳ではないので、低価格帯のGPUで問題ありません。

## 実行結果

実行結果です。

### HTMLファイルの場合

HTMLでは、表部分が `table` タグで出力されます。

![スクリーンショット 2025-02-15 16.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/d7105f76-200c-4f9c-8af4-2b655446be9c.png)

```html
<html>
  <body>
    <p/>
    <h1>サンプル株式会社 御中</h1>
    <p>下記のとおり、御請求申し上げます。</p>
    <p/>
    <h1>請 求 書</h1>
    <-- 略  -->
    <table border="1" style="border-collapse: collapse">
      <tr>
        <td rowspan="1" colspan="1">摘要</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>
        <td rowspan="1" colspan="1">金額</td>
      </tr>
      <tr>
        <td rowspan="1" colspan="1">サンプル1</td>
        <td rowspan="1" colspan="1">1</td>
        <td rowspan="1" colspan="1">式</td>
        <td rowspan="1" colspan="1">10,000</td>
        <td rowspan="1" colspan="1">10%</td>
        <td rowspan="1" colspan="1">10,000</td>
      </tr>
      <!-- 以下略 -->
    </table>
    <!-- 以下略 -->
  </body>
</html>
```

### JSONファイルの場合

JSONファイルの場合です。表になっている部分は `table` キー以下にあるので、システム連携する際にはこの部分を利用します。 `box` は認識された座標を示しています。

```json
{
    "figures": [],
    "paragraphs": [
        {
            "box": [
                197,
                490,
                1043,
                581
            ],
            "contents": "サンプル株式会社 御中",
            "direction": "horizontal",
            "order": 0,
            "role": "section_headings"
        },
        // 略
    ],
    "tables": [
        {
            "box": [
                182,
                830,
                1369,
                1206
            ],
            "cells": [
                {
                    "box": [
                        185,
                        834,
                        523,
                        926
                    ],
                    "col": 1,
                    "col_span": 1,
                    "contents": "件名",
                    "row": 1,
                    "row_span": 1
                },
                {
                    "box": [
                        523,
                        831,
                        1368,
                        926
                    ],
                    "col": 2,
                    "col_span": 1,
                    "contents": "サンプルプロジェクト",
                    "row": 1,
                    "row_span": 1
                },
                // 以下略
            ],
        },
}
```

### Markdownの場合

Markdownの場合、表の部分はMarkdownのテーブル形式で出力されます。

```markdown
# サンプル株式会社 御中

下記のとおり、御請求申し上げます。

# 請 求 書

|件名|サンプルプロジェクト|
|-|-|
|支払期限|2022/5/31|
|振込先|サンプル銀行 本店 普通 1111111<br>サンプル\(カ|

合計

140,600 円\(税込\)

|No\.|1001|
|-|-|
|請求日|2022/4/30|

サンプル株式会社<br>〒100\-0001<br>東京都千代田区千代田1\-1\-1<br>サンプルビル3階<br>TEL : 03\-0000\-0000<br>担当:サンプル太郎<br>登録番号:T1234567890123

|摘要|数量|単位|単価|税率|金額|
|-|-|-|-|-|-|
|サンプル1|1|式|10,000|10%|10,000|
: 以下略
```

### CSVの場合

CSVの場合、表の部分はCSV形式で出力されます。Excelなどで開いた際にも、レイアウトが維持されているので確認しやすいはずです。

```csv
サンプル株式会社 御中
  : 省略
登録番号:T1234567890123"
""
摘要,数量,単位,単価,税率,金額
サンプル1,1,式,"10,000",10%,"10,000"
```

![スクリーンショット 2025-02-15 16.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/aee31624-8c4f-4f7a-a292-f99cdaa24fb2.png)


## 解析内容を可視化する

コマンドオプション `-v` を付けると、解析結果を可視化した画像を出力します。

```bash
yomitoku ./images -f html -v
```

認識された箇所をボックスで囲み、その認識された文字列も合わせて出力されるので、YomiTokuがどういった箇所をどう認識しているのかを確認することができます。

![_invoice_p1_ocr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/18fbe992-745d-4d31-a6ea-2dd69e55d948.jpeg)

## 注意点

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

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

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

~~2025年2月現在のYomiTokuでは、活字のみサポートしています。手書き文字については、公式にはサポートしておりません。また、看板など紙以外にプリントされた情景OCRについては、最適化されていません。~~
YomiTokuのv0.8.1から手書き文字認識がサポートされました。例えば、ホワイトボードの文字を下記のように読み取ることができました。
![inputs_white-board_p1_ocr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4009607/59402cc5-c28a-448a-bf92-18c8dc3b6851.jpeg)

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

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

## ライセンス

YomiTokuは、非商用での個人利用、研究目的での利用は自由に利用可能ですが、商用目的での利用に関しては、別途、商用ライセンスが必要で、[問い合わせ](https://bit.ly/4l5nNeH)が必要です。

## まとめ

YomiTokuを使えば、これまでは難しかった帳票や、複雑なレイアウトの文書もデジタル化できます。既存資産のDX化や、業務効率化に役立ててください。

* [YomiToku - GitHub](http://bit.ly/4jzDHh5)
* [商用ライセンス問い合わせ](https://bit.ly/4l5nNeH)