Нативний DLL-адаптер RapidOCR
HPDFRapidOCRRecognition відкриває внутрішньопроцесний IHPDFOCREngine на основі HotPDFRapidOCR.dll з тим самим публічним API у збірках Delphi, C++Builder та Windows FPC/Lazarus Win32 і Win64
DLL виконує процесорний ONNX-вивід безпосередньо на знімках пам'яті та утримує ініціалізовані моделі, поки не звільнено інтерфейс рушія; розгортання під час виконання складається з відповідного нативного DLL і сумісних локальних моделей та словника
Наявний процесний адаптер Python залишається доступним зі своїми початковими перевантаженнями фабрики
Фабрика та опції
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;
Ініціалізуйте опції через THPDFRapidOCRDLLOptions.Default; усталені значення використовують такі локальні файли
| Поле | Типово | Значення |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | Модель виявлення DB |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Сумісна модель CTC-розпізнавання PP-OCRv3 або PP-OCRv4 |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Опційна модель орієнтації тексту |
CharacterDictionary | ppocr_keys_v1.txt | Словник UTF-8 без BOM у порядку символів моделі |
UseAngleClassifier | True | Коли вимкнено, модель класифікації не потрібна й не ініціалізується |
RightToLeft | False | Упорядковує виявлені рамки справа наліво всередині горизонтальних рядків; вмикається пресетом для арабської |
Threads | 1 | Кількість процесорних потоків ONNX від 1 до 64, обмежена кількістю логічних процесорів |
MaxPixels | 16777216 | Ліміт пікселів входу, від 1 до 67 108 864 |
TimeoutMilliseconds | 60000 | Кооперативний дедлайн розпізнавання, від 1 до 3 600 000 мілісекунд |
Відносні імена файлів розв'язуються відносно ModelDirectory; абсолютні шляхи можуть обирати окремо підготовлені файли
Фабрика перевіряє наявність файлів, опції, потрібні експорти та версію ABI перед ініціалізацією моделей; некоректна конфігурація викликає EArgumentException, а збої завантаження моделей — EInvalidOperation з нативною діагностикою
Ініціалізація моделей відбувається у фабриці та не входить у дедлайн розпізнавання; кількості класів словника мають збігатися з моделлю розпізнавання, і самі по собі однакові кількості класів ще не доводять сумісності порядку символів чи передобробки
Постачаний конвейєр використовує виявлення DB з максимальною стороною виявлення 1 024 пікселів та білим полем 50 пікселів; розпізнавач приймає сумісні моделі NCHW з фіксованою висотою входу 32 або 48 і використовує 48 для динамічної висоти
Розпізнавання зберігає пропорції для моделей динамічної ширини та нормалізує доповнені входи з мінімальною шириною 320; модель фіксованої ширини обмежує ширину масштабованого фрагмента, що може стиснути довгий текстовий рядок
Класифікація кутів зберігає пропорції фрагмента в межах ширини входу своєї моделі та заповнює невикористані пікселі нормалізованими нулями; фрагмент обертається на 180 градусів лише тоді, коли оцінка перевернутості перевищує 0,9, що не дає слабким передбаченням напрямку перегортати короткий текст
Словник має відповідати порядку символів моделі та кількості вихідних класів; закінчення рядків CRLF у словнику приймаються, але BOM UTF-8 відхиляється
Коли модель вбудовує метадані символів, фабрика також звіряє кожен запис словника та його порядок; одного лише розміру словника недостатньо
Китайська, російська та поширені мови
THPDFRapidOCRDLLOptions.ForLanguage обирає модель розпізнавання та відповідний словник під локальним каталогом моделей, зберігаючи спільні усталені значення детектора, класифікатора, потоків, пікселів і тайм-ауту
Метод приймає псевдоніми мов без урахування регістру, замінює підкреслення дефісами та обрізає навколишні пробіли; порожній або непідтримуваний тег викликає EArgumentException до завантаження моделей
| Каталог профілю | Мови | Поширені прийнятні псевдоніми |
|---|---|---|
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>/recognition.onnx і <profile>/dictionary.txt; назви профілів приймаються безпосередньо, а відомі регіональні псевдоніми визначено явно, а не виведено з довільного префікса
Установіть обрані набори моделей перед розгортанням за допомогою помічника підготовки з закріпленими хешами SHA256
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All встановлює всі дев'ять профілів; -SkipClassifier пропускає опційний класифікатор — у такому разі встановіть UseAngleClassifier := False під час створення рушія
Помічник звіряє закріплені хеші SHA256 і встановлює спільний багатомовний детектор та класифікатор під кореневими іменами файлів, які використовує Default; розпізнавання працює офлайн і ніколи не завантажує відсутні моделі автоматично
Обирайте мову рушія для кожної сторінки чи регіону; один рушій не визначає мову автоматично і не поєднує окремі розпізнавачі для різних писемностей
Закріплені пакети використовують сумісні моделі PP-OCRv3 і PP-OCRv4; точність розпізнавання залежить від моделі, шрифту, роздільності та фрагмента, а латинська модель може сплутати діакритику на кшталт ñ навіть на чистому вході
Новіші моделі PP-OCRv5 можуть вимагати новішого ONNX Runtime, ніж статичні бібліотеки, якими будується DLL; непідтримуваний формат моделі зазнає невдачі ініціалізації з діагностикою
Моделі виявлення мають приймати один тензор зображення float32 і створювати карту ймовірностей float32 форми [1, 1, H, W] у масштабованій вхідній роздільній здатності; несумісні типи, розміри, нескінченні значення чи ймовірності поза [0, 1] понад чотири машинні епсилони float32 завершуються з діагностикою до використання результатів виявлення
Дрібні помилки округлення сигмоїди в межах цього допуску обмежуються до [0, 1] перед порогуванням та оцінюванням контурів, тож коректні моделі можуть зберегти свою звичайну поведінку виявлення
Приклад для китайської
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;
Утримуйте інтерфейс рушія між запитами, щоб повторно використовувати його моделі; використовуйте DLL, що відповідає архітектурі застосунку, що викликає, і подайте його залежності поруч із ним або в стандартних каталогах завантажувача Windows
Приклад для російської
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
Результати та час життя
Адаптер копіює поточний бітмап у незалежний знімок BGR зверху вниз; він перевіряє розміри та бюджет пікселів перед виділенням пам'яті і не змінює позичений бітмап
Нативний конвейєр видає один результат на кожен розпізнаний текстовий рядок, з межами в пікселях початкового зображення та середньою довірою символів; кожен рядок витрачає один слот MaxWords, а нативна базова лінія не подається
Виявлені рамки слідують порядку читання горизонтальних рядків: типово зліва направо, а за увімкненого RightToLeft — справа наліво; пресет для арабської вмикає цю опцію
Класифікація кутів виправляє окремі текстові фрагменти; вона не визначає орієнтацію цілої сторінки і не перебудовує окремі рамки виявлення перевернутої сторінки в логічний порядок читання
Розпізнаний текст залишається в логічному порядку Unicode моделі; адаптер не обертає арабські рядки автоматично і не застосовує двонаправлене формування
Адаптер валідує UTF-8, керуючі символи Unicode, межі, довіру та ліміт MaxTextCodeUnits запиту з жорсткою стелею тексту в 1 048 576 одиниць UTF-16; додаткові символи витрачають дві одиниці
Порожня сторінка завершується успішно з порожнім масивом результатів; збій очищає часткові результати, а публікація пошукового PDF зберігає наявну атомарну транзакційну поведінку сторінок
Виклики на одному рушії серіалізуються; очікування блокування рушія перевіряє скасування та дедлайн розпізнавання кожні 25 мілісекунд
Нативні колбеки перевіряють скасування та дедлайни до і після виявлення, класифікації та кожного розпізнаного рядка; окремий виклик ONNX-виводу не можна примусово перервати, тож скасування може повернутися після завершення поточної стадії
Ліміти входу та тексту обмежують виділення пам'яті адаптера та прийнятий вивід, але не накладають жорсткої межі на пам'ять моделей, виявлення, фрагментів чи виведення
Збирання та ABI
Native/RapidOCR містить місток C++, сумісний розпізнавач моделей, версійований C-заголовок, визначення експортів і проєкт CMake; підготуйте сумісні процесорні мережеві джерела, що відкривають 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
Помічник збирання пише Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory і -Generator можуть перевизначити розміщення збирання та генератор Visual Studio
Місток перехоплює винятки C++ і відкриває ABI версії 1 через HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize і HPDFRapidOCRDestroy; усі вони використовують cdecl, 32-бітові значення статусів та явні довжини байтів UTF-8
ABI версії 1 також визначає опційний експорт HPDFRapidOCRSetReadingDirection; адаптер вимагає його лише за увімкненого RightToLeft, тож наявні DLL досі можуть обслуговувати запити зліва направо
Колбеки позичають свій текст лише на час виклику; адаптер копіює валідований текст перед поверненням, а деструктор рушія знищує моделі перед вивантаженням DLL
Валідація
З Python-пакетом onnx і нативною збіркою BUILD_TESTING запустіть python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, щоб перевірити крізь ABI DLL коректний порожній вивід, недійсні ранги тензорів, канали та типи, неспівпадіння просторових розмірів і недійсні ймовірності; кілька шляхів ранера можуть валідувати обидві архітектури за один виклик
Додайте -RapidOCRLanguageModelDirectory та один або обидва параметри нативної DLL-бібліотеки до ранера адаптерів Delphi чи FPC, щоб валідувати всі встановлені пресети на зразках китайської, російської, японської, корейської, поширених латинських мов, арабської та гінді; російська та традиційна китайська також проходять збереження пошукового PDF, перезавантаження, витягання тексту та порівняння пікселів
Ранери адаптерів Delphi та FPC перевіряють постійний час життя моделей, компонування рядків BGR, символи Unicode та додаткові, перевірки ABI, недійсні результати, бюджети, кооперативне скасування, серіалізоване очікування блокування та очищення
Подайте -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library і -RapidOCRNativeModelDirectory до Tests/Delphi/Run-TesseractRecognitionTests.ps1 або Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 заради справжньої валідації моделей, порожніх сторінок, обробки пошкоджених моделей, розпізнавання англійської та китайської і циклів пошукового PDF з незмінними відрендереними пікселями
Дивіться Пошукові шари тексту OCR, щоб дізнатися про рендеринг сторінок, відображення тексту PDF у Unicode, групування за необов'язковим вмістом та обмеження конформності