Adapter natywnej biblioteki DLL RapidOCR
HPDFRapidOCRRecognition wystawia działający w ramach procesu IHPDFOCREngine oparty na HotPDFRapidOCR.dll, z tym samym publicznym API w kompilacjach Delphi, C++Builder oraz Windows FPC/Lazarus Win32 i Win64
Biblioteka DLL wykonuje wnioskowanie ONNX na CPU bezpośrednio na snapshotach pamięci i trzyma zainicjalizowane modele do momentu zwolnienia interfejsu silnika; wdrożenie w czasie działania to pasująca natywna biblioteka DLL plus kompatybilne lokalne modele i słownik
Istniejący procesowy adapter Python pozostaje dostępny ze swoimi oryginalnymi przeciążeniami fabryk
Fabryka i opcje
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;
Zainicjuj opcje przez THPDFRapidOCRDLLOptions.Default; wartości domyślne korzystają z następujących lokalnych plików
| Pole | Domyślnie | Znaczenie |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | Model detekcji DB |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Kompatybilny z PP-OCRv3 lub PP-OCRv4 model rozpoznawania CTC |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Opcjonalny model orientacji tekstu |
CharacterDictionary | ppocr_keys_v1.txt | Słownik UTF-8 bez BOM, w kolejności znaków modelu |
UseAngleClassifier | True | Gdy wyłączone, model klasyfikacji nie jest wymagany ani inicjalizowany |
RightToLeft | False | Porządkuje wykryte ramki od prawej do lewej w poziomych wierszach; włączany przez preset arabski |
Threads | 1 | Liczba wątków CPU ONNX od 1 do 64, ograniczona do liczby procesorów logicznych |
MaxPixels | 16777216 | Limit pikseli wejścia, od 1 do 67 108 864 |
TimeoutMilliseconds | 60000 | Kooperatywny deadline rozpoznawania, od 1 do 3 600 000 milisekund |
Względne nazwy plików są rozwiązywane względem ModelDirectory; ścieżki bezwzględne mogą wskazywać pliki przygotowane osobno
Fabryka sprawdza dostępność plików, opcje, wymagane eksporty i wersję ABI, zanim zainicjalizuje modele; nieprawidłowa konfiguracja podnosi EArgumentException, a porażki ładowania modeli podnoszą EInvalidOperation z natywną diagnostyką
Inicjalizacja modeli odbywa się w fabryce i nie wchodzi do deadline'u rozpoznawania; liczby klas słownika muszą pasować do modelu rozpoznawania, a same identyczne liczby klas nie przesądzają, że kolejność znaków albo preprocessing są kompatybilne
Dostarczany potok używa detekcji DB z maksymalnym bokiem detekcji 1024 piksele i 50 pikselami białego paddingu; rozpoznawacz przyjmuje kompatybilne modele NCHW o stałej wysokości wejścia 32 albo 48, a dla wysokości dynamicznej przyjmuje 48
Rozpoznawanie zachowuje proporcje dla modeli o dynamicznej szerokości i normalizuje wejścia z paddingiem do minimalnej szerokości 320; model o stałej szerokości ogranicza szerokość przeskalowanego wycinka, co może ścisnąć długi wiersz tekstu
Klasyfikacja kątowa zachowuje proporcje wycinka w ramach szerokości wejścia swojego modelu i wypełnia niewykorzystane piksele znormalizowanymi zerami; wycinek obraca się o 180 stopni dopiero, gdy ocena do góry nogami przekracza 0,9, dzięki czemu słabe predykcje kierunku nie odwracają krótkiego tekstu
Słownik musi pasować do kolejności znaków modelu i liczby klas wyjścia; końce linii CRLF w słowniku są akceptowane, ale BOM UTF-8 jest odrzucany
Gdy model osadza metadane znaków, fabryka weryfikuje też każdy wpis słownika i jego kolejność; sam rozmiar słownika nie wystarcza
Chiński, rosyjski i popularne języki
THPDFRapidOCRDLLOptions.ForLanguage wybiera model rozpoznawania i pasujący słownik pod lokalnym katalogiem modeli, zachowując współdzielone wartości domyślne detektora, klasyfikatora, wątków, pikseli i timeoutu
Metoda przyjmuje aliasy języków bez rozróżniania wielkości liter, zamienia podkreślniki na myślniki i ucina białe znaki na brzegach; pusty albo niewspierany tag podnosi EArgumentException, zanim modele zostaną załadowane
| Katalog profilu | Języki | Popularne akceptowane aliasy |
|---|---|---|
ch | Chiński uproszczony i angielski | zh, zh-CN, zh-Hans, chi_sim |
chinese_cht | Chiński tradycyjny | zh-TW, zh-HK, zh-Hant, chi_tra |
en | Angielski | en, en-US, en-GB, eng |
latin | Francuski, niemiecki, hiszpański, portugalski, włoski, niderlandzki i turecki | fr, de, es, pt-BR, it, nl, tr |
japan | Japoński | ja, ja-JP, jpn |
korean | Koreański | ko, ko-KR, kor |
cyrillic | Rosyjski, ukraiński, bułgarski i białoruski | ru, ru-RU, rus, uk, bg, be |
arabic | Arabski, perski i urdu | ar, fa, ur, ara, fas, urd |
devanagari | Hindi, marathi i nepalski | hi, mr, ne, hin, mar, nep |
Każdy profil używa <profile>/recognition.onnx i <profile>/dictionary.txt; nazwy profili są przyjmowane wprost, a rozpoznane aliasy regionalne są jawnie zdefiniowane, a nie wywnioskowane z dowolnego prefiksu
Wybrane zestawy modeli zainstaluj przed wdrożeniem helperem przygotowującym z przypiętymi hashami SHA256
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All instaluje wszystkie dziewięć profili; -SkipClassifier pomija opcjonalny klasyfikator — wtedy ustaw UseAngleClassifier := False przy tworzeniu silnika
Helper weryfikuje przypięte hashe SHA256 i instaluje współdzielony wielojęzyczny detektor i klasyfikator pod nazwami bazowymi używanymi przez Default; rozpoznawanie działa offline i nigdy nie pobiera brakujących modeli automatycznie
Język silnika wybieraj dla każdej strony albo regionu; jeden silnik nie wykrywa języka automatycznie ani nie łączy osobnych rozpoznawaczy dla różnych pism
Przypięte pakiety używają kompatybilnych modeli PP-OCRv3 i PP-OCRv4; dokładność rozpoznawania zależy od modelu, fontu, rozdzielczości i wycinka, a model łaciński może mylić znaki diakrytyczne, takie jak ñ, nawet na czystym wejściu
Nowsze modele PP-OCRv5 mogą wymagać nowszego ONNX Runtime niż biblioteki statyczne użyte do zbudowania biblioteki DLL; niewspierany format modelu kończy inicjalizację porażką z diagnostyką
Modele detekcji muszą akceptować pojedynczy tensor obrazu float32 i produkować mapę prawdopodobieństwa float32 o kształcie [1, 1, H, W] w przeskalowanej rozdzielczości wejścia; niekompatybilne typy, wymiary, wartości nieskończone albo prawdopodobieństwa poza [0, 1] o więcej niż cztery epsylony maszynowe float32 kończą się porażką z diagnostyką, zanim wyniki detekcji zostaną użyte
Drobne błędy zaokrągleń sigmoidy w tej tolerancji są przycinane do [0, 1] przed progowaniem i ocenianiem konturów, więc poprawne modele mogą zachować swoje normalne zachowanie detekcji
Przykład dla chińskiego
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;
Trzymaj interfejs silnika między żądaniami, żeby reużywać jego modeli; użyj biblioteki DLL pasującej do architektury aplikacji wywołującej i dostarcz jej zależności obok niej albo w standardowych katalogach loadera Windows
Przykład dla rosyjskiego
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 i rus wybierają ten sam model rozpoznawania i słownik cyrillic
Wyniki i czas życia
Adapter kopiuje bieżącą bitmapę do niezależnego snapshotu BGR od góry do dołu; sprawdza wymiary i budżet pikseli przed alokacją i nie modyfikuje pożyczonej bitmapy
Natywny potok emituje jeden wynik na rozpoznaną linię tekstu, z pikselowymi granicami w oryginalnym obrazie i średnią pewnością znaków; każda linia zużywa jedno miejsce MaxWords, a natywna linia bazowa nie jest dostarczana
Wykryte ramki podążają za kolejnością czytania poziomych wierszy — domyślnie od lewej do prawej, a od prawej do lewej przy włączonym RightToLeft; preset arabski włącza tę opcję
Klasyfikacja kątowa poprawia pojedyncze wycinki tekstu; nie rozstrzyga orientacji całej strony ani nie układa odwróconych do góry nogami, osobno wykrytych ramek strony w logiczną kolejność czytania
Rozpoznany tekst pozostaje w logicznej kolejności Unicode modelu; adapter nie odwraca automatycznie stringów arabskich ani nie stosuje kształtowania dwukierunkowego
Adapter waliduje UTF-8, znaki kontrolne Unicode, granice, pewność i limit MaxTextCodeUnits żądania, z twardym sufitem tekstu 1 048 576 jednostek UTF-16; znaki uzupełniające zużywają dwie jednostki
Pusta strona kończy się sukcesem z pustą tablicą wyników; porażka czyści częściowe wyniki, a publikacja przeszukiwalnego PDF zachowuje istniejące zachowanie atomowych transakcji stron
Wywołania na tym samym silniku są serializowane; oczekiwanie na blokadę silnika sprawdza anulowanie i deadline rozpoznawania co 25 milisekund
Natywne callbacki sprawdzają anulowanie i deadline'y przed i po detekcji, klasyfikacji i każdej rozpoznanej linii; pojedynczego wywołania wnioskowania ONNX nie da się wymusić przerwać, więc anulowanie może wrócić po zakończeniu bieżącego etapu
Limity wejścia i tekstu ograniczają alokacje adaptera i przyjmowane wyjście, ale nie nakładają twardego sufitu na pamięć modeli, detekcji, wycinków ani wnioskowania
Budowanie i ABI
Native/RapidOCR zawiera bridge C++, kompatybilny rozpoznawacz modeli, wersjonowany nagłówek C, definicję eksportów i projekt CMake; przygotuj kompatybilne źródła sieci CPU wystawiające DbNet, AngleNet i OcrUtils oraz pasujące biblioteki ONNX Runtime i OpenCV
Użyj Windows MSVC z C++17, Windows SDK i CMake 3.20 albo nowszym; domyślna kompilacja używa statycznego CRT release, który musi pasować do przygotowanych bibliotek
& 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 musi zawierać OnnxRuntimeConfig.cmake, a OpenCVDirectory musi wskazywać konfigurację bibliotek dla danej architektury; dla biblioteki DLL 32-bit wybierz Win32 i pasujące biblioteki x86
Helper budowania zapisuje Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory i -Generator mogą nadpisać miejsce budowy i generator Visual Studio
Bridge przechwytuje wyjątki C++ i wystawia ABI w wersji 1 przez HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize i HPDFRapidOCRDestroy; wszystko używa cdecl, 32-bitowych wartości statusów i jawnych długości w bajtach UTF-8
ABI w wersji 1 definiuje też opcjonalny eksport HPDFRapidOCRSetReadingDirection; adapter wymaga go tylko przy włączonym RightToLeft, więc istniejące biblioteki DLL dalej obsługują żądania od lewej do prawej
Callbacki pożyczają swój tekst tylko na czas wywołania; adapter kopiuje zwalidowany tekst przed powrotem, a destruktor silnika niszczy modele przed zwolnieniem biblioteki DLL
Walidacja
Z pakietem Python onnx i natywną kompilacją z BUILD_TESTING uruchom python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, żeby sprawdzić poprawne puste wyjście, nieprawidłowe rangi tensorów, kanały i typy, niedopasowane wymiary przestrzenne oraz nieprawidłowe prawdopodobieństwa przez ABI biblioteki DLL; wiele ścieżek runnerów może zwalidować obie architektury w jednym wywołaniu
Dodaj -RapidOCRLanguageModelDirectory i jeden albo oba parametry bibliotek natywnej DLL do runnera adapterów Delphi albo FPC, żeby zwalidować wszystkie zainstalowane presety na próbkach chińskich, rosyjskich, japońskich, koreańskich, popularnych języków łacińskich, arabskich i hindi; rosyjski i chiński tradycyjny przechodzą też zapis przeszukiwalnego PDF, ponowne załadowanie, ekstrakcję tekstu i porównanie pikseli
Runnery adapterów Delphi i FPC testują trwały czas życia modeli, układ wierszy BGR, znaki Unicode i uzupełniające, sprawdzenia ABI, nieprawidłowe wyniki, budżety, kooperatywne anulowanie, serializowane oczekiwanie na blokadę i sprzątanie
Podaj -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library i -RapidOCRNativeModelDirectory do Tests/Delphi/Run-TesseractRecognitionTests.ps1 albo Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1, aby przeprowadzić walidację na prawdziwych modelach, pustych stronach, obsłudze uszkodzonych modeli, rozpoznawaniu angielskiego i chińskiego oraz round-tripach przeszukiwalnego PDF z niezmienionymi renderowanymi pikselami
Zobacz Przeszukiwalne warstwy tekstu OCR, żeby poznać renderowanie stron, mapowanie tekstu Unicode w PDF, grupowanie w optional content i ograniczenia zgodności