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; стойностите по подразбиране използват следните локални файлове

FieldDefaultMeaning
DetectionModelch_PP-OCRv3_det_infer.onnxDB detection модел
RecognitionModelch_PP-OCRv3_rec_infer.onnxСъвместим PP-OCRv3 или PP-OCRv4 CTC recognition модел
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxОпционален модел за ориентация на текста
CharacterDictionaryppocr_keys_v1.txtUTF-8 речник без BOM, в реда на символите на модела
UseAngleClassifierTrueКогато е изключен, не се изисква и не се инициализира classification модел
RightToLeftFalseПодрежда откритите кутии отдясно наляво в хоризонталните редове; включва се от арабската преднастройка
Threads1Брой ONNX CPU нишки от 1 до 64, ограничен до броя логически процесори
MaxPixels16777216Лимит на входните пиксели, от 1 до 67,108,864
TimeoutMilliseconds60000Кооперативен краен срок за разпознаване, от 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 directoryLanguagesCommon 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 и ограничения на съответствието