Adapter lokalnych modeli RapidOCR

Do buforowanego wnioskowania ONNX w ramach procesu użyj adaptera natywnej biblioteki DLL RapidOCR z HPDFCreateRapidOCRDLLOCREngine i THPDFRapidOCRDLLOptions

Adapter natywny dostarcza presetów THPDFRapidOCRDLLOptions.ForLanguage dla chińskiego uproszczonego i tradycyjnego, angielskiego, języków łacińskich, japońskiego, koreańskiego, języków cyrylicy (w tym rosyjskiego), języków arabskich i języków pisma dewanagari

HPDFRapidOCRRecognition dostarcza procesowy adapter dla Windows implementujący IHPDFOCREngine w kompilacjach Delphi, C++Builder oraz FPC/Lazarus Win32 i Win64

Przygotuj Python z pakietami rapidocr i onnxruntime, dostarczanym bridge'em tools/OCR/rapidocr_tsv.py oraz kompatybilnymi lokalnymi modelami ONNX; adapter nie instaluje pakietów ani nie pobiera modeli, słowników i fontów

Python działa w osobnym ukrytym procesie, więc jego architektura może różnić się od architektury aplikacji wywołującej; pakiet ONNX Runtime musi pasować do architektury tego Pythona

Przeciążenia fabryk

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; const Options: THPDFRapidOCROptions): IHPDFOCREngine; overload;

Oryginalne przeciążenie z timeoutem pozostaje kompatybilne z istniejącym protokołem bridge'a i używa trzech domyślnych nazw plików modeli PP-OCRv4; sprawdza ścieżki pliku wykonywalnego, skryptu i katalogu przy konstrukcji, a dostępność modeli sprawdza w workerze

Przeciążenie z opcjami sprawdza każdy wymagany model, opcjonalny słownik i lokalny font przed zwróceniem adaptera; brakujące pliki albo nieprawidłowe opcje podnoszą EArgumentException, zanim rozpoznawanie się zacznie

Względne ścieżki modeli, słowników i fontów są rozwiązywane względem ModelDirectory; ścieżki bezwzględne mogą wskazywać na pliki przygotowane osobno

Używaj modeli kompatybilnych z potokiem detekcji, klasyfikacji i rozpoznawania CTC RapidOCR; model z innego potoku OCR może wymagać innego preprocessingu i nie można go wybrać tylko dlatego, że ma format ONNX

Wybór modeli dla konkretnych języków

Adapter procesowy Python dalej używa jawnych ścieżek z THPDFRapidOCROptions; ForLanguage należy do rekordu opcji natywnej biblioteki DLL i nie jest metodą adaptera Pythona

Lokalne modele i słowniki języków przygotuj przez tools/Install-RapidOCRModels.ps1 -Destination C:/OCR/models -Language ch,cyrillic, albo wybierz -Language All, żeby dostać wszystkie dziewięć profili językowych

Helper weryfikuje przypięte hashe SHA256 i układa każdy rozpoznawacz w <profile>/recognition.onnx razem z pasującym <profile>/dictionary.txt; rozpoznawanie w czasie działania pozostaje offline, bez automatycznych pobrań

Dla rosyjskiego użyj cyrillic/recognition.onnx i cyrillic/dictionary.txt; chiński uproszczony korzysta z profilu ch, a tradycyjny z 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';

Nazwy bazowe detektora i klasyfikatora powyżej odpowiadają współdzielonym modelom helpera przygotowującego; dopasowany model rozpoznawania i słownik podawaj razem, a dla stron albo regionów potrzebujących innego pisma wybierz osobny silnik

Opcje i wartości domyślne

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;

Zainicjuj rekord przez THPDFRapidOCROptions.Default, zanim nadpiszesz pola

PoleDomyślnieZnaczenie
DetectionModelch_PP-OCRv4_det_mobile.onnxLokalny model detekcji
RecognitionModelch_PP-OCRv4_rec_mobile.onnxLokalny model rozpoznawania
ClassificationModelch_ppocr_mobile_v2.0_cls_mobile.onnxWymagany tylko przy włączonej klasyfikacji kątowej
CharacterDictionaryPustyWykorzystuje metadane znaków osadzone w modelu rozpoznawania; podaj lokalny słownik, gdy model nie ma takich metadanych
FontPathPustyJest rozwiązywany do %WINDIR%\Fonts\arial.ttf dla kontenera wyników RapidOCR
UseAngleClassifierTrueWłącza klasyfikację kątową tekstu; gdy wyłączone, model klasyfikacji nie jest wymagany ani przekazywany
IntraOpThreads1Wątki wewnątrzoperacyjne ONNX, od 1 do 64, ograniczone do liczby logicznych CPU workera
InterOpThreads1Wątki międzyoperacyjne ONNX z tymi samymi limitami
MaxPixels16777216Budżet pikseli wejścia, od 1 do 67 108 864
TimeoutMilliseconds60000Całkowity deadline żądania, od 1 do 3 600 000 milisekund

Bridge jawnie wybiera backend CPU ONNX Runtime dla wszystkich etapów i wyłącza automatyczne pobieranie; brak osadzonego słownika znaków wymaga przygotowanego lokalnego CharacterDictionary

Przykład z jawnie wybranymi modelami

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;

Wyniki, budżety i anulowanie

Każde żądanie serializuje pożyczoną bitmapę do prywatnego katalogu tymczasowego, startuje lokalnego workera Python i sprząta uchwyty procesu oraz pliki tymczasowe po zakończeniu żądania

Przeciążenie z opcjami sprawdza MaxPixels przed serializacją bitmapy; worker sprawdza też wymiary wejścia przed załadowaniem modeli i dostaje limity MaxWords i MaxTextCodeUnits żądania

Bridge żąda współrzędnych znaków i waliduje geometrię, pewność oraz pokrycie tekstem każdego znaku, po czym emituje każdą kompletną rozpoznaną linię z jej oryginalnymi wewnętrznymi spacjami i interpunkcją, obejmującymi granicami w pikselach oryginalnego obrazu oraz średnią pewnością w zakresie od 0 do 1

Każda wyemitowana linia zużywa jedno miejsce MaxWords; wewnętrzne spacje liczą się do MaxTextCodeUnits, a publikowanie całej linii zapobiega myleniu przez warstwę tekstu odstępów między literami z odstępami między wyrazami

Odstępy są zachowywane z tekstu linii rozpoznawacza; tekst, który detekcja podzieli na osobne ramki, nadal zależy od przestrzennego wnioskowania o przerwach między wyrazami, a zewnętrzne czytniki PDF mogą odtwarzać lub scalać powtórzone spacje podczas ekstrakcji

Znaki uzupełniające zużywają dwie jednostki UTF-16; nieprawidłowe współrzędne, pewność, znaki kontrolne albo wyczerpane budżety kończą rozpoznawanie porażką i czyszczą częściowe wyniki

Pusta strona kończy się sukcesem z pustą tablicą słów; natywna linia bazowa nie jest dostarczana, więc warstwa tekstu korzysta ze swojego istniejącego fallbacku geometrycznego

Anulowanie, timeout i rozmiary wyjścia są odpytywane co 25 milisekund; zadanie Windows obejmuje workera i ewentualne procesy potomne interpretera, a terminacja czeka do pięciu dodatkowych sekund na posprzątanie procesów

ApplyLoadedOCRTextLayer publikuje wszystkie wybrane strony atomowo po udanym rozpoznawaniu

Wyjście TSV jest ograniczone do 64 MiB, a wyjście diagnostyczne do 1 MiB; budżety wejścia i wyjścia nie nakładają twardego sufitu na zużycie pamięci przez modele ONNX ani wnioskowanie

Inicjalizacja modeli odbywa się w nowym procesie Python dla każdego żądania i wchodzi do deadline'u

Walidacja

Wspólne runnery adapterów Delphi i FPC pokrywają preflight modeli, własne ścieżki, opcjonalną klasyfikację, Unicode, budżety, porażkę workera, anulowanie i timeout; ich opcjonalne parametry RapidOCR włączają prawdziwe rozpoznawanie i sprawdzenia round-trip przeszukiwalnego PDF

Użyj Tests/Delphi/Run-TesseractRecognitionTests.ps1 albo Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 z -RapidOCRPython, -RapidOCRModelDirectory, -RapidOCRDetectionModel i -RapidOCRRecognitionModel

Zobacz Przeszukiwalne warstwy tekstu OCR, żeby poznać opcje renderowania, mapowanie tekstu Unicode w PDF, grupowanie w optional content i limity zgodności