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

PoleVýchozíVýznam
DetectionModelch_PP-OCRv3_det_infer.onnxDetekční model DB
RecognitionModelch_PP-OCRv3_rec_infer.onnxKompatibilní CTC rozpoznávací model PP-OCRv3 nebo PP-OCRv4
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxVolitelný model orientace textu
CharacterDictionaryppocr_keys_v1.txtSlovník UTF-8 bez BOM v pořadí znaků modelu
UseAngleClassifierTruePři vypnutí není klasifikační model vyžadován ani inicializován
RightToLeftFalseŘadí detekované boxy zprava doleva v rámci vodorovných řádků; zapíná ho arabský preset
Threads1Počet ONNX CPU vláken od 1 do 64, omezený počtem logických procesorů
MaxPixels16777216Limit vstupních pixelů, od 1 do 67,108,864
TimeoutMilliseconds60000Kooperativní 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ář profiluJazykyBěžně přijímané aliasy
chZjednodušená čínština a angličtinazh, zh-CN, zh-Hans, chi_sim
chinese_chtTradiční čínštinazh-TW, zh-HK, zh-Hant, chi_tra
enAngličtinaen, en-US, en-GB, eng
latinFrancouzština, němčina, španělština, portugalština, italština, nizozemština a turečtinafr, de, es, pt-BR, it, nl, tr
japanJaponštinaja, ja-JP, jpn
koreanKorejštinako, ko-KR, kor
cyrillicRuština, ukrajinština, bulharština a běloruštinaru, ru-RU, rus, uk, bg, be
arabicArabština, perština a urdštinaar, fa, ur, ara, fas, urd
devanagariHindština, marátština a nepálštinahi, 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