【Dolphin】Pythonで簡単に日本語OCR_その4

# 0. はじめに

OCRの記事何回目やねんって感じですが、見つけてしまうとやりたくなってしまうんですよね。

今回はbytedance社のOSSであるDolphinをお試ししたメモを残します

https://github.com/bytedance/Dolphin


- 動作環境
・ OS : Windows11 pro
・ python : 3.11.9(uv環境) ※3.12系だとエラーが出る為、3.11系がいいと思います
・ torch : 2.5.1+cu121
・ GPU : RTX 4070 ti super(16GB)  ※ 使った感じVRAMが6GBあれば動くと思います


# 1. ライブラリの特徴


- 2段階の解析アプローチで文書画像の解析に対処
・ ステージ1： ページ全体のレイアウトを分析し、自然な読書順に要素のシーケンスを生成
・ ステージ2： 異種アンカーとタスク固有のプロンプトを使用して、文書要素を効率的に並列解析

- モデルアーキテクチャ
・ Swin Transformerをベースにしており、文書画像から視覚的特徴を抽出
・ mBart(multilingual sequence-to-sequence denoising auto-encoder)に基づいており、視覚的特徴からテキストを生成
・ 自然言語プロンプトを使用して解析タスクを制御

![特徴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/75fedc9d-ca1e-4ca6-adf8-4ecc923dadd1.png)


# 2. 準備

モデルのダウンロードは2通りあって、.checkpointsフォルダの中にgoogle driveからDLしてくる方法もあるらしいですが、以下はHugging Face Hubを使用しています。

使用したpythonはuv環境です<font color="Red">(3.12だと動かなかったのでバージョン注意）</font>


```cmd:コマンド プロンプト
; dolphin-projectの作成 + pythonの設定（3.11.9）+ cdで移動
uv init -p 3.11.9 dolphin-project && cd dolphin-project

; リポジトリのクローン
git clone https://github.com/ByteDance/Dolphin.git
cd Dolphin

; venvを作成
uv venv

; 依存関係のインストール
uv pip install -r requirements.txt

; torchをGPUに切り替え（requirements.txtが非GPUだったので）
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

; Git Large File Storage（Git LFS）のセットアップ
git lfs install

; Hugging Face Hubからモデルをダウンロード
git clone https://huggingface.co/ByteDance/Dolphin ./hf_model
```

# 3. デモをお試し

なぜか`uv run`だとエラーで動かなかった為、普通に仮想環境を有効にして実行しました

```cmd:コマンド プロンプト
; 仮想環境有効化（uv runだとエラーになったため）
.venv\Scripts\activate

; デモの実行
python demo_page_hf.py --model_path ./hf_model --input_path ./demo/page_imgs/page_1.jpeg --save_dir ./results
```

すると以下のようにresultsフォルダ直下にmarkdownとrecognition_jsonフォルダが出力される

![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/98f62ecc-3a4c-4097-832f-021e19a23b08.png)

・ デモ画像(英語論文)
![P1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/4f594283-cdd1-4cbb-af7d-b953085a83ba.png)

以下がmd形式の出力でかなりいい感じで段落別に取得できていそう(vscodeで表示)

![p1md.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/7cb3ae80-7032-4dd8-91d0-51cf61b74fbd.png)

# 4. 日本語でのOCRをお試ししてみる

## 4-1. 雨ニモマケズのOCR

まずはいつもやっている宮沢賢治の雨ニモマケズのスクショ

![miyazawa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/5d38624b-06d0-42a5-b2e4-92610bda6293.png)

**今度は表ではないので`Element-level Parsing`というので実行をしてみる。**
これは個々のドキュメント要素 (テキスト、表、数式) を解析できるらしいので、こういうOCRケースではこちらのほうが最適だと考えられます ※`demo_element_hf.pyを使用する`

```cmd:コマンド プロンプト
python demo_element_hf.py --model_path ./hf_model --input_path ./miyazawa.png --element_type text --save_dir ./results
```

```md:出力
【雨ニモマケズ】 宮澤賢治周二モマケズ 風ニモマケズ 雪ニモ夏ノ暑サニモマケヌ 丈夫ナカラダヲモチ 慾ハナク 決シテ瞋ラズ イツモシツカニワラッテヰル 一日ニ玄米四合ト 味噌ト少シノ野菜ヲタベ アラユルコトヲ ジブンヲカンジョウニ入レズニ ヨクミキキシワカリ ソシテワスレズ
```

おお！！<font color="Red">これまでの記事のOCRで最高性能かもしれない！！</font>(以下が間違えた2か所)
`雨二モマケズ　→　周二モマケズ`
`イツモシヅカ　→　イツモシツカ`

## 4-2. NLP2025の最優秀賞論文

今年のNLP2025の最優秀論文のスクショでも試してみます
今度はPage-level Parsing(ページレベルの解析)でやってみることにします
`demo_page_hf.py`


![NLP2025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/6a9e8d8b-9263-48f6-adb9-2a4a4bc32123.png)

```cmd:コマンド プロンプト
python demo_page_hf.py --model_path ./hf_model --input_path ./NLP2025.png --save_dir ./results
```

![論文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/eb8fb2fb-d8a8-40f7-b76f-ba23de55ae08.png)

抜けもありますが、無茶苦茶性能いいですね！！


## 4-3. ソフトバンクグループの決算書

次にかなり複雑ですが決算書を読ませてみます。
同じくPage-level Parsing(ページレベルの解析)でやってみることにします
`demo_page_hf.py`

![softbank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/9b69f154-7b1a-4260-a6e0-05adfb0bcbf4.png)


```cmd:コマンド プロンプト
python demo_page_hf.py --model_path ./hf_model --input_path ./softbank.png --save_dir ./results
```


![そふばん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/6fb96157-f5b7-4cba-aebc-a82decfc3df5.png)

これも最初の表まではほぼパーフェクトに読んでいるが、**途中からはうまく読めてないですね。**
Element-level Parsingのテーブルデータ処理でやらせても2個目以降の表はうまくいきませんでした


# 5. おわりに

宮沢賢治のOCRは旧字体も入っているのでどのOCRも苦戦する中、これはかなり健闘したほうだと思います。
自分の記事では検証していませんが、日本語OCRでは日本語専門の`YomiToku`なんかがかなり強いイメージがありますので色々比較してみても面白いのではないでしょうか？


### - - 過去のOCR検証記事（tesseract、PaddleOCR、Dounuts）

https://qiita.com/kuk_a_i_ai/items/93fdbd75edacb34ec610

https://qiita.com/kuk_a_i_ai/items/d4c1ce70836b8035a449

https://qiita.com/kuk_a_i_ai/items/99bba7c7362285254c7d