RapidOCR 로컬 모델 어댑터

캐시된 in-process ONNX 추론이 필요하면 HPDFCreateRapidOCRDLLOCREngine과 THPDFRapidOCRDLLOptions과 함께 RapidOCR 네이티브 DLL 어댑터를 사용하십시오

네이티브 어댑터는 간체·번체 중국어, 영어, 라틴 문자 언어, 일본어, 한국어, 러시아어를 포함한 키릴 문자 언어, 아랍어권 언어, 데바나가리 문자 언어용 THPDFRapidOCRDLLOptions.ForLanguage 프리셋을 제공합니다

HPDFRapidOCRRecognition은 Delphi, C++Builder, FPC/Lazarus Win32 및 Win64 빌드에서 IHPDFOCREngine을 구현하는 Windows 프로세스 어댑터를 제공합니다

Python에는 rapidocr과 onnxruntime, 제공되는 tools/OCR/rapidocr_tsv.py bridge, 호환되는 로컬 ONNX 모델을 미리 준비해 둡니다. 어댑터는 패키지를 설치하거나 모델, 사전, 폰트를 다운로드하지 않습니다

Python은 별도의 숨은 프로세스로 실행되므로 아키텍처가 호출 애플리케이션과 달라도 되며, ONNX Runtime 패키지는 자기 Python 아키텍처와 맞아야 합니다

팩토리 overload

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; const Options: THPDFRapidOCROptions): IHPDFOCREngine; overload;

기존 timeout overload는 기존 bridge 프로토콜과 호환을 유지하며 세 개의 기본 PP-OCRv4 모델 파일 이름을 씁니다. 생성 시점에 실행 파일, script, 디렉터리 경로를 검사하고 모델 가용성은 worker에서 검사합니다

options overload는 어댑터를 반환하기 전에 필요한 모든 모델, 선택적 사전, 로컬 폰트를 검사합니다. 파일이 없거나 options가 잘못되면 인식이 시작되기 전에 EArgumentException이 발생합니다

모델, 사전, 폰트의 상대 경로는 ModelDirectory를 기준으로 해석되며, 절대 경로는 별도로 준비한 파일을 가리킬 수 있습니다

RapidOCR의 검출, 분류, CTC 인식 파이프라인과 호환되는 모델을 사용하십시오. 다른 OCR 파이프라인의 모델은 전처리가 다를 수 있으므로 ONNX 형식이라는 이유만으로 선택할 수 없습니다

언어별 모델 선택

Python 프로세스 어댑터는 명시적인 THPDFRapidOCROptions 경로를 계속 사용합니다. ForLanguage는 네이티브 DLL options record에 속하며 Python 어댑터 메서드가 아닙니다

tools/Install-RapidOCRModels.ps1 -Destination C:/OCR/models -Language ch,cyrillic으로 로컬 언어 모델과 사전을 준비하거나, 아홉 개 언어 프로파일 전부에는 -Language All을 고릅니다

헬퍼는 고정된 SHA256 해시를 검사하고 각 인식기를 <profile>/recognition.onnx와 짝이 되는 <profile>/dictionary.txt에 배치합니다. 런타임 인식은 자동 다운로드 없이 오프라인으로 유지됩니다

러시아어에는 cyrillic/recognition.onnx와 cyrillic/dictionary.txt를 쓰고, 간체 중국어는 ch 프로파일, 번체 중국어는 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';

위 검출기·분류기 루트 파일 이름은 프로비저닝 헬퍼의 공유 모델과 일치합니다. 짝이 맞는 인식 모델과 사전을 함께 지정하고, 다른 문자가 필요한 페이지나 영역에는 별도의 엔진을 고르십시오

Options와 기본값

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;

필드를 재정의하기 전에 THPDFRapidOCROptions.Default로 record를 초기화합니다

필드기본값의미
DetectionModelch_PP-OCRv4_det_mobile.onnx로컬 검출 모델입니다
RecognitionModelch_PP-OCRv4_rec_mobile.onnx로컬 인식 모델입니다
ClassificationModelch_ppocr_mobile_v2.0_cls_mobile.onnxangle classification을 켤 때만 필요합니다
CharacterDictionary비어 있음인식 모델에 내장된 문자 메타데이터를 사용합니다. 모델에 그 메타데이터가 없으면 로컬 사전을 지정합니다
FontPath비어 있음RapidOCR 결과 컨테이너용으로 %WINDIR%\Fonts\arial.ttf로 해석됩니다
UseAngleClassifierTrue텍스트 angle classification을 활성화합니다. 끄면 분류 모델이 필요하지도 전달되지도 않습니다
IntraOpThreads1ONNX intra-operation 스레드이며 1~64, worker의 논리 CPU 수가 상한입니다
InterOpThreads1같은 한도가 적용되는 ONNX inter-operation 스레드입니다
MaxPixels16777216입력 픽셀 예산이며 1~67,108,864입니다
TimeoutMilliseconds60000요청 전체 기한이며 1~3,600,000밀리초입니다

bridge는 모든 단계에서 ONNX Runtime CPU backend를 명시적으로 고르고 자동 다운로드를 끕니다. 내장 문자 사전이 없으면 준비된 로컬 CharacterDictionary가 필요합니다

모델을 명시적으로 고르는 예제

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;

결과, 예산, 취소

각 요청은 빌린 bitmap을 전용 임시 디렉터리로 직렬화하고, 로컬 Python worker를 시작하며, 요청이 끝나면 프로세스 handle과 임시 파일을 정리합니다

options overload는 bitmap 직렬화 전에 MaxPixels를 검사하고, worker도 모델을 불러오기 전에 입력 크기를 검사하며 요청의 MaxWords와 MaxTextCodeUnits 한도를 받습니다

bridge는 문자 좌표를 요청해 모든 문자의 지오메트리, 신뢰도, 텍스트 커버리지를 검증한 뒤, 완성된 인식 행마다 원본 내부 공백과 문장부호, 원본 이미지 픽셀 단위의 감싸는 경계, 0~1 범위의 평균 신뢰도를 담아 출력합니다

출력된 행 하나가 MaxWords 슬롯 하나를 소비합니다. 내부 공백은 MaxTextCodeUnits에 포함되며, 행 전체를 공개하면 text layer가 자간을 단어 간격으로 착각하는 일이 없습니다

간격은 인식기의 행 텍스트에서 그대로 유지됩니다. 검출이 별개 박스로 나눈 텍스트는 여전히 공간적 단어 간격 추론에 의존하고, 외부 PDF reader는 추출 중에 반복 공백을 재구성하거나 합칠 수 있습니다

보충 문자는 UTF-16 unit 두 개를 소비합니다. 잘못된 좌표, 신뢰도, 제어 문자, 예산 소진은 인식을 실패 처리하고 부분 결과를 지웁니다

빈 페이지는 빈 단어 배열로 성공합니다. 네이티브 baseline이 제공되지 않으므로 text layer는 기존 지오메트리 폴백을 씁니다

취소, timeout, 출력 크기는 25밀리초마다 폴링됩니다. Windows job이 worker와 interpreter 자식 프로세스를 담아 두고, 종료 시 프로세스 정리를 위해 최대 5초를 더 기다립니다

ApplyLoadedOCRTextLayer는 인식이 성공한 뒤 선택된 모든 페이지를 원자적으로 공개합니다

TSV 출력은 64MiB, 진단 출력은 1MiB로 제한됩니다. 입력·출력 예산이 ONNX 모델이나 추론 메모리 사용에 hard cap을 거는 것은 아닙니다

모델 초기화는 요청마다 새 Python 프로세스에서 일어나며 기한에 포함됩니다

검증

공유 Delphi·FPC 어댑터 runner는 모델 preflight, 사용자 지정 경로, 선택적 분류, Unicode, 예산, worker 실패, 취소, timeout을 다룹니다. 선택적 RapidOCR 파라미터를 지정하면 실제 인식과 검색 가능 PDF 왕복 검사가 활성화됩니다

Tests/Delphi/Run-TesseractRecognitionTests.ps1이나 Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1에 -RapidOCRPython, -RapidOCRModelDirectory, -RapidOCRDetectionModel, -RapidOCRRecognitionModel을 지정합니다

렌더링 options, Unicode PDF 텍스트 매핑, optional-content 그룹화, conformance 한도는 검색 가능한 OCR 텍스트 레이어를 보십시오