2026年3月7日土曜日

国会図書館のOCRに乗り換える。

以前作ったシステムで、依存関係が重いと思っていた。


Opus 4.6で評価





NDLOCR-Lite(Python版) vs あなたの実装(EasyOCR)

1. アーキテクチャ比較

項目あなたの実装 (EasyOCR)NDLOCR-Lite (Python版)
推論ランタイムPyTorch (~2GB+)ONNX Runtime (~50MB)
検出モデルCRAFTDEIMv2 (2025年, 最新)
認識モデルEasyOCR内蔵 LSTM/TransformerPARSeq × 3 (カスケード)
依存関係の重さ非常に重い (PyTorch + torchvision)軽い (onnxruntime + opencv-headless)
モデルサイズ~200MB+ (自動DL)~146MB (ONNX)
GPU対応PyTorch CUDAONNX Runtime CUDA (オプション)
文字セットEasyOCR内蔵 (en/ja)NDLmoji (国会図書館文字セット)





2. 技術的に重要な違い

依存関係の軽さが圧倒的に違う

NDLOCR-Liteのrequirements.txtを見ると:

onnxruntime==1.23.2
opencv-python-headless==4.11.0.86
numpy==2.2.2
pillow==12.1.1
PyYAML==6.0.1

PyTorch が一切不要です。EasyOCRはPyTorch + torchvision が必須で、これだけで2GB以上のインストールサイズになります。NDLOCR-Liteは ONNX Runtime のみで動作するため、環境構築が格段に簡単で軽量です。

モデルの世代が新しい

モデルEasyOCRNDLOCR-Lite
検出CRAFT (2019年)DEIMv2 (2025年, arXiv:2509.20787)
認識LSTM/Transformer (旧世代)PARSeq (2022年, arXiv:2207.06966)

DEIMv2は「Real-Time Object Detection Meets DINOv3」がベースで、CRAFTより5年以上新しいモデルです。PARSeqも「Permuted Autoregressive Sequence Models」で、EasyOCRの内蔵モデルより世代が新しいです。

カスケード認識が賢い

NDLOCR-Liteのソースコードを読むと、単純に3モデルを使い分けるだけでなく、フォールバック機構が実装されています:

  1. PARSeq-30で認識 → 結果が25文字以上なら → PARSeq-50にフォールバック
  2. PARSeq-50で認識 → 結果が45文字以上なら → PARSeq-100にフォールバック

これにより、文字数予測が外れた場合でも精度が担保されます。






3. あなたの用途(残高数値読み取り)に対する評価

NDLOCR-Lite Python版: 適合度 ★★★☆☆

前回のWeb版(★★☆☆☆)より評価を上げた理由:


利点詳細
PyTorch不要環境構築が劇的に簡単。N100等の低スペックマシンでもインストール容易
ONNX Runtimeは高速PyTorch推論より一般的に速い。CPU推論に最適化されている
Python統合が容易そのままPythonプロジェクトに組み込める
GPU対応onnxruntime-gpu で CUDA も使える
課題詳細
訓練データの不一致NDLmojiは日本の書籍・雑誌向け。ゲームUIの「mBTC0.71」は訓練分布外
DEIMv2が不要あなたは既にテンプレートマッチングで領域を特定済み。レイアウト検出は無駄なオーバーヘッド
文字セットの偏り英数字+通貨記号は含まれるが、主力は漢字・かな。数字認識に最適化されていない



これにより:

  • PyTorch依存を完全に排除(2GB+ → 50MB程度に軽量化)
  • 推論速度が向上(ONNX Runtimeの方がCPU推論で高速)
  • DEIMv2は使わない(テンプレートマッチングで十分)
  • PARSeq-30のみ使用(短い数字列には十分)
  • parse_balance_value() の後処理はそのまま維持






総合評価

評価軸EasyOCRNDLOCR-Lite全体NDLOCR-Lite Web版PARSeq単体利用
数値認識精度
環境構築の容易さ
推論速度 (CPU)
推論速度 (GPU)-
メモリ消費△ (~2GB+)○ (~200MB)○ (~146MB)◎ (~50MB)
Python統合
用途適合度★★★★★★★★★★★★☆


NDLOCR-Liteでの使われ方

NDLOCR-Liteでは、PARSeqを3つのサイズ違いで使い分けている:

モデル入力サイズ最大文字数用途
PARSeq-3016×256≤30文字短い行(見出し等)
PARSeq-5016×384≤50文字中程度の行
PARSeq-10016×768≤100文字長い行(本文等)

入力幅が異なるだけで、アーキテクチャは同じ。短い行に大きなモデルを使うと無駄が出るので、効率化のためにカスケード方式を採用している。



モデル年代役割
DEIMv22025年 (arXiv:2509.20787)レイアウト検出(テキスト行の矩形を見つける)
PARSeq2022年 (arXiv:2207.06966)テキスト認識(切り出した画像から文字を読む)


まとめ

  • 現在EasyOCRで問題なく動いているなら、無理に変える必要はない。
  • 環境構築の簡便さ・軽量さを重視するなら、NDLOCR-LiteのPARSeqモジュールだけをONNX Runtimeで使う方式は検討の価値がある。
  • NDLOCR-Liteは日本語文書OCRとしては非常に優秀だが、ゲーム画面の短い英数字読み取りという用途には設計思想が異なる。
  • 特にN100等の低スペック環境では、PyTorchを排除できるメリットは大きい。


0 件のコメント:

コメントを投稿

あいうえお