-
Notifications
You must be signed in to change notification settings - Fork 32
Description
概要
NDLOCR-Liteの公開日(2026/2/24)にM3 MacBook Air上でパフォーマンス検証を行い、以下の3つの改善ポイントを特定しました。
コード変更は最小限で、認識速度を 現状の約3倍以上 に改善できる見込みです。
1. PARSeq ONNXモデルの動的バッチ未対応(最大の改善余地)
問題
train/parseqcode/convert2onnx.py の35行目で dynamic_axes が指定されておらず、PARSeqモデルのバッチ次元が1に固定されています。
# 現在(L35)
model.to_onnx(onnx_path, dummyimg, do_constant_folding=True, opset_version=17)一方、同リポジトリのDEIMv2側(train/deimv2code/part2/tools/deployment/export_onnx.py L64-81)では正しく dynamic_axes が指定されています。
# DEIMv2のエクスポート(正しい例)
dynamic_axes = {
'images': {0: 'N', },
'orig_target_sizes': {0: 'N'}
}
torch.onnx.export(model, ..., dynamic_axes=dynamic_axes, ...)影響
1ページあたり約20行を認識する際、PARSeqの推論を20回個別に実行する必要があります。動的バッチに対応すれば1回の推論でまとめて処理でき、認識ステップが 5〜10倍高速化 する見込みです。
修正案
# convert2onnx.py L35を以下に変更
model.to_onnx(onnx_path, dummyimg, do_constant_folding=True, opset_version=17,
dynamic_axes={'images': {0: 'batch'}})3つのモデル(30文字/50文字/100文字)すべてで同様の修正が必要です。
2. ocr.py のモデル毎回再読み込み
問題
ocr.py の inference_on_detector() 関数(L108)が呼ばれるたびに get_detector(args) でDEIMモデルを再作成しています。
def inference_on_detector(args, inputname, npimage, outputpath, issaveimg=True):
detector = get_detector(args) # ← 毎ページで1.5秒のモデル読み込み--sourcedir で複数画像を処理する場合、ページ毎に不要なモデル再読み込みが発生します。
影響
モデル読み込みに約1.5秒かかるため、バッチ処理時に1ページあたり1.5秒の無駄が発生します。
修正案
process() 関数内で recognizer と同様にdetectorも事前に1回だけ作成し、process_detector() を使用する。
3. マルチスレッド並列認識の提案
問題
ONNX RuntimeはCPU推論時にGILを解放するため、同一セッションに対してマルチスレッドで並列推論が可能です。現在は process_cascade() 内で ThreadPoolExecutor を使用していますが、executor.map() の結果を即座に list() で取得しているため、実質的に逐次実行になっています。
実測結果(M3 MacBook Air、22行/ページ)
| スレッド数 | PARSeq推論時間 | 高速化率 |
|---|---|---|
| 1(現状) | 698ms | 1.00x |
| 2 | 491ms | 1.42x |
| 4 | 326ms | 2.14x |
| 8 | 276ms | 2.53x |
修正案
process_cascade() を修正し、各モデルの推論を ThreadPoolExecutor(max_workers=4) で並列実行する。
総合的な改善効果(実測値)
| 設定 | 1ページ平均 |
|---|---|
| 現状(未修正) | 2,300ms |
| #2 モデル再利用のみ | 1,140ms |
| #2 + #3 マルチスレッド | 715ms |
| #2 + #3 + #1 動的バッチ(推定) | 450〜500ms |
検証環境
- MacBook Air M3 16GB
- macOS Sequoia
- Python 3.12 / ONNX Runtime 1.24.2
- テスト素材: 九鬼周造「いきの構造」(角川文庫、縦書き300dpi)5ページ
素晴らしいツールの公開ありがとうございます。ご検討いただけますと幸いです。