🦔
🧠 DianJin-OCR-R1: 推論とツール連携によるOCR幻覚問題の解決
🔬 概要
OCRタスクにおいて、大規模視覚言語モデル(LVLM)は印象的な性能を示す一方で、入力画像に存在しない文字を生成する「幻覚」問題に悩まされている。この記事では、推論とツール連携によってこの問題を解決するDianJin-OCR-R1フレームワークについて、理論的背景と実装方法を詳しく解説する。
📝 論文紹介
- 論文名: DianJin-OCR-R1: Enhancing OCR Capabilities via a Reasoning-and-Tool Interleaved Vision-Language Model
- 著者: Qian Chen, Xianyin Zhang, Lifan Guo, Feng Chen, Chi Zhang (Alibaba Cloud)
⚡ OCR幻覚問題の現実
従来のLVLMは言語パターンに過度に依存し、実際の画像内容を正確に認識せずにもっともらしい回答を生成してしまう。論文のTable 1で示された例では:
モデル | 出力 |
---|---|
Qwen2.5-VL-7B-Instruct | 北川羌族自治県農村信用合作联社永安分社 |
PP-StructureV3 | 北川羌族自治県永安镇工農行第九村民小组 |
正解 | 北川羌族自治県永安镇工農村第九村民小组 |
一方、専門OCRモデルは特定タスクに特化したアーキテクチャにより幻覚が起こりにくく、最悪でも数文字の認識ミス程度に留まる。
🏗️ 推論とツール連携パラダイム
DianJin-OCR-R1は以下の3段階プロセスを採用している:
数学的定式化
元のOCRデータセット
ここで:
-
: モデル自身による初回認識\texttt{<think></think>} -
: 専門OCRツールの結果\texttt{<tool></tool>} -
: 反省と最終判断\texttt{<rethink></rethink>}
処理フロー
-
Pass 1 (自己認識): VLMが
<think>...</think>
内で独自にOCRを実行 -
ツール呼び出し:
<tool>
トークンで専門OCRシステムへのハンドオフ -
Pass 2 (再検討): 専門ツール結果を参考に
<rethink>
で最終回答を生成
💻 vLLMでの実装詳細
論文の公式実装に基づく実際のコード例:
from transformers import AutoProcessor
from vllm import LLM, SamplingParams
from qwen_vl_utils import process_vision_info
import json, re
MODEL_PATH = "path/DianJin-OCR-R1/seal_sft"
llm = LLM(
model=MODEL_PATH,
limit_mm_per_prompt={"image": 10},
gpu_memory_utilization=0.85,
)
# Pass 1: <tool>まで生成
pass1_params = SamplingParams(
temperature=0.0, top_p=1.0, repetition_penalty=1.05,
max_tokens=2048, stop=["<tool>"]
)
outputs = llm.generate([{"prompt": prompt, "multi_modal_data": mm_data}],
sampling_params=pass1_params)
# 専門OCRツール呼び出し
tool_block = "<tool>\n" + json.dumps({
"ocr_tool_1": expert_ocr_result
}, ensure_ascii=False, indent=2) + "\n</tool>\n"
# Pass 2: ツール結果を含めて最終生成
pass2_prompt = prompt.rstrip() + "\n" + think_prefix + "\n" + tool_block
pass2_params = SamplingParams(temperature=0.0, max_tokens=4096)
重要な実装ポイント
-
停止条件の厳密性:
stop=["<tool>"]
で正確にトークンを指定 -
決定論的生成:
temperature=0.0
で安定した結果を確保 - ツールペイロードの簡潔性: 必要最小限のJSON構造を維持
📊 実験結果
ReST・OmniDocBenchでの評価結果(論文Table 4より):
印章認識タスク(ReST)
モデル | 精度 |
---|---|
Qwen2.5-VL-7B-Instruct | 0.527 |
DianJin-OCR-R1 (SFT) | 0.722 |
DianJin-OCR-R1 (RFT) | 0.766 |
表認識タスク(OmniDocBench)
モデル | TEDS↑ | STEDS↑ | NED↓ |
---|---|---|---|
PP-StructureV3 | 0.818 | 0.918 | 0.121 |
DianJin-OCR-R1 (RFT) | 0.901 | 0.939 | 0.072 |
数式認識タスク(OmniDocBench)
モデル | CDM↑ | ER↑ | NED↓ |
---|---|---|---|
UniMERNet-B | 0.932 | 0.645 | 0.290 |
DianJin-OCR-R1 (RFT) | 0.976 | 0.787 | 0.179 |
🚀 強化学習による性能向上
GRPO(Group Relative Policy Optimization)
論文Section 3.3で詳述されている2つの報酬機構:
-
フォーマット報酬: 構造化出力の促進
- 正確なタグ構造: 1.0
- 不適切な構造: 0.0
-
精度報酬: 回答正確性の向上
- 印章認識: 完全一致で1.0
- 表認識: TEDS スコア
- 数式認識: CDM + ボーナス0.5
訓練設定
-
SFT段階: 学習率
、2エポック1.0 \times 10^{-5} -
RFT段階: 学習率
、8ロールアウト、3エポック1.0 \times 10^{-6}
🔧 実用的デプロイメント
OpenAI型関数呼び出しとの違い
項目 | OpenAI型 | DianJin型 |
---|---|---|
呼び出し | JSON tool_calls
|
テキスト <tool> センチネル |
パラメータ | スキーマ検証済みJSON | 自由形式JSON |
戻り値 |
role="tool" メッセージ |
プロンプト内 <tool>...</tool>
|
💡 まとめ
DianJin-OCR-R1は推論とツール連携により、LVLMの汎用性と専門OCRモデルの精度を巧妙に組み合わせている。わずか1024サンプルの訓練データで大幅な性能向上を達成し、専門モデルの低コスト反復により継続的な改善が可能だ。
OCRタスクにおける幻覚問題に悩むエンジニアにとって、この手法は実用的で検証可能なソリューションを提供する。vLLMベースの実装により、本番環境での展開も現実的だ。
この記事が参考になったら、ぜひ「いいね」やコメントをお願いします!🚀
Discussion