RapidOCR ローカルモデルアダプタ

キャッシュ済みのインプロセス ONNX 推論には、RapidOCR ネイティブ DLL アダプタを HPDFCreateRapidOCRDLLOCREngine と THPDFRapidOCRDLLOptions と組み合わせて使用してください

ネイティブアダプタは、簡体字中国語・繁体字中国語・英語・ラテン系言語・日本語・韓国語・ロシア語を含むキリル系言語・アラビア語系言語・デーヴァナーガリー系言語に対応した THPDFRapidOCRDLLOptions.ForLanguage プリセットを提供します

HPDFRapidOCRRecognition は、Delphi、C++Builder、FPC/Lazarus の Win32 / Win64 ビルドで IHPDFOCREngine を実装する Windows プロセスアダプタを提供します

Python に rapidocr と onnxruntime、同梱の tools/OCR/rapidocr_tsv.py ブリッジ、互換性のあるローカル ONNX モデルを用意してください。アダプタがパッケージをインストールしたり、モデル・辞書・フォントをダウンロードしたりすることはありません

Python は独立した隠しプロセスで動作するため、呼び出し側アプリケーションとアーキテクチャが異なっていても構いません。ただし ONNX Runtime パッケージは、その Python 自身のアーキテクチャに一致させてください

ファクトリオーバーロード

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; const Options: THPDFRapidOCROptions): IHPDFOCREngine; overload;

従来のタイムアウトオーバーロードは、既存のブリッジプロトコルとの互換性を保ったまま 3 つの既定 PP-OCRv4 モデルファイル名を使用します。構築時に実行ファイル・スクリプト・ディレクトリのパスを検証し、モデルの可用性はワーカー側で確認します

オプション付きオーバーロードは、アダプタを返す前に必要な全モデル・省略可能な辞書・ローカルフォントを検証します。ファイルの欠落や不正なオプションは、認識開始前に EArgumentException を発生させます

モデル・辞書・フォントの相対パスは ModelDirectory 基準で解決され、絶対パスなら別途用意したファイルを指せます

RapidOCR の検出・分類・CTC 認識パイプラインと互換性のあるモデルを使用してください。別の OCR パイプラインのモデルは前処理が異なる可能性があり、ONNX 形式という理由だけでは選択できません

言語別モデル選択

Python プロセスアダプタは引き続き明示的な THPDFRapidOCROptions パスを使用します。ForLanguage はネイティブ DLL 側のオプション record に属するもので、Python アダプタのメソッドではありません

ローカルの言語モデルと辞書は tools/Install-RapidOCRModels.ps1 -Destination C:/OCR/models -Language ch,cyrillic で用意します。9 つの言語プロファイルすべてが必要なら -Language All を選択してください

ヘルパーは固定された SHA256 ハッシュを検証し、各認識器を <profile>/recognition.onnx に、対応する <profile>/dictionary.txt と一緒に配置します。実行時の認識はオフラインのままで、自動ダウンロードは行いません

ロシア語には cyrillic/recognition.onnx と cyrillic/dictionary.txt を使用します。簡体字中国語は ch プロファイル、繁体字中国語は chinese_cht です

Models := THPDFRapidOCROptions.Default;
Models.DetectionModel := 'ch_PP-OCRv3_det_infer.onnx';
Models.RecognitionModel := 'cyrillic/recognition.onnx';
Models.CharacterDictionary := 'cyrillic/dictionary.txt';
Models.ClassificationModel := 'ch_ppocr_mobile_v2.0_cls_infer.onnx';

上記の検出器と分類器のルートファイル名は、プロビジョニングヘルパーの共有モデルと一致しています。対応する認識モデルと辞書はセットで指定し、別の文字体系が必要なページや領域には個別のエンジンを選択してください

オプションと既定値

THPDFRapidOCROptions = record
  DetectionModel: string;
  RecognitionModel: string;
  ClassificationModel: string;
  CharacterDictionary: string;
  FontPath: string;
  UseAngleClassifier: Boolean;
  IntraOpThreads: Integer;
  InterOpThreads: Integer;
  MaxPixels: Integer;
  TimeoutMilliseconds: Cardinal;
  class function Default: THPDFRapidOCROptions; static;
end;

フィールドを上書きする前に、THPDFRapidOCROptions.Default で record を初期化してください

FieldDefaultMeaning
DetectionModelch_PP-OCRv4_det_mobile.onnxローカル検出モデル
RecognitionModelch_PP-OCRv4_rec_mobile.onnxローカル認識モデル
ClassificationModelch_ppocr_mobile_v2.0_cls_mobile.onnx角度分類を有効化したときにのみ必要
CharacterDictionaryEmpty認識モデルに埋め込まれた文字メタデータを使用。モデルにそのメタデータがない場合はローカル辞書を指定
FontPathEmptyRapidOCR の結果コンテナのために %WINDIR%\Fonts\arial.ttf に解決
UseAngleClassifierTrueテキスト角度分類を有効化。無効の場合、分類モデルは不要で渡されません
IntraOpThreads1ONNX の intra-op スレッド数。1〜64、ワーカーの論理 CPU 数が上限
InterOpThreads1同じ上限を持つ ONNX の inter-op スレッド数
MaxPixels16777216入力ピクセル予算。1〜67,108,864
TimeoutMilliseconds60000リクエスト全体のデッドライン。1〜3,600,000 ミリ秒

ブリッジは全ステージで ONNX Runtime の CPU バックエンドを明示的に選択し、自動ダウンロードを無効化します。埋め込み文字辞書が欠けている場合は、用意したローカル CharacterDictionary が必要になります

モデルを明示的に選択する例

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddLocalRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Models: THPDFRapidOCROptions;
  Layer: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Models := THPDFRapidOCROptions.Default;
  Models.DetectionModel := 'PP-OCRv6_det_small.onnx';
  Models.RecognitionModel := 'PP-OCRv6_rec_small.onnx';
  Models.UseAngleClassifier := False;
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\models', Models);
  Layer := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
    raise Exception.Create('Local RapidOCR text layer was not added');
end;

結果、予算、キャンセル

リクエストごとに、借用したビットマップを専用の一時ディレクトリへシリアライズし、ローカル Python ワーカーを起動します。リクエスト完了時にはプロセスハンドルと一時ファイルを後始末します

オプション付きオーバーロードは、ビットマップのシリアライズ前に MaxPixels を検証します。ワーカーもモデルのロード前に入力寸法を確認し、リクエストの MaxWords と MaxTextCodeUnits の上限を受け取ります

ブリッジは文字座標を要求し、各文字のジオメトリ・confidence・テキストカバレッジを検証します。その上で、完全に認識された行を、元の内部空白と句読点を保ったまま、元画像ピクセル単位の外接境界と 0〜1 の範囲の平均 confidence とともに出力します

出力される各行は MaxWords スロットを 1 つ消費します。内部の空白は MaxTextCodeUnits に算入されます。行全体を 1 まとまりで公開することで、テキストレイヤーが文字間隔を単語間隔と取り違えるのを防ぎます

空白は認識器の行テキストからそのまま保たれます。検出が別々のボックスに分割したテキストは、引き続き空間的な単語ギャップの推定に依存します。また、外部の PDF リーダーは抽出時に繰り返し空白を復元したり詰めたりすることがあります

サロゲート文字は UTF-16 単位を 2 つ消費します。不正な座標・confidence・制御文字や予算の枯渇は認識を失敗させ、部分的な結果をクリアします

空のページは空の単語配列で成功します。ネイティブのベースラインは供給されないため、テキストレイヤーは既存のジオメトリフォールバックを使用します

キャンセル・タイムアウト・出力サイズは 25 ミリ秒ごとにポーリングされます。Windows ジョブがワーカーとインタプリタの子プロセスを包含し、終了時にはプロセスの後始末を最大 5 秒追加で待ちます

ApplyLoadedOCRTextLayer は、認識が成功した後に選択された全ページを原子的に公開します

TSV 出力は 64 MiB、診断出力は 1 MiB に制限されます。入出力の予算は、ONNX モデルや推論のメモリ使用量に対するハード上限ではありません

モデルの初期化はリクエストごとに新しい Python プロセスで行われ、デッドラインに含まれます

検証

共有の Delphi / FPC アダプタランナーは、モデルのプリフライト・カスタムパス・省略可能な分類・Unicode・予算・ワーカー障害・キャンセル・タイムアウトをカバーします。省略可能な RapidOCR パラメータを指定すると、実際の認識と検索可能 PDF のラウンドトリップ検証が有効になります

Tests/Delphi/Run-TesseractRecognitionTests.ps1 または Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 に -RapidOCRPython、-RapidOCRModelDirectory、-RapidOCRDetectionModel、-RapidOCRRecognitionModel を指定して実行してください

レンダリングオプション・Unicode PDF テキストマッピング・オプショナルコンテンツのグループ化・適合上の制限については、検索可能な OCR テキストレイヤーを参照してください