Nativní DLL adaptér RapidOCR
HPDFRapidOCRRecognition zpřístupňuje in-process IHPDFOCREngine postavený na HotPDFRapidOCR.dll, se stejným veřejným API v buildách Delphi, C++Builder a Windows FPC/Lazarus Win32 a Win64
DLL provádí CPU ONNX inferenci přímo nad snímky paměti a inicializované modely uchovává, dokud se neuvolní interface enginu; runtime nasazení tvoří odpovídající nativní DLL a kompatibilní lokální modely se slovníkem
Stávající procesní adaptér Pythonu zůstává dostupný s původními přetíženími továrních funkcí
Továrna a volby
function HPDFCreateRapidOCRDLLOCREngine(const LibraryPath,
ModelDirectory: string): IHPDFOCREngine; overload;
function HPDFCreateRapidOCRDLLOCREngine(const LibraryPath,
ModelDirectory: string; const Options: THPDFRapidOCRDLLOptions): IHPDFOCREngine; overload;
THPDFRapidOCRDLLOptions = record
DetectionModel: string;
RecognitionModel: string;
ClassificationModel: string;
CharacterDictionary: string;
UseAngleClassifier: Boolean;
RightToLeft: Boolean;
Threads: Integer;
MaxPixels: Integer;
TimeoutMilliseconds: Cardinal;
class function Default: THPDFRapidOCRDLLOptions; static;
class function ForLanguage(const Language: string): THPDFRapidOCRDLLOptions; static;
end;
Volby inicializujte přes THPDFRapidOCRDLLOptions.Default; výchozí hodnoty používají následující lokální soubory
| Pole | Výchozí | Význam |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | Detekční model DB |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Kompatibilní CTC rozpoznávací model PP-OCRv3 nebo PP-OCRv4 |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Volitelný model orientace textu |
CharacterDictionary | ppocr_keys_v1.txt | Slovník UTF-8 bez BOM v pořadí znaků modelu |
UseAngleClassifier | True | Při vypnutí není klasifikační model vyžadován ani inicializován |
RightToLeft | False | Řadí detekované boxy zprava doleva v rámci vodorovných řádků; zapíná ho arabský preset |
Threads | 1 | Počet ONNX CPU vláken od 1 do 64, omezený počtem logických procesorů |
MaxPixels | 16777216 | Limit vstupních pixelů, od 1 do 67,108,864 |
TimeoutMilliseconds | 60000 | Kooperativní deadline rozpoznávání, od 1 do 3,600,000 milisekund |
Relativní názvy souborů se řeší vůči ModelDirectory; absolutní cesty mohou vybrat samostatně připravené soubory
Továrna před inicializací modelů ověří dostupnost souborů, volby, vyžadované exporty a verzi ABI; neplatná konfigurace vyvolá EArgumentException a selhání načtení modelů EInvalidOperation s nativní diagnostikou
Inicializace modelů probíhá v tovární funkci a nepočítá se do deadline rozpoznávání; počty tříd slovníku musí odpovídat rozpoznávacímu modelu a samotná shoda počtů tříd neznamená, že je pořadí znaků nebo předzpracování kompatibilní
Dodávaná pipeline používá DB detekci s maximální detekční stranou 1,024 pixelů a 50 pixely bílého odsazení; rozpoznávač přijímá kompatibilní NCHW modely s pevnou vstupní výškou 32 nebo 48 a pro dynamickou výšku používá 48
Rozpoznávání zachovává poměr stran u modelů s dynamickou šířkou a normalizuje vycpané vstupy s minimální šířkou 320; model s pevnou šířkou omezí šířku změněného cropu, což může zkomprimovat dlouhou textovou řádku
Klasifikace úhlů zachovává poměr stran cropu v rámci šířky vstupu modelu a nepoužité pixely vyplňuje normalizovanými nulami; crop se otočí o 180 stupňů jen tehdy, když skóre vzhůru nohama přesáhne 0.9, takže slabé predikce směru nepřeklopí krátký text
Slovník musí odpovídat pořadí znaků modelu a počtu výstupních tříd; zakončení řádků CRLF ve slovníku se přijímají, UTF-8 BOM se odmítá
Pokud model obsahuje znaková metadata, továrna ověří také každou položku slovníku a její pořadí; velikost slovníku sama o sobě nestačí
Čínština, ruština a běžné jazyky
THPDFRapidOCRDLLOptions.ForLanguage vybere rozpoznávací model a odpovídající slovník pod lokálním adresářem modelů, přičemž zachová sdílené výchozí hodnoty detektoru, klasifikátoru, vláken, pixelů i timeoutu
Metoda přijímá aliasy jazyků nerozlišující velikost písmen, mění podtržítka na pomlčky a ořeže okolní mezery; prázdný nebo nepodporovaný tag vyvolá EArgumentException před načtením modelů
| Adresář profilu | Jazyky | Běžně přijímané aliasy |
|---|---|---|
ch | Zjednodušená čínština a angličtina | zh, zh-CN, zh-Hans, chi_sim |
chinese_cht | Tradiční čínština | zh-TW, zh-HK, zh-Hant, chi_tra |
en | Angličtina | en, en-US, en-GB, eng |
latin | Francouzština, němčina, španělština, portugalština, italština, nizozemština a turečtina | fr, de, es, pt-BR, it, nl, tr |
japan | Japonština | ja, ja-JP, jpn |
korean | Korejština | ko, ko-KR, kor |
cyrillic | Ruština, ukrajinština, bulharština a běloruština | ru, ru-RU, rus, uk, bg, be |
arabic | Arabština, perština a urdština | ar, fa, ur, ara, fas, urd |
devanagari | Hindština, marátština a nepálština | hi, mr, ne, hin, mar, nep |
Každý profil používá <profile>/recognition.onnx a <profile>/dictionary.txt; názvy profilů se přijímají přímo a rozpoznané regionální aliasy jsou explicitně definované, nikoli odvozené z libovolné předpony
Vybrané sady modelů před nasazením nainstalujte provisioning helperem se zamčenými hashemi SHA256
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All nainstaluje všech devět profilů; -SkipClassifier vynechá volitelný klasifikátor, v takovém případě při vytváření enginu nastavte UseAngleClassifier := False
Helper ověří zamčené hashe SHA256 a nainstaluje sdílený vícejazyčný detektor a klasifikátor pod kořenovými názvy souborů používanými presetem Default; rozpoznávání běží offline a chybějící modely nikdy automaticky nestahuje
Jazyk enginu volte pro každou stránku nebo region zvlášť; jeden engine jazyk automaticky nedetekuje ani neslučuje samostatné rozpoznávače pro různá písma
Zamčené balíčky používají kompatibilní modely PP-OCRv3 a PP-OCRv4; přesnost rozpoznávání závisí na modelu, fontu, rozlišení a cropu a latinský model si i na čistém vstupu může plést diakritiku jako ñ
Novější modely PP-OCRv5 mohou vyžadovat novější ONNX Runtime než statické knihovny použité při buildu DLL; nepodporovaný formát modelu selže při inicializaci s diagnostikou
Detekční modely musí přijmout jediný obrazový tensor float32 a vyrobit mapu pravděpodobností float32 ve tvaru [1, 1, H, W] na vstupním rozlišení po změně velikosti; nekompatibilní typy, dimenze, nefinite hodnoty nebo pravděpodobnosti mimo [0, 1] o více než čtyři machine epsilony float32 selžou s diagnostikou, dřív než se použijí výsledky detekce
Drobné zaokrouhlovací chyby sigmoidu v rámci té tolerance se před prahováním a skórováním kontur přichytí do [0, 1], takže validní modely si zachovají své běžné detekční chování
Příklad pro čínštinu
uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;
procedure AddNativeRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Models: THPDFRapidOCRDLLOptions;
Layer: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Models := THPDFRapidOCRDLLOptions.ForLanguage('zh-CN');
Models.UseAngleClassifier := False;
Engine := HPDFCreateRapidOCRDLLOCREngine(
'C:\OCR\Win64\HotPDFRapidOCR.dll', 'C:\OCR\models', Models);
Layer := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
raise Exception.Create('Native RapidOCR text layer was not added');
end;
Interface enginu si mezi požadavky ponechte, abyste znovu použili jeho modely; použijte DLL odpovídající architektuře volající aplikace a její závislosti dodávejte vedle ní nebo ve standardních adresářích Windows loaderu
Příklad pro ruštinu
procedure AddRussianRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Models: THPDFRapidOCRDLLOptions;
Layer: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Models := THPDFRapidOCRDLLOptions.ForLanguage('ru-RU');
Engine := HPDFCreateRapidOCRDLLOCREngine(
'C:\OCR\Win64\HotPDFRapidOCR.dll', 'C:\OCR\models', Models);
Layer := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
raise Exception.Create('Russian RapidOCR text layer was not added');
end;
ru, ru-RU a rus vyberou stejný rozpoznávací model a slovník cyrillic
Výsledky a životní cyklus
Adaptér zkopíruje aktuální bitmapu do nezávislého top-down BGR snímku; rozměry a pixelový rozpočet kontroluje před alokací a vypůjčenou bitmapu nemění
Nativní pipeline emituje jeden výsledek na rozpoznanou textovou řádku, s hranicemi v pixelech původního obrázku a průměrnou confidence znaků; každá řádka spotřebuje jednu pozici v MaxWords a nativní baseline se neposkytuje
Detekované boxy následují pořadí čtení po vodorovných řádcích, defaultně zleva doprava a při zapnutém RightToLeft zprava doleva; arabský preset tuto volbu zapíná
Klasifikace úhlů koriguje jednotlivé textové croppy; neurčuje orientaci celé stránky ani neřadí samostatné detekční boxy otočené stránky do logického pořadí čtení
Rozpoznaný text zůstává v logickém pořadí Unicode modelu; adaptér arabské řetězce automaticky neobrací a nepoužívá bidirectionální shaping
Adaptér validuje UTF-8, řídicí znaky Unicode, hranice, confidence a limit MaxTextCodeUnits požadavku, s tvrdým stropem textu na 1,048,576 jednotek UTF-16; doplňkové znaky spotřebují dvě jednotky
Prázdná stránka projde úspěšně s prázdným polem výsledků; selhání vymaže částečné výsledky a publikování prohledávatelného PDF si zachovává stávající chování atomické transakce stránek
Volání na stejném enginu se serializují; čekání na zámek enginu kontroluje zrušení a deadline rozpoznávání každých 25 milisekund
Nativní callbacky kontrolují zrušení a deadline před i po detekci, klasifikaci a každé rozpoznané řádce; jednotlivé volání ONNX inference nelze vynuceně přerušit, takže zrušení se může vrátit až po dokončení aktuální fáze
Limity vstupu a textu ohraničují alokace adaptéru a přijímaný výstup, ale nekladou tvrdý strop na paměť modelu, detekce, cropu ani inference
Sestavení a ABI
Native/RapidOCR obsahuje C++ most, kompatibilní rozpoznávač modelů, verzovaná C header, export definici a CMake projekt; připravte kompatibilní CPU síťové zdroje zpřístupňující DbNet, AngleNet a OcrUtils, plus odpovídající knihovny ONNX Runtime a OpenCV
Použijte Windows MSVC s C++17, Windows SDK a CMake 3.20 nebo novější; výchozí build používá static release CRT, který musí odpovídat připraveným knihovnám
& tools/Build-HotPDFRapidOCR.ps1 `
-NativeSourceDirectory C:/OCR/native-sources `
-OnnxRuntimeDirectory C:/OCR/onnxruntime/windows-x64 `
-OpenCVDirectory C:/OCR/opencv/x64/vc16/staticlib `
-Platform Win64
OnnxRuntimeDirectory musí obsahovat OnnxRuntimeConfig.cmake a OpenCVDirectory musí mířit na konfiguraci knihoven pro konkrétní architekturu; pro 32bitovou DLL vyberte Win32 a odpovídající x86 knihovny
Build helper zapisuje do Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory a -Generator mohou přepsat umístění buildu a generator Visual Studia
Most zachytává C++ výjimky a zpřístupňuje ABI verzi 1 přes HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize a HPDFRapidOCRDestroy; všechna volání používají cdecl, 32bitové statusové hodnoty a explicitní délky UTF-8 v bajtech
ABI verze 1 definuje také volitelný export HPDFRapidOCRSetReadingDirection; adaptér ho vyžaduje jen při zapnutém RightToLeft, takže stávající DLL mohou dál obsluhovat požadavky zleva doprava
Callbacky si text půjčují jen na dobu volání; adaptér zvalidovaný text zkopíruje před návratem a destruktor enginu zničí modely před uvolněním DLL
Validace
S Python balíčkem onnx a nativním buildem BUILD_TESTING spusťte python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, abyste přes ABI DLL zkontrolovali validní prázdný výstup, neplatné ranky tensorů, kanály a typy, nesouhlasící prostorové dimenze a neplatné pravděpodobnosti; více cest runneru zvaliduje obě architektury v jednom vyvolání
Přidejte -RapidOCRLanguageModelDirectory a jeden či oba parametry nativní DLL knihovny do Delphi nebo FPC runneru adaptérů, abyste zvalidovali všechny nainstalované presety na vzorcích v čínštině, ruštině, japonštině, korejštině, běžných latinských jazycích, arabštině a hindštině; ruština a tradiční čínština navíc procházejí uložením prohledávatelného PDF, reloadem, extrakcí textu a porovnáním pixelů
Delphi a FPC runnery adaptérů testují perzistentní životní cyklus modelů, rozložení BGR řádků, Unicode a doplňkové znaky, kontroly ABI, neplatné výsledky, rozpočty, kooperativní zrušení, serializované čekání na zámek a úklid
Do Tests/Delphi/Run-TesseractRecognitionTests.ps1 nebo Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 dodávejte -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library a -RapidOCRNativeModelDirectory pro reálnou validaci modelů, prázdné stránky, práci s poškozeným modelem, rozpoznávání angličtiny a čínštiny a round-tripy prohledávatelného PDF s nezměněnými pixely vykreslení
Pro vykreslování stránek, mapování Unicode textu do PDF, seskupování optional content a omezení shody viz Searchable OCR Text Layers