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
| Pole | Domyślnie | Znaczenie |
|---|---|---|
DetectionModel | ch_PP-OCRv4_det_mobile.onnx | Lokalny model detekcji |
RecognitionModel | ch_PP-OCRv4_rec_mobile.onnx | Lokalny model rozpoznawania |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_mobile.onnx | Wymagany tylko przy włączonej klasyfikacji kątowej |
CharacterDictionary | Pusty | Wykorzystuje metadane znaków osadzone w modelu rozpoznawania; podaj lokalny słownik, gdy model nie ma takich metadanych |
FontPath | Pusty | Jest rozwiązywany do %WINDIR%\Fonts\arial.ttf dla kontenera wyników RapidOCR |
UseAngleClassifier | True | Włącza klasyfikację kątową tekstu; gdy wyłączone, model klasyfikacji nie jest wymagany ani przekazywany |
IntraOpThreads | 1 | Wątki wewnątrzoperacyjne ONNX, od 1 do 64, ograniczone do liczby logicznych CPU workera |
InterOpThreads | 1 | Wątki międzyoperacyjne ONNX z tymi samymi limitami |
MaxPixels | 16777216 | Budżet pikseli wejścia, od 1 do 67 108 864 |
TimeoutMilliseconds | 60000 | Cał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