푸터 콘텐츠로 바로가기
다른 구성 요소와 비교

패들 OCR과 테서랙트: 상세 OCR 비교

PaddleOCR은 최첨단 중국어 문자 인식 기능을 제공하지만, .NET 애플리케이션에서 이미지 하나를 처리하려면 5개의 NuGet 패키지를 설치해야 하고, 중국 Baidu 서버에 연결하는 비동기 모델 다운로드(약 100MB)가 필요하며, 이미지를 로드할 때마다 OpenCvSharp를 추가해야 하고, 처음 실행할 때 3~5초의 콜드 스타트 ​​시간이 소요됩니다. 이것이 바로 .NET 프로젝트에서 Python 우선 딥러닝 시스템을 사용하는 데 따르는 대가입니다. 중국어 문자(CJK) 처리량이 많고 정확도가 필수적인 작업이며 GPU 인프라가 이미 구축되어 있는 경우라면, 그 정도의 추가 비용은 감수할 가치가 있습니다. 그 외의 모든 것은 프로젝트에 전혀 필요하지 않았던 불필요한 비용입니다.

PaddleOCR 이해하기

PaddleOCR은 바이두가 자체 딥러닝 프레임워크인 PaddlePaddle을 기반으로 구축한 오픈소스 OCR 시스템입니다. 이 프로젝트는 Python 개발자를 위해 처음부터 설계되었으며 .NET 커뮤니티는 GitHub에서 Zhou Jie (sdcb)가 유지 관리하는 커뮤니티 래퍼 Sdcb.PaddleOCR를 통해 이를 액세스할 수 있습니다.

인식 파이프라인은 세 개의 신경망을 순차적으로 연결합니다. 첫 번째는 미분 가능한 이진화(DB)를 사용하여 텍스트 영역의 경계 상자를 식별하는 텍스트 감지 모델이고, 두 번째는 텍스트 방향을 판별하는 방향 분류기이며, 마지막은 감지된 영역의 픽셀을 문자열로 변환하는 합성곱 순환 신경망(CRNN)을 사용하는 인식 모델입니다. 각 네트워크는 별도의 모델 파일이며, 추론을 시작하기 전에 해당 파일이 디스크에 있어야 합니다.

주요 건축적 특징:

  • 다중 Install-Package: 코어 패키지(Sdcb.PaddleOCR), 플랫폼 런타임(Sdcb.PaddleInference.runtime.win64.mkl 또는 CUDA 해당 버전), 모델 다운로드 도우미(Sdcb.PaddleOCR.Models.Online) 및 이미지 로딩용 OpenCvSharp — 최소한 네 개의 패키지, OpenCvSharp 런타임을 분리할 경우 다섯 개
  • 모델 다운로드 필수: 모델은 번들로 제공되지 않습니다. 첫 사용 시 OnlineFullModels.ChineseV4.DownloadAsync()을 호출하며, 이는 Baidu가 제어하는 서버(bj.bcebos.com)에서 다운로드하고 배포 아티팩트에 ~100MB를 추가합니다.
  • 모든 이미지에 대해 OpenCV 종속성이 필요합니다. 파일 경로에서 직접 추론으로 연결되는 경로는 없습니다. 이미지는 ocr.Run(mat)에 전달되기 전에 OpenCvSharp Mat 객체로 로드되어야 합니다.
  • GPU 가속을 위해서는 CUDA/cuDNN 설정이 필요합니다. 광고된 성능을 구현하려면 NVIDIA 드라이버, CUDA 툴킷 11.8, cuDNN 8.6 이상, 그리고 별도의 GPU 런타임 NuGet 패키지가 필요하며, 환경별로 2~8시간의 설정 시간이 소요됩니다.
  • Python 우선 출시 주기: 새로운 PaddleOCR 모델 버전은 Python 버전으로 먼저 출시되고, .NET 래퍼 업데이트는 몇 주에서 몇 달 후에 제공됩니다.
  • 지원되는 언어 14개: 중국어 간체, 중국어 번체, 영어, 프랑스어, 독일어, 한국어, 일본어, 이탈리아어, 스페인어, 포르투갈어, 러시아어, 아랍어, 힌디어, 타밀어 — 지원 언어 수에는 한계가 있습니다.

해당 NuGet 패키지는 약 20만 건의 다운로드를 기록했습니다. 규모가 작아지면 Stack Overflow 답변 수가 줄어들고, 실제 운영 환경에서 검증된 보고서도 줄어들며, 경험을 바탕으로 질문에 답변할 수 있는 개발자 풀도 좁아집니다.

실제 적용 사례에서 3가지 모델 파이프라인

PaddleOCR의 모든 추론 호출은 세 개의 신경망을 순차적으로 실행합니다. 아래 코드는 개발자가 텍스트를 반환하기 전에 거치는 전체 설정 경로를 보여줍니다.

// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win

using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;

// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");

if (mat.Empty())
{
    throw new FileNotFoundException("Could not load image");
}

// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);

Console.WriteLine(result.Text);
// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win

using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;

// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");

if (mat.Empty())
{
    throw new FileNotFoundException("Could not load image");
}

// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);

Console.WriteLine(result.Text);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp

' Five packages required before this compiles:
' dotnet add package Sdcb.PaddleOCR
' dotnet add package Sdcb.PaddleOCR.Models.Online
' dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
' dotnet add package OpenCvSharp4
' dotnet add package OpenCvSharp4.runtime.win

' Async download from Baidu servers — blocks first run for 10-30 seconds
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()

' PaddleOcrAll bundles detection, classification, and recognition
Using ocr As New PaddleOcrAll(models) With {
    .AllowRotateDetection = True,
    .Enable180Classification = True
}

    ' OpenCV required — no file path shortcut
    Using mat As Mat = Cv2.ImRead("document.png")

        If mat.Empty() Then
            Throw New FileNotFoundException("Could not load image")
        End If

        ' Three neural networks fire in sequence
        Dim result As PaddleOcrResult = ocr.Run(mat)

        Console.WriteLine(result.Text)
    End Using
End Using
$vbLabelText   $csharpLabel

result.Regions 배열에는 각기 Text 문자열, Score 신뢰도 값, Rect 바운딩 박스를 가진 개별 텍스트 영역 객체가 포함되어 있습니다. 신뢰도를 기준으로 필터링하려면: result.Regions.Where(r => r.Score > 0.8). 영역 순서는 공간적인 것이며 읽기 순서가 보장되지는 않으므로 region.Rect.Center.Y 다음 region.Rect.Center.X로 정렬하는 것이 일반적인 패턴입니다.

IronOCR 이해하기

IronOCR 은 최적화된 Tesseract 5 LSTM 엔진을 기반으로 구축된 .NET 용 상용 OCR 라이브러리로, 기존 Tesseract에서 요구되는 구성 및 전처리 작업을 없애도록 설계되었습니다. 하나의 NuGet 패키지로 전체 런타임, 언어 모델, 네이티브 바이너리 및 전처리 파이프라인을 설치할 수 있습니다.

주요 특징:

  • 단일 패키지 배포: dotnet add package IronOcr로 모든 것을 설치합니다. 추가 런타임 패키지, 모델 다운로드, 네이티브 라이브러리 구성이 필요 없습니다.
  • 자동 전처리: 화질이 낮은 입력 영상에 대해 기울기 보정, 노이즈 제거, 대비 조정, 이진화 및 해상도 향상이 자동으로 적용됩니다. 필요한 경우 명시적 제어가 가능해야 합니다
  • 원시 PDF 지원: 스캔된 PDF는 input.LoadPdf()을 통해 직접 로드되며 제3자 변환 단계가 필요 없습니다.
  • NuGet을 통한 125개 이상의 언어: 각 언어 팩은 표준 NuGet 종속성 — dotnet add package IronOcr.Languages.ChineseSimplified — 모델 디렉토리 관리가 필요 없습니다.
  • 스레드 안전성 및 CPU 최적화: CUDA 또는 GPU 하드웨어 없이도 병렬 처리가 내장되어 있습니다.
  • SLA 기반 상업적 지원: 미국에 본사를 둔 Iron Software 상업적 지원을 제공합니다. 해당 제품은 커뮤니티에서 개발한 사이드 프로젝트가 아닙니다.
  • 영구 라이선스: $999 Lite / $1,499 Plus / $2,999 Professional — 한 번 결제, 무기한 실행, 페이지 당 요금 없음

기능 비교

기능 패들OCR(Sdcb) IronOCR
NuGet 패키지가 필요합니다. 4-5 1
모델 다운로드 필요 예 (~100MB, 바이두 서버) 아니요 (묶음 상품)
설정 시간 30~60분 5분
CJK 정확도 우수함 (95% 이상) 양호 (85-90%)
영어/라틴어 정확도 양호 (92-95%) 우수함(97-99%)
GPU 지원 예 (복잡한 CUDA 설정) CPU 최적화
네이티브 PDF 지원 아니요
지원되는 언어 14 125+
라이선스 Apache 2.0 (무료) 상업용 ($999+)
회사 설립 배경 중국 (바이두) 미국 (Iron Software)

상세 기능 비교

카테고리/특징 패들OCR(Sdcb) IronOCR
설정
NuGet 패키지 4-5 1
설치 시 모델 다운로드 필요함 포함됨
첫 시동 시 냉간 시동 3-5초 1초 미만
설치 시간 30~60분 5분 미만
OpenCV 종속성 필요함 None
언어 지원
지원되는 언어 14 125+
언어 설치 방법 모델 다운로드 NuGet 패키지
다국어 동시 순차적 모델 전환 예 (AddSecondaryLanguage)
CJK 정확도 우수함 좋음
라틴어/영어 정확도 좋음 우수함
입력 처리
이미지 파일 입력 OpenCvSharp Mat을 통해 직접 파일 경로
네이티브 PDF 입력 아니요
비밀번호로 보호된 PDF 아니요
스트림 입력 간접
바이트 배열 입력 간접
전처리
자동 전처리 아니요
디스큐 수동 내장형
디노이즈 수동 내장형
명암 대비 강화 수동 내장형
해상도 스케일링 수동 EnhanceResolution(300)
산출
전체 텍스트 문자열
지역별/단어별 결과 result.Regions result.Words, result.Lines
신뢰도 점수 영역 별 (region.Score) 단어 별 (word.Confidence)
경계 상자 region.Rect word.X, word.Y, word.Width, word.Height
검색 가능한 PDF 출력 아니요
hOCR 내보내기 아니요
성능
이미지당 CPU 사용량 300-500ms 150-300ms
이미지당 GPU 50-100ms (CUDA 필요) 해당 없음 (CPU 최적화)
메모리 사용량 500MB-1GB 100-200MB
배포 규모 300-500MB ~80MB
배포
Docker 기본 이미지 크기 약 1.5GB (CUDA 기본 사양 기준) 약 400MB
크로스 플랫폼 윈도우/리눅스 (일부) 윈도우, 리눅스, macOS
에어갭 배포 예 (사전 다운로드 모델) 예 (다운로드 필요 없음)
지원 및 라이선스
라이선스 유형 Apache 2.0 (무료) 영구 상업
상업적 지원 커뮤니티/ GitHub 네, SLA와 함께요.
회사/유지보수업체 바이두/커뮤니티 래퍼 Iron Software (미국)
NuGet 다운로드 약 20만 ~5.3M

CJK 정확도 대 설치 비용

CJK 정확도는 PaddleOCR의 진정한 강점입니다. 중국어 간체 문서의 경우, 딥러닝 기반 CRNN 아키텍처는 95% 이상의 정확도를 보여주며, 촘촘한 중국어 문자 배열, 중국어/영어 혼합 레이아웃, 세로 텍스트 블록 등에서 테서랙트 기반 엔진보다 일관되게 우수한 성능을 나타냅니다. 프로젝트의 주요 업무가 중국어 송장 처리, 중국어 계약서 작성 또는 일본어 제품 카탈로그 검토라면, 정확성 측면에서 얻는 이점은 분명합니다.

패들OCR 접근법

중국어 모델 파이프라인이 우수한 성능을 보이는 이유는 탐지 및 인식 네트워크가 대규모 중국어 문서 데이터셋을 기반으로 학습되었기 때문입니다. 바이두는 대규모 중국어 웹 콘텐츠 처리를 핵심 사업으로 삼고 있습니다.

// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);

// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
    .Where(r => r.Score >= 0.8)
    .OrderBy(r => r.Rect.Center.Y)
    .ThenBy(r => r.Rect.Center.X);

foreach (var region in highConfidence)
{
    Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);

// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
    .Where(r => r.Score >= 0.8)
    .OrderBy(r => r.Rect.Center.Y)
    .ThenBy(r => r.Rect.Center.X);

foreach (var region in highConfidence)
{
    Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
Imports System
Imports System.Linq
Imports OpenCvSharp

' Chinese model: highest accuracy for CJK documents
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()

Using ocr As New PaddleOcrAll(models) With {
    .AllowRotateDetection = True,
    .Enable180Classification = True
}

    Using mat As Mat = Cv2.ImRead("chinese-invoice.png")
        Dim result As PaddleOcrResult = ocr.Run(mat)

        ' Filter low-confidence regions for cleaner output
        Dim highConfidence = result.Regions _
            .Where(Function(r) r.Score >= 0.8) _
            .OrderBy(Function(r) r.Rect.Center.Y) _
            .ThenBy(Function(r) r.Rect.Center.X)

        For Each region In highConfidence
            Console.WriteLine($"{region.Text} ({region.Score:P0})")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

신뢰도 필터 패턴 (r.Score >= 0.8)은 중요합니다. 왜냐하면 심층 학습 탐지 단계가 때때로 비텍스트 영역을 텍스트로 플래그하기 때문입니다. 필터링을 하지 않으면 출력에 노이즈 영역이 나타납니다. Rect.Center.Y 다음 Rect.Center.X로 정렬하면 읽기 순서를 대략적으로 추정할 수 있지만, 복잡한 다열 레이아웃의 경우 이를 보장하지는 않습니다.

IronOCR 접근법

IronOCR의 중국어 간체 지원 기능은 NuGet 패키지로 설치되며 모델 관리가 필요하지 않습니다. 중국어 문서에 대한 정확도는 85~90%로, 동일한 자료에 대한 PaddleOCR의 95% 이상보다는 낮지만, 특히 문서 형식이 일관적인 경우 많은 실제 사용 사례에 충분합니다.

// dotnet add package IronOcr.Languages.ChineseSimplified

using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;

using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");

// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();

var result = ocr.Read(input);

// Word-level results with coordinates
foreach (var word in result.Words)
{
    Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
// dotnet add package IronOcr.Languages.ChineseSimplified

using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;

using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");

// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();

var result = ocr.Read(input);

// Word-level results with coordinates
foreach (var word in result.Words)
{
    Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
Imports IronOcr

' dotnet add package IronOcr.Languages.ChineseSimplified

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified

Using input As New OcrInput()
    input.LoadImage("chinese-invoice.png")

    ' Preprocessing handles rotation, noise, and contrast automatically
    input.Deskew()
    input.DeNoise()

    Dim result = ocr.Read(input)

    ' Word-level results with coordinates
    For Each word In result.Words
        Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%")
    Next
End Using
$vbLabelText   $csharpLabel

여러 언어를 동시에 필요로 하는 팀 — 예를 들어 혼합 중국어/영어 문서 — IronOCR은 AddSecondaryLanguage로 결합을 처리합니다. PaddleOCR은 언어별로 모델 세트를 전환해야 하므로 별도의 다운로드 호출과 별도의 엔진 인스턴스가 필요합니다.

절충점은 분명합니다. PaddleOCR은 순수 CJK 정확도 면에서 우위를 점합니다.IronOCR영어/라틴어 정확도(97-99% 대 92-95%), 저품질 스캔에 대한 전처리 기능, 모델 파일을 관리할 필요가 없는 간편한 작동 방식에서 우위를 점합니다. 다양한 언어로 된 문서를 처리하거나, 주로 유럽 언어 문서를 처리하면서 간혹 체코어와 카자흐어 콘텐츠를 사용하는 팀의 경우, IronOCR의 정확도 프로필이 전반적으로 더 유용할 것입니다. 다국어 및 전처리 예제는 IronOCR 튜토리얼 허브를 참조하세요.

모델 다운로드 및 관리

PaddleOCR과IronOCR의 모델 관리 방식 차이는 일상적인 운영에서 가장 중요한 차이점입니다. 이는 초기 설정, CI/CD 파이프라인, Docker 이미지 및 에어갭 배포에 영향을 미칩니다.

패들OCR 접근법

PaddleOCR은 NuGet 패키지와 별도로 모델을 제공합니다. 완전한 OCR 파이프라인 실행에는 세 개의 모델 디렉터리가 필요하며, 이러한 디렉터리를 확보하는 각 접근 방식에는 서로 다른 장단점이 있습니다.

// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();

// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
//   models/ch_PP-OCRv4_det_infer/
//   models/ch_ppocr_mobile_v2.0_cls_infer/
//   models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
    LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
    LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
    LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);

// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4

// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();

// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
//   models/ch_PP-OCRv4_det_infer/
//   models/ch_ppocr_mobile_v2.0_cls_infer/
//   models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
    LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
    LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
    LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);

// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4

// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
$vbLabelText   $csharpLabel

모델 버전은 래퍼 버전과 일치해야 합니다. Sdcb.PaddleOCR이 업데이트되면 이전 버전에서 미리 다운로드한 모델을 다시 다운로드해야 할 수 있습니다. NuGet 복원 단계를 캐시하는 CI/CD 파이프라인은 모델 파일 캐싱을 별도로 관리하거나 컨테이너 빌드 단계 중에 모델 다운로드를 트리거해야 합니다. Docker 이미지 비교를 통해 그 결과를 확인할 수 있습니다. PaddleOCR 컨테이너는 약 1.5GB의 용량을 차지합니다.IronOCR컨테이너 크기는 약 400MB입니다.

IronOCR 접근법

IronOCR 언어 모델은 표준 NuGet 패키지입니다. 다운로드 호출 없음, 모델 디렉토리 관리 없음, 버전 동기화 없음.IronOCR용 NuGet 패키지에는 영어 모델이 포함되어 있습니다. 추가 언어 팩은 다른 종속성 설치와 동일한 방식으로 설치됩니다.

// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese

using IronOcr;

// 아니요 async initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);

using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");

var result = ocr.Read(input);
Console.WriteLine(result.Text);
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese

using IronOcr;

// 아니요 async initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);

using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");

var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' 아니요 async initialization, no model path, no version matching
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.Japanese)

Using input As New OcrInput()
    input.LoadImage("mixed-cjk-document.png")

    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

언어 팩은 dotnet restore의 일부로 복구됩니다. models/ 디렉토리를 복사하고 apt-get install libopencv-dev을 실행하고 CUDA 기본 이미지를 추가하는 Docker 빌드 단계가IronOCR컨테이너에는 존재하지 않습니다. Docker 배포 또는 Azure 배포를 사용하는 팀의 경우 컨테이너 빌드 복잡성의 차이가 상당합니다.

GPU 및 CUDA 의존성

PaddleOCR의 GPU 성능 수치(이미지당 50~100ms 대 CPU의 300~500ms)는 실제입니다. 딥러닝 모델은 Tesseract 기반 엔진과 달리 GPU 병렬 처리의 이점을 크게 누립니다. 하루에 수만 장의 이미지를 처리하는 워크로드의 경우, 5~10배의 처리량 향상은 인프라에 대한 논의를 완전히 바꿔놓을 수 있습니다.

패들OCR 접근법

GPU 추론에는 NuGet 외부에 완전히 별도의 소프트웨어 스택이 필요합니다. 환경 필수 조건은 정확하며 버전이 고정되어 있습니다.

// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118

using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;

FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118

using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;

FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();

// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
    AllowRotateDetection = true,
    Enable180Classification = true
};

using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports Sdcb.PaddleInference
Imports OpenCvSharp

' Prerequisites (must be installed before this compiles correctly):
' 1. NVIDIA GPU with CUDA capability 3.5+
' 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
' 3. CUDA Toolkit 11.8 — exact version, not 12.x
' 4. cuDNN 8.6.0+ for CUDA 11.x
' 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118

Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()

' GPU device 0, 1000MB GPU memory pool
Using ocr As New PaddleOcrAll(models, PaddleDevice.Gpu(deviceId:=0)) With {
    .AllowRotateDetection = True,
    .Enable180Classification = True
}

    Using mat As Mat = Cv2.ImRead(imagePath)
        Dim result As PaddleOcrResult = ocr.Run(mat)
    End Using

End Using
$vbLabelText   $csharpLabel

CUDA_PATH가 설정되지 않았거나 일치하는 cuDNN DLL이 예상 위치에 없거나 런타임 패키지 버전이 설치된 CUDA 도구 세트와 일치하지 않으면 호출이 네이티브 라이브러리 로드 예외를 발생시킵니다. 해당 오류를 진단하려면 여러 디렉터리에 걸쳐 드라이버 버전, PATH 항목 및 DLL 존재 여부를 확인해야 합니다. Docker에서 GPU 지원은 nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 기본 이미지와 호스트의 nvidia-container-toolkit가 필요하며, 이는 이미지 빌드와 컨테이너 런타임 구성 모두에 복잡성을 추가합니다.

CPU 전용 배포의 경우 PaddleOCR은 기본적으로 MKL 가속 런타임을 사용합니다. 이미지당 약 300~500ms가 소요되며, 모델 로드 콜드 스타트는 3~5초가 걸립니다.

IronOCR 접근법

IronOCR CPU 추론에 최적화되어 있습니다. 이 기술은 표준 하드웨어에서 GPU 의존성, CUDA 스택 및 드라이버 버전 문제 없이 이미지당 150~300ms의 처리 시간을 제공합니다. 또한, 초기화 시 모델이 디스크에서 로드되는 대신 번들로 제공되기 때문에 엔진이 1초 이내에 시작될 수 있습니다.

using IronOcr;

// 아니요 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;

// 아니요 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' 아니요 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim ocr As New IronTesseract()

' Preprocessing built-in — improves accuracy on poor scans without extra code
Using input As New OcrInput()
    input.LoadImage("document.png")
    input.Deskew()
    input.DeNoise()
    input.EnhanceResolution(300)

    Dim result = ocr.Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

GPU 하드웨어 없이 대규모 스루풋을 위해, IronOCR의 스레드 안전 설계는 Parallel.ForEach을 사용하여 별도의 IronTesseract 인스턴스와 함께 이미지 배치에 걸쳐 병렬 처리를 허용하며, 각 인스턴스는 잠금 없이 독립적으로 처리됩니다. 멀티스레딩 예시는 그 패턴을 보여줍니다. 4코어 CPU에서 이미지당 150~300ms가 소요되는 경우, 병렬 처리를 활용하면 100개 이미지 배치를 20~40초 만에 완료할 수 있습니다. 이러한 CPU 처리량 덕분에 대부분의 웹 API 및 문서 파이프라인 시나리오에서는 GPU 투자가 불필요합니다.

이미지 품질 보정 가이드는 자동 전처리 설정 조정이 필요한 경우에 대한 전처리 구성 방법을 자세히 다룹니다.

PDF 처리

PaddleOCR은 PDF를 기본적으로 지원하지 않습니다. PaddleOCR을 통해 처리되는 모든 PDF 파일은 먼저 페이지를 이미지로 변환하는 외부 라이브러리, 변환과 추론 사이의 임시 파일 관리, 그리고 정리 로직을 필요로 합니다.

패들OCR 접근법

// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;

FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);

var results = new StringBuilder();

//수동PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");

for (int i = 0; i < pdf.PageCount; i++)
{
    // Render page to bitmap — 200 DPI
    using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);

    // Save to temp file — OpenCvSharp cannot read from memory easily
    string tempPath = Path.GetTempFileName() + ".png";
    pageImage.Save(tempPath, ImageFormat.Png);

    try
    {
        using Mat mat = Cv2.ImRead(tempPath);
        var result = ocr.Run(mat);
        results.AppendLine($"--- Page {i + 1} ---");
        results.AppendLine(result.Text);
    }
    finally
    {
        File.Delete(tempPath);  // Must clean up temp files
    }
}

return results.ToString();
// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;

FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);

var results = new StringBuilder();

//수동PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");

for (int i = 0; i < pdf.PageCount; i++)
{
    // Render page to bitmap — 200 DPI
    using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);

    // Save to temp file — OpenCvSharp cannot read from memory easily
    string tempPath = Path.GetTempFileName() + ".png";
    pageImage.Save(tempPath, ImageFormat.Png);

    try
    {
        using Mat mat = Cv2.ImRead(tempPath);
        var result = ocr.Run(mat);
        results.AppendLine($"--- Page {i + 1} ---");
        results.AppendLine(result.Text);
    }
    finally
    {
        File.Delete(tempPath);  // Must clean up temp files
    }
}

return results.ToString();
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports System.Text

Public Class PdfToTextConverter
    Public Shared Async Function ConvertPdfToText() As Task(Of String)
        Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
        Using ocr As New PaddleOcrAll(models)
            Dim results As New StringBuilder()

            ' 수동PDF-to-image conversion, page by page
            Using pdf As PdfDocument = PdfDocument.Load("document.pdf")
                For i As Integer = 0 To pdf.PageCount - 1
                    ' Render page to bitmap — 200 DPI
                    Using pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
                        ' Save to temp file — OpenCvSharp cannot read from memory easily
                        Dim tempPath As String = Path.GetTempFileName() & ".png"
                        pageImage.Save(tempPath, ImageFormat.Png)

                        Try
                            Using mat As Mat = Cv2.ImRead(tempPath)
                                Dim result = ocr.Run(mat)
                                results.AppendLine($"--- Page {i + 1} ---")
                                results.AppendLine(result.Text)
                            End Using
                        Finally
                            File.Delete(tempPath) ' Must clean up temp files
                        End Try
                    End Using
                Next
            End Using

            Return results.ToString()
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

PDF 파일 하나에 30줄이 넘는다는 뜻입니다. NuGet 종속성(PdfiumViewer)을 추가하고, 선택한 DPI로 페이지를 수동으로 렌더링하고, 임시 파일을 생성 및 삭제하고, 결과를 반복적으로 누적하는 모든 작업이 PaddleOCR 자체를 실행하기 전에 수행됩니다. DPI를 너무 낮게 설정하면 정확도가 떨어집니다. 너무 높게 설정하면 처리 시간이 늘어납니다. 이 결정은 개발자의 몫입니다.

IronOCR 접근법

IronOCR PDF 파일을 기본적으로 읽습니다. 변환 라이브러리도, 임시 파일도, 호출 지점에서 페이지별 루프도 필요 없습니다.

using IronOcr;

var ocr = new IronTesseract();

// 네이티브 PDF 입력 — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");

var result = ocr.Read(input);

// Per-page access available if needed
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}

// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
using IronOcr;

var ocr = new IronTesseract();

// 네이티브 PDF 입력 — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");

var result = ocr.Read(input);

// Per-page access available if needed
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}

// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

Dim ocr As New IronTesseract()

' 네이티브 PDF 입력 — no external library needed
Using input As New OcrInput()
    input.LoadPdf("document.pdf")

    Dim result = ocr.Read(input)

    ' Per-page access available if needed
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars")
    Next

    ' Produce a searchable PDF in one additional line
    result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
$vbLabelText   $csharpLabel

비밀번호로 보호된 PDF는 동일한 LoadPdf 경로를 사용하고 Password 매개변수를 포함합니다. PDF 입력 가이드검색 가능한 PDF 가이드 는 다중 페이지 및 출력 옵션에 대해 자세히 설명합니다. 스캔한 문서 아카이브를 디지털화하는 조직의 경우, 모든 파일이 PDF 형식으로 제공되므로 이러한 차이점 덕분에 통합 코드 단계를 상당히 줄일 수 있습니다.

API 매핑 참조

패들OCR(Sdcb) IronOCR에 상응하는 노트
Sdcb.PaddleOCR IronOcr 네임스페이스
PaddleOcrAll IronTesseract 메인 OCR 오케스트레이션 클래스
FullOcrModel 해당 없음 동등한 모델 없음 - 번들로 제공되는 모델
OnlineFullModels.ChineseV4.DownloadAsync() dotnet add package IronOcr.Languages.ChineseSimplified 모델 획득
LocalDetectionModel.FromDirectory(path) 해당 없음 모델 경로 관리 없음
LocalClassificationModel.FromDirectory(path) 해당 없음 모델 경로 관리 없음
LocalRecognitionModel.FromDirectory(path) 해당 없음 모델 경로 관리 없음
new PaddleOcrAll(models) new IronTesseract() 엔진 인스턴스화
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) 해당 없음 (CPU 최적화) GPU 장치 선택
Cv2.ImRead(imagePath) (OpenCvSharp) new OcrInput(imagePath) 또는 input.LoadImage(path) 이미지 로딩 중
ocr.Run(mat) ocr.Read(input) OCR 실행
result.Text result.Text 문서 전문
result.Regions result.Words / result.Lines 구조화된 텍스트 영역
region.Text word.Text 한 지역의 텍스트
region.Score word.Confidence 신뢰도 값 (0-1 대 0-100)
region.Rect.Center.X / .Center.Y word.X / word.Y 경계 상자 위치
region.Rect.Size.Width / .Height word.Width / word.Height 경계 상자 크기
AllowRotateDetection = true input.Deskew() 회전 핸들링
Enable180Classification = true 자동 거꾸로 된 텍스트 감지
해당 없음 input.DeNoise() 노이즈 제거
해당 없음 input.Contrast() 명암 대비 강화
해당 없음 input.EnhanceResolution(300) DPI 스케일링
해당 없음 input.LoadPdf(path) 네이티브 PDF 입력
해당 없음 result.SaveAsSearchablePdf(path) 검색 가능한 PDF 출력
해당 없음 ocr.AddSecondaryLanguage(lang) 다국어 동시 지원

팀이 PaddleOCR에서IronOCR로 전환을 고려할 때

언어 요구 조건이 14를 넘어 확대될 때

한 프로젝트에서 중국 송장 처리를 시작했는데, PaddleOCR이 이를 훌륭하게 처리했습니다. 그러자 고객층이 확대되고 폴란드어, 네덜란드어, 그리스어, 베트남어, 터키어로 된 문서들이 도착하기 시작했습니다. PaddleOCR에서 지원하는 14개 언어에는 이러한 언어가 포함되어 있지 않습니다. 도구가 사용 사례에 맞춰 확장될 수 없기 때문에 마이그레이션이 필요해집니다.IronOCR에 폴란드어 지원을 추가하는 것은 NuGet 패키지 하나만 추가하고 설정 파일 한 줄만 수정하면 됩니다. 프로젝트 범위를 "초기에는 중국어 중심이지만 궁극적으로는 다지역으로 확장"하는 팀은 재작업 없이 언어 지원 범위를 확장할 수 있는 도구를 사용할지 여부를 사전에 결정해야 합니다.

설치 비용이 문제 해결 예산을 초과할 경우

PaddleOCR 설명서에 따르면 최초 설정 시간은 CPU의 경우 30~60분, GPU의 경우 2~8시간으로 예상됩니다. 개발자 인건비가 시간당 100달러라고 가정하면, 첫 번째 GPU 구성 시도에 200~800달러가 소요된 후 첫 번째 상용 이미지가 처리됩니다.IronOCR설치는 단 하나의 설치 명령과 네 줄짜리 코드 샘플로 완료되며, 5분도 채 걸리지 않습니다. 내부 도구, 프로토타입 또는 OCR이 핵심 제품이 아닌 보조 기능인 프로젝트의 경우, 이러한 시간 차이로 인해 OCR 기능이 현재 스프린트에 출시될지 아니면 우선순위가 낮아질지가 결정됩니다.IronOCR시작하는 데 걸리는 시간은 CUDA 환경을 구성하는 데 걸리는 시간보다 짧습니다.

PDF 워크플로가 지배적일 때

스캔한 문서 아카이브를 디지털화하거나, 팩스를 PDF로 변환하는 파이프라인을 처리하거나, PDF 형식의 송장 및 계약서에서 데이터를 추출하는 조직은 PaddleOCR에서 구조적인 문제에 직면합니다. PaddleOCR이 PDF 파일을 처리하려면 모든 PDF 파일에 추가 라이브러리, 수동 페이지 렌더링, 임시 파일 관리 및 DPI 선택 로직이 필요합니다. 그것은 우연한 복잡성이 아니라 영구적인 유지 관리입니다. PaddleOCR을 처음 통합한 후 작업량의 80% 이상이 PDF 기반이라는 사실을 알게 된 팀은 일반적으로 PaddleOCR 자체에 오류가 발생하기보다는 PDF 변환 레이어에 버그가 생길 때 마이그레이션을 진행합니다.

규정 준수 검토에서 바이두 원산지가 확인될 경우

정부, 국방, 의료 및 금융 서비스 기관의 Enterprise 보안 팀은 중국 정부 관련 기업에서 생산된 구성 요소에 대해 검토 기준을 적용하는 사례가 늘고 있습니다. PaddleOCR은 바이두 프로젝트입니다. 모델 다운로드는 기본적으로 바이두 클라우드 스토리지에 연결됩니다. PaddlePaddle 프레임워크는 바이두 제품입니다. 코드는 로컬에서 실행되고 문서는 전송되지 않지만, 모델 산출물은 바이두 인프라에서 생성됩니다. FedRAMP, ITAR 또는 CMMC 환경의 경우, 해당 출처로 인해 규정 준수 검토가 필요하게 되며, 이로 인해 도입이 차단될 수 있습니다.IronOCR은 미국에 본사를 둔 Iron Software 사의 제품으로, 모든 콘텐츠를 로컬에서 처리하고 외부 연결을 사용하지 않으며 타사 서버에서 모델을 다운로드할 필요가 없습니다.

GPU 인프라가 구축되어 있지 않은 경우

CPU 기반 PaddleOCR(이미지당 300-500ms, 콜드 스타트 ​​3-5초, 메모리 500MB-1GB)은 CPU 기반IronOCR(이미지당 150-300ms, 콜드 스타트 ​​1초 미만, 메모리 100-200MB)보다 속도가 느리고 리소스를 더 많이 소모합니다. PaddleOCR의 GPU 활용 이점은 CUDA/cuDNN 설정 후에야 비로소 드러나며, 그 이점은 처리량이 많을 때에만 운영상의 복잡성을 정당화할 수 있습니다. GPU 인스턴스 없이 표준 클라우드 인프라(GPU가 없는 EC2, Azure App Service, AWS Lambda)를 운영하는 팀은 PaddleOCR 설정 비용을 지불하면서도 그에 상응하는 성능 향상을 얻지 못하고 있습니다.

일반적인 마이그레이션 고려사항

패키지 및 네임스페이스 교체

패키지 교체를 통해 다섯 개의 종속성이 제거되고 하나가 추가됩니다. Sdcb.PaddleOCR, Sdcb.PaddleOCR.Models.Online, Sdcb.PaddleInference.runtime.* 패키지, OpenCvSharp4OpenCvSharp4.runtime.win을(를) .csproj에서 제거합니다. IronOcr을 추가합니다. 이전에 다운로드한 모델 세트를 사용했던 영어 이외의 언어에 대해 언어 팩을 NuGet 패키지로 추가하세요.

using Sdcb.PaddleOCRusing OpenCvSharp 지시문을 using IronOcr로 대체합니다. Mat mat = Cv2.ImRead(path) 패턴을 new OcrInput(path) 또는 input.LoadImage(path)로 대체합니다. ocr.Run(mat) 호출이 ocr.Read(input)이(가) 됩니다. 이미지 입력 API를 사용하는 프로젝트의 경우, OcrInput 객체는 파일 경로, 바이트 배열, 스트림 및 System.Drawing.Bitmap을 수용하며 OpenCvSharp 매개체는 완전히 사라집니다.

결과 구조 재매핑

PaddleOCR은 result.Regions을 반환합니다 — PaddleOcrResultRegion 객체 배열이며, 각각의 region.Score은 0부터 1까지의 플로트입니다. IronOCR은 result.Words을 반환합니다 — 여기서 word.Confidence는 0부터 100까지의 백분율입니다. 신뢰도 필터 r.Score >= 0.8w.Confidence >= 80로 매핑됩니다. 바운딩 박스 액세스는 region.Rect.Center.X / region.Rect.Size.Width에서 word.X / word.Width으로 변경됩니다. 구조화된 결과 가이드는 페이지, 단락, 줄, 단어를 다룹니다.

IronOCR 에서는 Tesseract 레이아웃 엔진이 페이지 분할 단계의 일부로 읽기 순서 분석을 수행하기 때문에 공간 정렬(Y축 정렬 후 X축 정렬을 통해 대략적인 읽기 순서 지정)이 필요한 경우가 드뭅니다. PaddleOCR에서 명시적인 정렬 로직이 필요했던 문서의 경우, 정렬 코드를 포팅하기 전에 IronOCR의 기본 출력 순서가 이미 요구 사항을 충족하는지 확인하십시오.

전처리 전환

PaddleOCR의 딥러닝 기반 객체 탐지 ​​모델은 이미지 품질 저하를 어느 정도 허용합니다. 신경망은 Tesseract의 기존 분할 파이프라인보다 노이즈와 왜곡을 더 안정적으로 처리합니다.IronOCR로 마이그레이션할 때는 이전에 전처리 없이도 성공적으로 처리되었던 문서에 대해서도 명시적인 전처리를 추가해야 합니다.

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");

// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);

var result = ocr.Read(input);
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");

// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);

var result = ocr.Read(input);
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadImage("low-quality-scan.png")

    ' These filters recover the accuracy that PaddleOCR provided automatically
    ' on noisy or skewed inputs
    input.Deskew()
    input.DeNoise()
    input.Contrast()
    input.Binarize()
    input.EnhanceResolution(300)

    Dim result = ocr.Read(input)
End Using
$vbLabelText   $csharpLabel

스캔 각도가 비표준적이거나 배경 노이즈가 있는 문서의 경우, 이 네 가지 필터를 사용하면 정확도 격차를 대부분 복구할 수 있습니다. 이미지 방향 보정 가이드이미지 색상 보정 가이드 에서는 각 필터가 일반적인 스캔 오류에 미치는 영향을 설명합니다. 마이그레이션을 완료하기 전에 대표 문서를 두 파이프라인 모두에 통과시켜 실제 문서 세트의 요구 사항을 충족하는지 확인하십시오.

배포 정리

마이그레이션 후 배포 아티팩트의 크기가 크게 줄어듭니다. models/ 디렉토리 트리(하위 디렉토리 세 개, ~21MB의 모델 파일), paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB), 및 opencv_world*.dll 파일(~50MB 결합)을 삭제합니다. Dockerfile에서 apt-get install libopencv-dev 라인과 모델 사전 다운로드 단계를 제거합니다. 모델을 사전 다운로드하거나 모델 디렉토리를 캐시하는 모든 CI/CD 단계를 제거합니다. Docker 이미지 크기가 약 1.5GB에서 약 400MB로 줄어듭니다.

IronOCR의 추가 기능

위에서 다룬 비교점 외에도IronOCR OCR을 텍스트 추출 이상의 기능으로 확장합니다.

  • OCR 중 바코드 읽기: ocr.Configuration.ReadBarCodes = true 및 동일 문서에 있는 바코드를 한 번의 처리로 텍스트와 함께 디코딩합니다 — 별도의 바코드 라이브러리가 필요하지 않습니다.
  • 영역 기반 OCR: 특정 문서 영역(송장번호 필드, 헤더 행, 서명 블록)에 CropRectangle을 사용하여 전체 페이지를 처리하지 않고도 타겟팅할 수 있습니다.
  • 비동기 OCR : ASP.NET 컨트롤러 및 백그라운드 서비스에서 비차단 통합을 위한 완벽한 async/await 지원
  • 신뢰도 점수 : 문서 수준 및 단어 수준의 신뢰도 점수를 통해 품질 관리를 수행할 수 있습니다. 신뢰도가 낮은 결과는 거부하거나 사람 검토를 위해 표시할 수 있습니다.
  • hOCR 내보내기 : 위치 기반 HTML을 사용하는 하위 문서 관리 시스템에 필요한 hOCR 출력물을 생성합니다.
  • 필기 인식 : 타이핑된 문서 OCR을 넘어 손으로 쓴 양식과 메모까지 인식합니다.
  • 표 형식 데이터 추출 : 송장, 명세서 및 양식에서 표 형식 데이터를 구조화하여 추출합니다.
  • 진행 상황 추적 : UI 컨텍스트에서 여러 페이지로 구성된 장시간 일괄 처리 작업의 OCR 진행 상황을 보고합니다.

.NET 호환성 및 미래 준비

IronOCR Windows x64, Windows x86, Linux x64 및 macOS에서 .NET 6, 7, 8 및 9를 대상으로 합니다. 이 서비스는 Azure App Service, AWS Lambda, Docker 컨테이너 및 외부와 완전히 분리된 온프레미스 환경에서 모두 동일한 NuGet 패키지를 통해 실행됩니다. 이 라이브러리는 Iron Software 에서 각 .NET 릴리스 주기에 맞춰 정기적으로 업데이트되며, .NET 10이 출시되면 .NET 10과의 호환성도 제공될 예정입니다. PaddleOCR의 .NET 래퍼는 커뮤니티에서 유지 관리하는 프로젝트입니다. 새로운 .NET 버전과의 호환성은 단일 유지 관리자의 역량에 달려 있습니다. 래퍼의 출시 일정과 새로운 PaddleOCR Python 모델 버전이 .NET 에 적용되기까지 3개월의 지연이 발생하는 것은 상업적 출시 약속보다는 커뮤니티의 가용성에 더 의존한다는 것을 보여줍니다.

결론

PaddleOCR의 CJK 정확도 우위는 확실하고 특정한 장점입니다. 주된 작업량이 중국어 간체 문서이고, 팀이 딥러닝 전문 지식과 기존 GPU 인프라를 갖춘 프로젝트의 경우, 여러 패키지를 설치하고 CUDA 구성을 복잡하게 만드는 비용은 Tesseract 기반 엔진이 현재 밀집된 중국어 문자 인식에서 달성하지 못하는 정확도 수치로 정당화됩니다.

문제는 이러한 특정 시나리오가 .NET OCR 사용 사례의 소수만을 설명한다는 점입니다. 대부분의 상업용 애플리케이션은 영어 및 유럽 언어 문서를 처리하는데, 이 경우 IronOCR의 97~99% 정확도가 PaddleOCR의 92~95% 정확도를 능가합니다. 대부분의 개발팀은 CUDA 인프라가 미리 구성되어 있지 않습니다. 대부분의 문서 파이프라인은 PDF 파일을 입력으로 받는데, PaddleOCR은 추가 라이브러리 없이는 PDF 파일을 처리할 수 없습니다. 대부분의 .NET 프로젝트 개발자는 단일 Install-Package로 전체 설치 단계가 완료될 것으로 기대합니다. 다섯 개의 패키지 중 첫 번째 Install-Package 후 비동기 모델 다운로드와 OpenCV 종속성 설치가 이어지는 것을 예상하지는 않습니다.

대규모 GPU 처리량이 필요한 팀의 경우, PaddleOCR의 CPU 성능(300~500ms)은 이미IronOCR의 CPU 성능(150~300ms)에 미치지 못합니다. 즉, PaddleOCR의 성능 우위 주장이 성립하는 유일한 시나리오는 CUDA 인프라가 이미 구축되어 있는 경우뿐입니다. IronOCR의 영구 라이선스 비용은 GPU 구성 시간만 고려하더라도 일반적으로 첫 주 안에 회수됩니다.

가장 먼저 제기되는 질문은 95% 이상의 중국어 문자 정확도가 이를 구현하는 데 필요한 모든 기능을 갖춘 시스템을 정당화하는지 여부입니다. GPU 인프라가 갖춰져 있고 바이두 소프트웨어에 대한 규정 준수 승인을 받은 환경에서 중국 시장을 주요 작업 부하로 사용하는 경우, 답은 '예'입니다. 그 외의 모든 작업에 대해IronOCR 5분 이내에 작동을 시작하며 대부분의 .NET OCR 프로젝트에서 실제로 접하는 언어, 전처리 및 PDF 요구 사항을 모두 충족합니다.

참고해 주세요PDFium, PaddleOCR 및 Tesseract는 각 소유자의 등록 상표입니다. 이 사이트는 Baidu, Chromium Project, Google 또는 PaddlePaddle과 관련이 없으며, 승인되지 않았으며, 후원도 받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

자주 묻는 질문

패들OCR이란 무엇인가요?

PaddleOCR은 개발자와 기업에서 이미지와 문서에서 텍스트를 추출하는 데 사용하는 OCR 솔루션입니다. .NET 애플리케이션 개발용 IronOCR과 함께 평가된 여러 OCR 옵션 중 하나입니다.

IronOCR은 .NET 개발자를 위한 PaddleOCR과 어떻게 다른가요?

IronOCR은 IronTesseract를 핵심 엔진으로 사용하는 NuGet 네이티브 .NET OCR 라이브러리입니다. PaddleOCR에 비해 배포가 간편하고(SDK 설치 프로그램 없음), 정액제 요금제를 제공하며, COM 상호 운용이나 클라우드 종속성이 없는 깔끔한 C# API를 제공합니다.

IronOCR이 PaddleOCR보다 설정이 더 쉬운가요?

IronOCR은 단일 NuGet 패키지를 통해 설치됩니다. SDK 설치 프로그램, 복사할 라이선스 파일, 등록할 COM 구성 요소 또는 관리해야 할 별도의 런타임 바이너리가 없습니다. 전체 OCR 엔진이 패키지에 번들로 제공됩니다.

PaddleOCR과 IronOCR에는 어떤 정확도 차이가 있나요?

IronOCR은 표준 비즈니스 문서, 송장, 영수증, 스캔 양식에 대해 높은 인식 정확도를 달성합니다. 품질이 많이 저하된 문서나 일반적이지 않은 스크립트의 경우 정확도는 소스 품질에 따라 달라집니다. IronOCR에는 이미지 전처리 필터가 포함되어 있어 저품질 입력에 대한 인식률을 향상시킵니다.

IronOCR은 PDF 텍스트 추출을 지원하나요?

예. IronOCR은 한 번의 호출로 원본 PDF와 스캔한 PDF 이미지 모두에서 텍스트를 추출합니다. 또한 여러 페이지의 TIFF 파일, 이미지, 스트림도 지원합니다. 스캔한 PDF의 경우 OCR은 페이지별 결과 개체를 사용하여 페이지별로 적용됩니다.

PaddleOCR 라이선싱은 IronOCR과 어떻게 다른가요?

IronOCR은 페이지당 또는 스캔당 요금이 없는 정액제 영구 라이선스를 사용합니다. 대량의 문서를 처리하는 조직은 문서 양에 관계없이 동일한 라이선스 비용을 지불합니다. 자세한 내용과 볼륨 가격은 IronOCR 라이선스 페이지에서 확인할 수 있습니다.

IronOCR 어떤 언어를 지원하나요?

IronOCR은 별도의 NuGet 언어 팩을 통해 127개 언어를 지원합니다. 언어를 추가하려면 '닷넷 추가 패키지 IronOcr.Languages.{Language}' 명령 하나만 있으면 됩니다. 수동으로 파일을 배치하거나 경로를 구성할 필요가 없습니다.

.NET 프로젝트에 IronOCR 설치하는 방법은 무엇인가요?

NuGet을 통해 설치합니다: 패키지 관리자 콘솔에서 '설치-패키지 IronOcr' 또는 CLI에서 '닷넷 추가 패키지 IronOcr'을 실행합니다. 추가 언어 팩도 같은 방법으로 설치됩니다. 기본 SDK 인스톨러가 필요하지 않습니다.

IronOCR은 PaddleOCR과 달리 Docker 및 컨테이너화된 배포에 적합한가요?

예. IronOCR은 NuGet 패키지를 통해 Docker 컨테이너에서 작동합니다. 라이선스 키는 환경 변수를 통해 설정됩니다. OCR 엔진 자체에는 라이선스 파일, SDK 경로 또는 볼륨 마운트가 필요하지 않습니다.

구매하기 전에 PaddleOCR과 비교하여 IronOCR을 사용해 볼 수 있나요?

예. IronOCR 평가판 모드는 문서를 처리하고 출력물에 워터마크 오버레이가 포함된 OCR 결과를 반환합니다. 라이선스를 구매하기 전에 자신의 문서에서 정확성을 확인할 수 있습니다.

IronOCR은 텍스트 추출과 함께 바코드 판독을 지원하나요?

IronOCR은 텍스트 추출과 OCR에 중점을 둡니다. 바코드 판독을 위해 Iron Software는 동반 라이브러리로 IronBarcode를 제공합니다. 두 가지 모두 개별적으로 또는 Iron Suite 번들의 일부로 사용할 수 있습니다.

PaddleOCR에서 IronOCR로 쉽게 마이그레이션할 수 있나요?

PaddleOCR에서 IronOCR로의 마이그레이션에는 일반적으로 초기화 시퀀스를 IronTesseract 인스턴스화로 대체하고, COM 수명 주기 관리를 제거하며, API 호출을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션은 코드 복잡성을 크게 줄여줍니다.

칸나오팟 우돈판트
소프트웨어 엔지니어
카나팟은 소프트웨어 엔지니어가 되기 전 일본 홋카이도 대학교에서 환경 자원학 박사 학위를 취득했습니다. 학위 과정 중에는 생물생산공학과 소속 차량 로봇 연구실에서 활동하기도 했습니다. 2022년에는 C# 기술을 활용하여 Iron Software의 엔지니어링 팀에 합류했고, 현재 IronPDF 개발에 집중하고 있습니다. 카나팟은 IronPDF에 사용되는 대부분의 코드를 직접 작성하는 개발자로부터 배울 수 있다는 점에 만족하며, 동료들과의 소통을 통해 배우는 것 외에도 Iron Software에서 일하는 즐거움을 누리고 있습니다. 코딩이나 문서 작업을 하지 않을 때는 주로 PS5로 게임을 하거나 The Last of Us를 다시 시청하는 것을 즐깁니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해