RapidOCR savųjų DLL adapteris

HPDFRapidOCRRecognition atskleidžia HotPDFRapidOCR.dll paremtą procese vykstantį IHPDFOCREngine su ta pačia viešąja API Delphi, C++Builder ir Windows FPC/Lazarus Win32 bei Win64 sudarymuose

DLL CPU ONNX išvadas atlieka tiesiai ant atminties momentinių kopijų ir laiko inicijuotuosius modelius, kol atlaisvinama variklio sąsaja; diegimas vykdymo metu susideda iš atitinkamosios savosios DLL ir suderinamų vietinių modelių bei žodyno

Esamasis Python proceso adapteris lieka prieinamas su savomis pirminėmis gamyklinėmis perkravomis

Gamykla ir parinktys

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;

Parinktis inicijuokite per THPDFRapidOCRDLLOptions.Default; numatymai naudoja šias vietines bylas

LaukasNumatymasReikšmė
DetectionModelch_PP-OCRv3_det_infer.onnxDB aptikimo modelis
RecognitionModelch_PP-OCRv3_rec_infer.onnxSuderinamasis PP-OCRv3 arba PP-OCRv4 CTC atpažinimo modelis
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxPapildomasis teksto orientacijos modelis
CharacterDictionaryppocr_keys_v1.txtUTF-8 žodynas be BOM, modelio simbolių tvarka
UseAngleClassifierTrueIšjungus klasifikavimo modelio nereikia ir jo neinicijuojama
RightToLeftFalseAptiktąsias dėžes horizontaliose eilutėse rikiuoja iš dešinės į kairę; įjungia arabų konfigūracija
Threads1ONNX CPU gijų skaičius nuo 1 iki 64, ribojamas loginių procesorių skaičiumi
MaxPixels16777216Įvesties taškų riba, nuo 1 iki 67 108 864
TimeoutMilliseconds60000Bendradarbiavimu paremtas atpažinimo terminas, nuo 1 iki 3 600 000 milisekundžių

Santykinieji bylų vardai sprendžiami ModelDirectory atžvilgiu; absoliutūs keliai gali parinkti atskirai paruoštas bylas

Gamykla prieš inicijuodama modelius patikrina bylų prieinamumą, parinktis, būtinas eksporto funkcijas ir ABI versiją; netinkama konfigūracija iškelia EArgumentException, o modelių įkėlimo nesėkmės — EInvalidOperation su savąja diagnostika

Modelių inicijavimas vyksta gamykloje ir yra už atpažinimo termino ribų; žodyno klasių skaičius turi atitikti atpažinimo modelį, o vienodas klasių skaičius savaime dar nereiškia, kad simbolių tvarka arba išankstinis apdorojimas suderinami

Pateikiamasis konvejeris naudoja DB aptikimą su ne didesne kaip 1 024 taškų aptikimo kraštine ir 50 taškų baltąja pagalvėle; atpažintuvas priima suderinamuosius NCHW modelius su fiksuotuoju 32 arba 48 taškų įvesties aukščiu, o dinaminiam aukščiui naudoja 48

Atpažinimas išlaiko kraštinių santykį dinaminio pločio modeliams ir normalizuoja pagalvėle papildytąją įvestį iki mažiausiojo 320 pločio; fiksuotojo pločio modelis riboja pakeistojo dydžio iškarpos plotį, kas gali suspausti ilgą teksto eilutę

Kampų klasifikavimas iškarpos kraštinių santykį išlaiko modelio įvesties pločio ribose, o nenaudojamuosius taškus užpildo normalizuotaisiais nuliais; iškarpa apverčiama 180 laipsnių tik kai apverstosios padėties įvertis viršija 0,9, tad silpnieji krypties spėjimai neapverčia trumpojo teksto

Žodynas turi atitikti modelio simbolių tvarką ir išvesties klasių skaičių; CRLF žodyno eilučių pabaigos priimamos, bet UTF-8 BOM atmetamas

Kai modelis turi įtaisytąsias simbolių metaduomenis, gamykla patikrina ir kiekvieną žodyno įrašą, ir jo tvarką; vien žodyno dydžio nepakanka

Kinų, rusų ir kitos įprastos kalbos

THPDFRapidOCRDLLOptions.ForLanguage po vietiniųjų modelių aplanku parinko atpažinimo modelį ir jam atitinkantįjį žodyną, išlaikydama bendruosius detektoriaus, klasifikatoriaus, gijų, taškų ir laiko limito numatymus

Metodas priima kalbų aliasus nepriklausomai nuo raidžių registro, pabraukimo ženklus keičia brūkšneliais ir nukerpa aplinkinius tarpus; tuščiasis arba nepalaikomasis alias prieš įkeliant modelius iškelia EArgumentException

Konfigūracijos aplankasKalbosĮprastai priimami aliasai
chSupaprastintoji kinų ir anglųzh, zh-CN, zh-Hans, chi_sim
chinese_chtTradicinė kinųzh-TW, zh-HK, zh-Hant, chi_tra
enAnglųen, en-US, en-GB, eng
latinPrancūzų, vokiečių, ispanų, portugalų, italų, olandų ir turkųfr, de, es, pt-BR, it, nl, tr
japanJaponųja, ja-JP, jpn
koreanKorėjiečiųko, ko-KR, kor
cyrillicRusų, ukrainiečių, bulgarų ir baltarusųru, ru-RU, rus, uk, bg, be
arabicArabų, persų ir urduar, fa, ur, ara, fas, urd
devanagariHindi, maratų ir nepalihi, mr, ne, hin, mar, nep

Kiekviena konfigūracija naudoja <profile>/recognition.onnx ir <profile>/dictionary.txt; konfigūracijų vardai priimami tiesiogiai, o atpažįstamieji regioniniai aliasai apibrėžti aiškiai, o ne išvedami pagal savavalį priešdėlį

Parinktąsias modelių rinkinius prieš diegimą įdiekite SHA256 užfiksuotąja paruošimo priemone

& tools/Install-RapidOCRModels.ps1 `
  -Destination C:/OCR/models `
  -Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari

-Language All įdiegia visas devynias konfigūracijas; -SkipClassifier praleidžia papildomąjį klasifikatorių, tuomet kurdami variklį nustatykite UseAngleClassifier := False

Pagalbinė priemonė tikrina užfiksuotąsias SHA256 maišas ir po Default naudojamaisiais pagrindiniais bylų vardais įdiegia bendrąjį daugiakalbį detektorių ir klasifikatorių; atpažinimas vyksta autonomiškai ir niekada automatiškai nesisiunčia trūkstamųjų modelių

Kiekvienam puslapiui arba sričiai pasirinkite variklio kalbą; vienas variklis kalbos nenustato automatiškai ir nesujungia atskirų atpažintuvų skirtingoms raštistoms

Užfiksuotieji paketai naudoja suderinamuosius PP-OCRv3 ir PP-OCRv4 modelius; atpažinimo tikslumas priklauso nuo modelio, šrifto, raiškos ir iškarpos, o lotynų modelis net ant švarios įvesties gali supainioti tokius diakritinius ženklus kaip ñ

Naujesnieji PP-OCRv5 modeliai gali reikalauti naujesnio ONNX Runtime, nei statinės bibliotekos, kuriomis sudaryta DLL; nepalaikomasis modelio formatas sužlugdo inicijavimą su diagnostika

Aptikimo modeliai turi priimti vieną float32 paveikslėlio tenzorių ir duoti float32 tikimybių žemėlapį, kurio forma [1, 1, H, W] pakeistojoje įvesties raiškoje; nesuderinami tipai, matmenys, baigtinės neesamos reikšmės arba tikimybės už [0, 1] ribų, viršijančios keturis float32 mašinos epsilonus, žlunga su diagnostika dar prieš naudojant aptikimo rezultatus

Mažosios sigmoid suapvalinimo paklaidos tos tolerancijos ribose prieš slenkstėjimą ir kontūrų vertinimą nukerpamos iki [0, 1], kad tinkami modeliai išlaikytų įprastą aptikimo elgseną

Kinų kalbos pavyzdys

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;

Variklio sąsają išlaikykite tarp užklausų, kad galėtumėte pakartotinai naudoti jo modelius; naudokite kviečiančiosios programos architektūrą atitinkančiąją DLL, o jos priklausomybes pateikite šalia jos arba standartiniuose Windows įkėliklio aplankuose

Rusų kalbos pavyzdys

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 ir rus parinko tą patį cyrillic atpažinimo modelį ir žodyną

Rezultatai ir gyvavimo laikas

Adapteris dabartinį bitmap nukopijuoja į nepriklausomąją iš viršaus žemyn einančiąją BGR momentinę kopiją; prieš išskyrimą jis patikrina matmenis ir taškų biudžetą bei nemodifikuoja skolintojo bitmap

Savasis konvejeris išduoda po vieną rezultatą kiekvienai atpažintajai teksto eilutei, su pirminio vaizdo taškų ribomis ir vidutiniuoju simbolių pasitikėjimu; kiekviena eilutė užima vieną MaxWords vietą, o savosios pagrindo linijos nepateikiama

Aptiktosios dėžės seka horizontaliąją eilučių skaitymo tvarką — pagal numatymą iš kairės į dešinę, o įjungus RightToLeft iš dešinės į kairę; šią parinktį įjungia arabų konfigūracija

Kampų klasifikavimas taiso atskirąsias teksto iškarpas; jis nenustato viso puslapio orientacijos ir apversto puslapio atskirąsias aptikimo dėžes į loginę skaitymo tvarką nesurikiuoja

Atpažintasis tekstas lieka modelio logineje Unicode tvarkoje; adapteris automatiškai neapverčia arabų eilučių ir netaiko dvikrypčio formavimo

Adapteris patikrina UTF-8, Unicode valdymo simbolius, ribas, pasitikėjimą ir užklausos MaxTextCodeUnits ribą, o kietoji teksto luba — 1 048 576 UTF-16 vienetų; papildomieji simboliai sunaudoja du vienetus

Tuščiasis puslapis baigiasi sėkmingai su tuščiuoju rezultatų masyvu; nesėkmė išvalo daliniuosius rezultatus, o paieškamojo PDF paskelbimas išlaiko esamąją atominę puslapių transakcijų elgseną

Kviečimai tam pačiam varikliui serijalizujami; laukdama variklio rakto sistema kas 25 milisekundes tikrina atšaukimą ir atpažinimo terminą

Savieji atgaliniai kvietimai atšaukimą ir terminus tikrina prieš aptikimą, klasifikavimą ir kiekvieną atpažintąją eilutę bei po jų; atskiro ONNX išvados kvietimo priverstinai nutraukti negalima, tad atšaukimas gali grįžti tik baigus dabartinįjį etapą

Įvesties ir teksto ribos apriboja adapterio išskyrimus ir priimtąją išvestį, bet nenumato kietosios modelio, aptikimo, iškarpos arba išvadų atminties lubos

Sudarymas ir ABI

Native/RapidOCR turi C++ tiltinę sąsają, suderinamąjį modelių atpažintuvą, versijuotąją C antraštę, eksportų apibrėžtį ir CMake projektą; paruoškite suderinamuosius CPU tinklų šaltinius, atskleidžiančius DbNet, AngleNet ir OcrUtils, taip pat atitinkamąsias ONNX Runtime ir OpenCV bibliotekas

Naudokite Windows MSVC su C++17, Windows SDK ir CMake 3.20 arba naujesniu; numatytasis sudarymas naudoja statinę releasinę CRT, kuri turi atitikti paruoštąsias bibliotekas

& 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 turi turėti OnnxRuntimeConfig.cmake, o OpenCVDirectory turi rodyti architektūrai būdingąją bibliotekų konfigūraciją; 32 bitų DLL pasirinkite Win32 ir atitinkamąsias x86 bibliotekas

Sudarymo pagalbinė priemonė rašo Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory ir -Generator gali pakeisti sudarymo vietą ir Visual Studio generatorių

Tiltinė sąsaja sugauna C++ išimtis ir per HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize ir HPDFRapidOCRDestroy atskleidžia ABI 1 versiją; visi jie naudoja cdecl, 32 bitų būsenų reikšmes ir aiškuosius UTF-8 baitų ilgius

ABI 1 versija taip pat apibrėžia papildomąjį HPDFRapidOCRSetReadingDirection eksportą; adapteris jo reikalauja tik įjungus RightToLeft, tad esamosios DLL vis tiek gali aptarnauti iš kairės į dešinę nukreiptus kviečimus

Atgaliniai kvietimai savąjį tekstą skolinas tik kvietimo metu; adapteris patikrintąjį tekstą nukopijuoja prieš grąžindamas, o variklio destruktorius sunaikina modelius dar prieš atlaisvindamas DLL

Patikrinimas

Su Python onnx paketu ir natyviuoju BUILD_TESTING sudarymu paleiskite python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, per DLL ABI patikrindami tinkamą tuščią išvestį, netinkamus tenzorių rangus, kanalus ir tipus, nesutampinančius erdvinius matmenis ir netinkamas tikimybes; keliais paleistuvės keliais abi architektūros galima patikrinti vienu iškvietimu

Į Delphi arba FPC adapterių paleistuvę pridėkite -RapidOCRLanguageModelDirectory ir vieną arba abu savųjų DLL bibliotekos parametrus, kad patikrintumėte visas įdiegtas konfigūracijas su kinų, rusų, japonų, korėjiečių, įprastųjų lotynų, arabų ir hindi įragais; rusų ir tradicinė kinų papildomai praeina paieškamojo PDF įrašymo, pakartotinio įkėlimo, teksto ištraukos ir taškų lyginimo patikras

Delphi ir FPC adapterių paleistuvės tikrina nuolatinį modelių gyvavimą, BGR eilučių išdėstymą, Unicode ir papildomuosius simbolius, ABI patikras, netinkamuosius rezultatus, biudžetus, bendradarbiavimu paremtą atšaukimą, serijalizuktąjį rakto laukimą ir sutvarkymą

Pateikę -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library ir -RapidOCRNativeModelDirectory Tests/Delphi/Run-TesseractRecognitionTests.ps1 arba Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1, patikrinsite tikruosius modelius, tuščiuosius puslapius, pažeistųjų modelių apdorojimą, anglų ir kinų atpažinimą bei paieškamojo PDF abipuses keliones su nepakitkusiais atvaizduotaisiais taškais

Apie puslapių atvaizdavimą, Unicode teksto atvaizdavimą PDF, papildomojo turinio grupavimą ir atitikties apribojimus žr. ieškomuosius OCR teksto sluoksnius