Dicklesworthstone/franken_ocr
Pure-Rust, CPU-only OCR engine for Baidu Unlimited-OCR (a DeepSeek-OCR-derived 3B MoE VLM). Five-model zoo, custom int8 kernels, no ML framework, no Python, no GPU.
franken_ocr – BaiduのUnlimited-OCRおよび関連モデル向け純Rust CPU専用OCR
何であるか – franken_ocr(バイナリ focr)は、CPU上で完全に動作するRustライブラリ + CLIです。手作業で移植された複数のビジョン・ランゲージモデルを実行します。デフォルトモデルはBaiduのUnlimited-OCRで、強力なドキュメント解析モデルです。追加モデルには表の処理(GOT-OCR2)、画像説明/VQA(SmolVLM2)、チャート抽出(OneChart)、光学楽譜認識(Polyphonic-TrOMR)があります。Python、CUDA、FFI、GPUは一切不要です。推論スタックは単一のメモリ安全なRustバイナリに完全に収容されています。
主な機能
| 機能 | 重要性 |
|---|---|
| 1つのポータブルバイナリ | macOS(Intel/Apple-Silicon)、Linux(x86-64/ARM64)、Windows(x86-64/ARM64)向け13–17 MiBの実行可能ファイル。外部ランタイム不要。CIランナー、エッジボックス、組み込みエージェントに簡単に配布可能。 |
| オフライン推論 | focr pullでモデルアーティファクト(~/.cache/franken_ocr/models下に保存)をダウンロード後、すべてのOCR処理は完全にローカルで実行されます。ネットワーク通信は不要です。 |
| Rust API | OcrEngineを提供し、同期的・ブロッキング呼び出しをサポート。非同期やFFIを扱わずに、RustプログラムにOCRを直接埋め込むことができます。 |
| ネイティブPDF処理 | PDFは純Rustコードでインプロセスにラスタライズされ、ページ回転を尊重し、2ページのスプレッドを分割できます。 |
| マルチページ・構造化出力 | --multi-pageで<PAGE>区切りの単一ドキュメントを生成;--jsonでバウンディングボックス付きJSONを返す;--extract-figuresでチャート/写真をMarkdownと共に保存。 |
| モデルズーロ | focr modelsで5つの即時実行可能なモデルを一覧表示。各モデルにはカスタムで形状最適化されたカーネルが用意されており、汎用MLフレームワークのオーバーヘッドを排除。 |
| Int8加速カーネル | 手作業で書かれたSIMDカーネル(AVX-512-VNNI、AVX-VNNI、AVX2、Apple SDOT/SMMLAなど)により、int8量子化アーティファクトの処理速度がスカラ参照の約3倍に。 |
| 決定論的・エージェント対応出力 | 「ロボットモード」ではNDJSONイベント(楽譜固有のstaffイベントを含む)をストリーム出力し、安定した終了コードを提供。自律エージェントに適しています。 |
| 自己テスト・信頼性 | focr robot selftestでint8カーネルがホストCPU上でスカラオラクルとビット単位で同一結果を出力することを検証。リリース準備度スクリプトとパフォーマンスレッジがリポジトリに含まれます。 |
| メモリ安全なRust | #![forbid(unsafe_code)]を全範囲に適用(SIMD島は審査済みのみ);大容量アーティファクト用にオプションのmmap読み込みをサポート。 |
クイックスタート(READMEから)
# バイナリのインストール(OSを検出、SHA-256を検証)
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/franken_ocr/main/install.sh | bash
# デフォルトのUnlimited-OCR重み(約4 GB)を取得
focr pull
# 1枚の画像をMarkdownにOCR
focr ocr page.png
# 構造化JSON(バウンディングボックス付き)を取得
focr ocr page.png --json -o page.json
# 専用モデルを使用(例:表)
focr pull got-ocr2
focr ocr --model got-ocr2.int8.focrq --task tables table.png
モデルをキャッシュした後は、すべてのコマンドがオフラインで動作します。
アーキテクチャの概要
- 入力層 – PNG/JPG、ラスタライズされたPDFページ、画像バッチ、楽譜スキャンを受信。
- モデルルーティング –
--taskフラグまたは明示的な--modelパスに基づき、適切な手作業移植モデルにディスパッチ。 - ランタイムコア(
OcrEngine) – 単一のモデルインスタンスを保持。重みは一度だけ読み込み、微小なSQLiteライクストア(fsqlite)でテレメトリを記録。 - CPU実行 – モデルごとに固定形状のRustカーネルを記述。SIMDディスパッチにより最適なISA(x86ではAVX-512-VNNI、AVX-VNNI、AVX2、スカラ;ARMではLLVM autovecまたはApple SDOT/SMMLA)を選択。Int8カーネルは、精度を保つために大部分のレイヤーを高精度BF16で維持しつつ、フィードフォワードネットワークを加速。
- 出力層 – Markdown、レイアウトボックス付きJSON、MusicXML(OMR用)、NDJSONロボットイベントを生成。
プロジェクトの健全性とライセンス
- バージョン – v0.8.0(主要OS/アーキテクチャ向けバイナリリリース)。デフォルトのUnlimited-OCRアーティファクトはv0.7.0のint8チェックポイントにピン止め。20ページのコーパスでCER予算0.193(平均)を満たし、ハードページ終了テストも通過。
- 安全性 –
unsafeは審査済みSIMDカーネル以外では禁止。コードベースは完全なメモリ安全を目標としています。 - ライセンス – MIT(
LICENSEを参照)。 - リリース証明 – リポジトリにはパフォーマンスレッジ、パリティゲートテスト、ファズコーパス、各リリースを認証する「ガントレット」スコアカードを生成するスクリプトが含まれます。
誰が使うべきか?
- GPU不要の軽量OCRコンポーネントが必要な開発者。Rustサービスに埋め込むか、単一バイナリにコンパイル可能。
- Python + CUDAのインストールが現実的でないCI/自動化パイプライン。
- インターネット接続なしでドキュメントOCRを実行しなければならないエッジまたはオフラインデバイス(例:ラップトップ、CIランナー、IoTボックス)。
- 構造化OCR出力をロボットNDJSONストリームで消費するエージェント。
- 純RustのOMRソリューションを探している音楽テック愛好家。
まとめ
franken_ocrは、Baiduのビジョン・ランゲージモデルの厳選セット向けに、生産環境対応のCPU専用OCRスタックを、メモリ安全なRust実装で提供します。決定論的カーネル、オフライン動作、豊富なリリース準備ツールの重視により、重いPython/CUDAエコシステムなしで信頼性の高いOCRが必要なすべての人にとって、堅実な選択肢です。
関連
- Dispatch
- Dispatch
- プロジェクト
- プロジェクト
- プロジェクト