RapidOCR native DLL адаптер
HPDFRapidOCRRecognition предоставя in-process IHPDFOCREngine, задвижван от HotPDFRapidOCR.dll, с един и същ публичен API в Delphi, C++Builder и Windows FPC/Lazarus Win32 и Win64 компилации
DLL-ът изпълнява CPU ONNX inference директно върху memory snapshot-и и запазва инициализираните модели, докато engine интерфейсът бъде освободен; runtime разгръщането се състои от съответстващия native DLL и съвместими локални модели и речник
Съществуващият Python process адаптер остава достъпен с оригиналните си фабрични претоварвания
Фабрика и options
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;
Инициализирайте options с THPDFRapidOCRDLLOptions.Default; стойностите по подразбиране използват следните локални файлове
| Field | Default | Meaning |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | DB detection модел |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Съвместим PP-OCRv3 или PP-OCRv4 CTC recognition модел |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Опционален модел за ориентация на текста |
CharacterDictionary | ppocr_keys_v1.txt | UTF-8 речник без BOM, в реда на символите на модела |
UseAngleClassifier | True | Когато е изключен, не се изисква и не се инициализира classification модел |
RightToLeft | False | Подрежда откритите кутии отдясно наляво в хоризонталните редове; включва се от арабската преднастройка |
Threads | 1 | Брой ONNX CPU нишки от 1 до 64, ограничен до броя логически процесори |
MaxPixels | 16777216 | Лимит на входните пиксели, от 1 до 67,108,864 |
TimeoutMilliseconds | 60000 | Кооперативен краен срок за разпознаване, от 1 до 3,600,000 милисекунди |
Релативните имена на файлове се тълкуват спрямо ModelDirectory; абсолютните пътища могат да избират отделно подготвени файлове
Фабриката проверява наличността на файловете, options, нужните export-и и ABI версията, преди да инициализира моделите; невалидна конфигурация хвърля EArgumentException, а провали при зареждане на моделите хвърлят EInvalidOperation с native диагностика
Инициализацията на моделите става във фабриката и е извън крайния срок за разпознаване; броят класове в речника трябва да съответства на recognition модела, а еднакъв брой класове сам по себе си не доказва, че редът на символите или предобработката са съвместими
Доставеният pipeline използва DB detection с максимална detection страна от 1,024 пиксела и 50 пиксела бяла подложка; recognizer-ът приема съвместими NCHW модели с фиксирана входна височина 32 или 48 и използва 48 при динамична височина
Разпознаването запазва съотношението страните за модели с динамична ширина и нормализира входовете с подложка при минимална ширина 320; модел с фиксирана ширина ограничава ширината на преоразмереното отсечение, което може да компресира дълъг текстов ред
Класификацията на ъглите запазва съотношението на страните на отсечението в рамките на входната широчина на модела си и запълва неизползваните пиксели с нормализирани нули; отсечение се обръща на 180 градуса само когато оценката за обърнатост надхвърли 0.9, което попречва слабите предсказания за посока да обърнат кратък текст
Речникът трябва да съответства на реда на символите на модела и на броя изходни класове; CRLF краята на редове в речника се приемат, но UTF-8 BOM се отхвърля
Когато моделът вгражда метаданни за символите, фабриката проверява и всеки запис в речника, и неговия ред; самият размер на речника не е достатъчен
Китайски, руски и често срещани езици
THPDFRapidOCRDLLOptions.ForLanguage избира recognition модел и съответстващ речник под локалната модельна директория, като запазва споделените стойности по подразбиране за detector, classifier, нишки, пиксели и timeout
Методът приема езикови псевдоними без значение на регистъра, сменя долните черти с тирета и отрязва околните интервали; празен или неподдържан tag хвърля EArgumentException, преди моделите да бъдат заредени
| Profile directory | Languages | Common accepted aliases |
|---|---|---|
ch | Опростен китайски и английски | zh, zh-CN, zh-Hans, chi_sim |
chinese_cht | Традиционен китайски | zh-TW, zh-HK, zh-Hant, chi_tra |
en | Английски | en, en-US, en-GB, eng |
latin | Френски, немски, испански, португалски, италиански, холандски и турски | fr, de, es, pt-BR, it, nl, tr |
japan | Японски | ja, ja-JP, jpn |
korean | Корейски | ko, ko-KR, kor |
cyrillic | Руски, украински, български и беларуски | ru, ru-RU, rus, uk, bg, be |
arabic | Арабски, персийски и урду | ar, fa, ur, ara, fas, urd |
devanagari | Хинди, маратхи и непалски | hi, mr, ne, hin, mar, nep |
Всеки profile използва <profile>/recognition.onnx и <profile>/dictionary.txt; имената на profile-ите се приемат директно, а разпознаваните регионални псевдоними са изрично дефинирани, а не отгатнати от произволен префикс
Инсталирайте избраните набори от модели преди разгръщането с помощния script със закачени SHA256 хешове
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All инсталира всичките девет profile-а; -SkipClassifier пропуска опционалния classifier, в който случай задайте UseAngleClassifier := False при създаване на engine
Помощният script проверява закачените SHA256 хешове и инсталира споделен мултиезиков detector и classifier под основните имена на файлове, използвани от Default; разпознаването работи офлайн и никога не тегли липсващи модели автоматично
Избирайте езика на engine-а за всяка страница или област; един engine не разпознава автоматично езика и не съчетава отделни recognizer-и за различни писмености
Закачените пакети използват съвместими PP-OCRv3 и PP-OCRv4 модели; точността на разпознаването зависи от модела, шрифта, резолюцията и отсечението, а латинският модел може да обърка диакритични знаци като ñ дори на чист вход
По-новите PP-OCRv5 модели може да изискват по-нов ONNX Runtime от статичните библиотеки, с които е компилиран DLL-ът; неподдържан модельен формат проваля инициализацията с диагностика
Detection моделите трябва да приемат един float32 image tensor и да произвеждат float32 карта на вероятностите с форма [1, 1, H, W] при размерът на входа след оразмеряването; несъвместими типове, размерности, не-крайни стойности или вероятности извън [0, 1] с повече от четири float32 машинни эпсилона се провалят с диагностика, преди резултатите от detection да се използват
Дребните грешки от закръгляне на sigmoid в този толеранс се ограничават до [0, 1] преди thresholding и оценката на контурите, така че валидните модели да запазят нормалното си detection поведение
Пример с китайски
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;
Запазете engine интерфейса между заявките, за да преизползвате моделите му; използвайте DLL, съответстващ на архитектурата на повикващото приложение, и подайте зависимостите му до него или в стандартните директории на Windows loader-а
Пример с руски
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 и rus избират един и същ cyrillic recognition модел и речник
Резултати и живот на обектите
Адаптерът копира текущия bitmap в независим top-down BGR snapshot; той проверява размерите и пикселния бюджет преди заделяне и не променя заетия bitmap
Нативният pipeline издава по един резултат за всеки разпознат текстов ред, с граници в пиксели на оригиналното изображение и средна confidence на символите; всеки ред консумира один слот от MaxWords, а native baseline не се подава
Откритите кутии следват реда на четене на хоризонталните редове — отляво надясно по подразбиране и отдясно наляво, когато RightToLeft е включен; арабската преднастройка включва тази опция
Класификацията на ъглите коригира отделни текстови отсечения; тя не определя ориентацията на цялата страница и не пренарежда отделните detection кутии на обърната страница в логическия ред на четене
Разпознатият текст остава в логическия Unicode ред на модела; адаптерът не обръща автоматично арабски низове и не прилага двупосочно оформяне
Адаптерът валидира UTF-8, Unicode control знаци, граници, confidence и лимита MaxTextCodeUnits на заявката, с твърд текстов таван от 1,048,576 UTF-16 единици; допълнителните знаци консумират по две единици
Празна страница приключва успешно с празен масив от резултати; провал изчиства частичните резултати, а публикуването на търсим PDF запазва съществуващото атомично поведение със странични транзакции
Извикванията на един и същ engine се сериализират; изчакването на engine заключването проверява отмяната и крайния срок за разпознаване на всеки 25 милисекунди
Нативните callback-и проверяват отмяната и крайните срокове преди и след detection, classification и всеки разпознат ред; отделно ONNX inference извикване не може да бъде прекъснато насила, така че отмяната може да се отчете след като текущият етап приключи
Входните и текстовите лимити ограничават заделянията на адаптера и приетия изход, но не налагат твърд таван върху паметта за модел, detection, отсечение или inference
Компилиране и ABI
Native/RapidOCR съдържа C++ bridge-а, съвместимия model recognizer, версиониран C header, export definition и CMake проекта; подгответе съвместими CPU мрежови източници, излагащи DbNet, AngleNet и OcrUtils, плюс съответстващи ONNX Runtime и OpenCV библиотеки
Използвайте Windows MSVC с C++17, Windows SDK и CMake 3.20 или по-нов; компилацията по подразбиране използва статичния release CRT, който трябва да съответства на подготвените библиотеки
& 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 трябва да съдържа OnnxRuntimeConfig.cmake, а OpenCVDirectory трябва да сочи към конфигурацията на библиотеките за съответната архитектура; изберете Win32 и съответните x86 библиотеки за 32-битов DLL
Помощният script за компилация записва Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory и -Generator могат да променят разположението на компилацията и Visual Studio generator-а
Bridge-ът прихваща C++ изключения и излага ABI версия 1 чрез HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize и HPDFRapidOCRDestroy; всички използват cdecl, 32-битови статусни стойности и изрични UTF-8 дължини в байтове
ABI версия 1 дефинира и опционалния export HPDFRapidOCRSetReadingDirection; адаптерът го изисква само когато RightToLeft е включен, така че съществуващи DLL-и могат да обслужват заявки отляво надясно
Callback-ите заемат текста само за времето на извикването; адаптерът копира валидирания текст, преди да се върне, а деструкторът на engine-а унищожава моделите, преди да разтовари DLL-а
Валидация
С Python пакета onnx и нативна компилация с BUILD_TESTING изпълнете python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, за да проверите валиден празен изход, невалидни tensor рангове, канали и типове, несъответстващи пространствени размерности и невалидни вероятности през DLL ABI-то; няколко runner пътя могат да валидират двете архитектури в едно извикване
Добавете -RapidOCRLanguageModelDirectory и един или двата параметъра за native DLL библиотеки към Delphi или FPC adapter runner-а, за да валидирате всички инсталирани преднастройки с китайски, руски, японски, корейски, често срещани латински, арабски и хинди примери; руският и традиционният китайски минават също и запазване на търсим PDF, презареждане, извличане на текст и сравнение на пиксели
Delphi и FPC adapter runner-ите тестват постоянството на моделите, BGR подредбата на редовете, Unicode и допълнителните знаци, ABI проверки, невалидни резултати, бюджети, кооперативна отмяна, сериализирано изчакване на заключването и почистването
Подайте -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library и -RapidOCRNativeModelDirectory на Tests/Delphi/Run-TesseractRecognitionTests.ps1 или Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 за валидация с истински модели, празни страници, обработка на повредени модели, разпознаване на английски и китайски и търсими PDF round-trip с непроменени рендерирани пиксели
Вижте Searchable OCR Text Layers за рендиране на страници, Unicode PDF text mapping, групиране в optional content и ограничения на съответствието