🦔

🧠 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データセット D_{sr}/D_{tr}/D_{fr} = (i_i, q_i, a_i) から、推論チェーン r_i を生成:

r_i = \langle \texttt{think}, \texttt{tool}, \texttt{rethink} \rangle

ここで:

  • \texttt{<think></think>}: モデル自身による初回認識
  • \texttt{<tool></tool>}: 専門OCRツールの結果
  • \texttt{<rethink></rethink>}: 反省と最終判断

処理フロー

  1. Pass 1 (自己認識): VLMが <think>...</think> 内で独自にOCRを実行
  2. ツール呼び出し: <tool> トークンで専門OCRシステムへのハンドオフ
  3. 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. フォーマット報酬: 構造化出力の促進

    • 正確なタグ構造: 1.0
    • 不適切な構造: 0.0
  2. 精度報酬: 回答正確性の向上

    • 印章認識: 完全一致で1.0
    • 表認識: TEDS スコア
    • 数式認識: CDM + ボーナス0.5

訓練設定

  • SFT段階: 学習率 1.0 \times 10^{-5}、2エポック
  • RFT段階: 学習率 1.0 \times 10^{-6}、8ロールアウト、3エポック

🔧 実用的デプロイメント

OpenAI型関数呼び出しとの違い

項目 OpenAI型 DianJin型
呼び出し JSON tool_calls テキスト <tool> センチネル
パラメータ スキーマ検証済みJSON 自由形式JSON
戻り値 role="tool" メッセージ プロンプト内 <tool>...</tool>

💡 まとめ

DianJin-OCR-R1は推論とツール連携により、LVLMの汎用性と専門OCRモデルの精度を巧妙に組み合わせている。わずか1024サンプルの訓練データで大幅な性能向上を達成し、専門モデルの低コスト反復により継続的な改善が可能だ。

OCRタスクにおける幻覚問題に悩むエンジニアにとって、この手法は実用的で検証可能なソリューションを提供する。vLLMベースの実装により、本番環境での展開も現実的だ。


この記事が参考になったら、ぜひ「いいね」やコメントをお願いします!🚀

Discussion