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

PoleDomyślnieZnaczenie
DetectionModelch_PP-OCRv3_det_infer.onnxModel detekcji DB
RecognitionModelch_PP-OCRv3_rec_infer.onnxKompatybilny z PP-OCRv3 lub PP-OCRv4 model rozpoznawania CTC
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxOpcjonalny model orientacji tekstu
CharacterDictionaryppocr_keys_v1.txtSłownik UTF-8 bez BOM, w kolejności znaków modelu
UseAngleClassifierTrueGdy wyłączone, model klasyfikacji nie jest wymagany ani inicjalizowany
RightToLeftFalsePorządkuje wykryte ramki od prawej do lewej w poziomych wierszach; włączany przez preset arabski
Threads1Liczba wątków CPU ONNX od 1 do 64, ograniczona do liczby procesorów logicznych
MaxPixels16777216Limit pikseli wejścia, od 1 do 67 108 864
TimeoutMilliseconds60000Kooperatywny 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 profiluJęzykiPopularne akceptowane aliasy
chChiński uproszczony i angielskizh, zh-CN, zh-Hans, chi_sim
chinese_chtChiński tradycyjnyzh-TW, zh-HK, zh-Hant, chi_tra
enAngielskien, en-US, en-GB, eng
latinFrancuski, niemiecki, hiszpański, portugalski, włoski, niderlandzki i tureckifr, de, es, pt-BR, it, nl, tr
japanJapońskija, ja-JP, jpn
koreanKoreańskiko, ko-KR, kor
cyrillicRosyjski, ukraiński, bułgarski i białoruskiru, ru-RU, rus, uk, bg, be
arabicArabski, perski i urduar, fa, ur, ara, fas, urd
devanagariHindi, marathi i nepalskihi, 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