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;
原本的逾時多載仍與既有橋接協定相容,並使用三個預設的 PP-OCRv4 模型檔名;它會在建構時檢查執行檔、腳本與目錄路徑,並在工作程序中檢查模型可用性
選項多載會在回傳轉接器之前檢查每個必要模型、選用的字典與本地字型;檔案遺失或選項無效時,會在辨識開始前丟出 EArgumentException
模型、字典與字型的相對路徑以 ModelDirectory 為基準解析;絕對路徑則可指向另行備妥的檔案
請使用與 RapidOCR 的偵測、分類與 CTC 辨識 pipeline 相容的模型;來自其他 OCR pipeline 的模型可能需要不同的前處理,不能只因為它採用 ONNX 格式就入選
各語言的模型選擇
Python 程序轉接器仍使用明確的 THPDFRapidOCROptions 路徑;ForLanguage 屬於原生 DLL 的選項記錄,不是 Python 轉接器的方法
以 tools/Install-RapidOCRModels.ps1 -Destination C:/OCR/models -Language ch,cyrillic 備妥本地語言模型與字典,或選擇 -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 初始化記錄
| 欄位 | 預設 | 意義 |
|---|---|---|
DetectionModel | ch_PP-OCRv4_det_mobile.onnx | 本地偵測模型 |
RecognitionModel | ch_PP-OCRv4_rec_mobile.onnx | 本地辨識模型 |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_mobile.onnx | 只在啟用角度分類時才需要 |
CharacterDictionary | 空白 | 使用辨識模型內嵌的字元中繼資料;模型缺少該中繼資料時,請提供本地字典 |
FontPath | 空白 | 解析為 %WINDIR%\Fonts\arial.ttf,供 RapidOCR 的結果容器使用 |
UseAngleClassifier | True | 啟用文字角度分類;停用時不需要也不會傳入分類模型 |
IntraOpThreads | 1 | ONNX 操作內執行緒,1 到 64,上限為工作程序的邏輯 CPU 數 |
InterOpThreads | 1 | ONNX 操作間執行緒,限制相同 |
MaxPixels | 16777216 | 輸入像素預算,1 到 67,108,864 |
TimeoutMilliseconds | 60000 | 請求總期限,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 上限
橋接腳本會要求字元座標,並驗證每個字元的幾何、信賴度與文字覆蓋範圍,然後發出每一行完整的辨識結果,附上原有的行內空格與標點、以原圖像素表示的包圍邊界,以及 0 到 1 的平均信賴度
每一行發出的結果消耗一個 MaxWords 名額;行內空格計入 MaxTextCodeUnits,整行發布可避免文字層把字母間距誤當成詞間距
空格保留自辨識器的行文字;被偵測拆成多個框的文字仍依賴空間上的詞間距推斷,外部 PDF 閱讀器在擷取時也可能重建或合併重複的空格
補充字元消耗兩個 UTF-16 單元;座標、信賴度或控制字元無效,或預算耗盡時,辨識即失敗並清除部分結果
空白頁面以空詞陣列成功傳回;由於沒有提供原生基線,文字層改用既有的幾何後備機制
取消、逾時與輸出大小每 25 毫秒輪詢一次;Windows job 物件會納入工作程序與任何直譯器子程序,終止時最多再等五秒讓程序清理完成
辨識成功後,ApplyLoadedOCRTextLayer 會以原子方式發布所有選取的頁面
TSV 輸出上限 64 MiB、診斷輸出上限 1 MiB;輸入與輸出預算不會對 ONNX 模型或推論記憶體用量設下硬上限
模型初始化在每個請求的新 Python 程序中進行,計入期限之內
驗證
共享的 Delphi 與 FPC 轉接器測試執行器涵蓋模型 preflight、自訂路徑、選用分類、Unicode、預算、工作程序失敗、取消與逾時;其選用的 RapidOCR 參數可啟用真實辨識與可搜尋 PDF 往返檢查
搭配 -RapidOCRPython、-RapidOCRModelDirectory、-RapidOCRDetectionModel 與 -RapidOCRRecognitionModel 使用 Tests/Delphi/Run-TesseractRecognitionTests.ps1 或 Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1
轉譯選項、Unicode PDF 文字對應、可選內容分組與合規限制請見 可搜尋 OCR 文字層