Paddle OCR vs Tesseract: Szczegółowe porównanie OCR
PaddleOCR zapewnia najnowocześniejsze rozpoznawanie chińskich znaków — jednak przetworzenie pojedynczego obrazu w aplikacji .NET wymaga pięciu pakietów NuGet, asynchronicznego pobrania modelu (~100 MB) łączącego się z serwerami Baidu w Chinach, zależności OpenCvSharp przy każdym ładowaniu obrazu oraz czasu rozruchu wynoszącego 3–5 sekund przy pierwszym uruchomieniu. To jest cena za użycie systemu głębokiego uczenia się opartego na Pythonie w projekcie .NET. W przypadku obciążeń z dużą ilością tekstu w językach chińskich, gdzie dokładność pisma chińskiego jest twardym wymogiem, a infrastruktura GPU już istnieje, warto ponieść ten koszt. Wszystko inne to zbędne obciążenie, którego projekt nigdy nie potrzebował.
Zrozumienie PaddleOCR
PaddleOCR to system OCR typu open source stworzony przez Baidu w oparciu o PaddlePaddle, własną platformę uczenia głębokiego firmy Baidu. Projekt został zaprojektowany od podstaw dla programistów Python, a społeczność .NET uzyskuje do niego dostęp poprzez wrapper społecznościowy, Sdcb.PaddleOCR, prowadzony przez Zhou Jie (sdcb) na GitHub.
Potok rozpoznawania łączy sekwencyjnie trzy sieci neuronowe: model wykrywania tekstu wykorzystujący różniczkowalną binarizację (DB), który identyfikuje prostokąty ograniczające region tekstu, klasyfikator kierunku, który określa orientację tekstu, oraz model rozpoznawania wykorzystujący konwolucyjną rekurencyjną sieć neuronową (CRNN), która konwertuje piksele wykrytego regionu na ciąg znaków. Każda z tych sieci jest oddzielnym plikiem modelu, który musi znajdować się na dysku, zanim będzie można rozpocząć jakiekolwiek wnioskowanie.
Kluczowe cechy architektury:
- Instalacja wielopaczek: Pakiet podstawowy (
Sdcb.PaddleOCR), środowisko platformy (Sdcb.PaddleInference.runtime.win64.mkllub jego odpowiednik CUDA), pomoc w pobieraniu modelu (Sdcb.PaddleOCR.Models.Online), oraz OpenCvSharp do ładowania obrazów — minimum cztery pakiety, pięć jeśli oddzielasz środowisko OpenCvSharp - Obowiązkowe pobranie modeli: Modele nie są dołączone do pakietu. Pierwsze użycie wywołuje
OnlineFullModels.ChineseV4.DownloadAsync(), który pobiera z serwerów kontrolowanych przez Baidu (bj.bcebos.com) i dodaje ~100MB do artefaktów wdrożeniowych - Zależność od OpenCV dla każdego obrazu: Nie ma ścieżki prowadzącej bezpośrednio od ścieżki pliku do wnioskowania. Obrazy muszą być załadowane jako obiekt OpenCvSharp
Mat, zanim zostaną przekazane doocr.Run(mat) - Przyspieszenie GPU wymaga konfiguracji CUDA/cuDNN: Osiągnięcie deklarowanej wydajności wymaga sterowników NVIDIA, zestawu narzędzi CUDA 11.8, cuDNN 8.6+ oraz oddzielnego pakietu NuGet środowiska uruchomieniowego GPU — 2–8 godzin konfiguracji na środowisko
- Częstotliwość wydawania najpierw w języku Python: nowe wersje modeli PaddleOCR pojawiają się najpierw w języku Python; aktualizacje opakowania .NET następują kilka tygodni lub miesięcy później
- 14 obsługiwanych języków: chiński uproszczony, chiński tradycyjny, angielski, francuski, niemiećki, koreański, japoński, włoski, hiszpański, portugalski, rosyjski, arabski, hindi i tamilski — sztywny limit
Pakiet NuGet ma około 200 000 pobrań. Mniejszy zasięg oznacza mniej odpowiedzi na Stack Overflow, mniej sprawdzonych w praktyce raportów produkcyjnych oraz mniejszą grupę programistów, którzy mogą odpowiadać na pytania w oparciu o własne doświadczenie.
Trzymodeliowy potok w praktyce
Każde wywołanie wnioskowania PaddleOCR uruchamia trzy sieci neuronowe jedna po drugiej. Poniższy kod przedstawia pełną ścieżkę konfiguracji, z którą programista ma do czynienia przed zwróceniem jakiegokolwiek tekstu:
// 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
Tablica result.Regions zawiera indywidualne obiekty regionu tekstowego, każdy z nich zawiera ciąg znaków Text, wartość zaufania Score i ramkę ograniczającą Rect. Aby filtrować według zaufania: result.Regions.Where(r => r.Score > 0.8). Sortowanie regionów jest przestrzenne, nie gwarantuje kolejności czytania, dlatego sortowanie według region.Rect.Center.Y następnie region.Rect.Center.X jest standardowym wzorem.
Zrozumienie IronOCR
IronOCR to komercyjna biblioteka OCR dla platformy .NET, oparta na zoptymalizowanym silniku Tesseract 5 LSTM, zaprojektowana w celu wyeliminowania prac związanych z konfiguracją i przetwarzaniem wstępnym, których wymaga surowy Tesseract. Jeden pakiet NuGet instaluje kompletne środowisko uruchomieniowe, modele językowe, natywne pliki binarne oraz potok przetwarzania wstępnego.
Kluczowe cechy:
- Pojedyncza paczkowa wdrożenie:
dotnet add package IronOcrinstaluje wszystko. Bez dodatkowych pakietów uruchomieniowych, bez pobierania modeli, bez konfiguracji bibliotek natywnych - Automatyczne przetwarzanie wstępne: funkcje Deskew, DeNoise, Contrast, Binarize i EnhanceResolution są stosowane automatycznie w przypadku danych wejściowych o niskiej jakości; Eksplitywna kontrola jest dostępna, gdy jest potrzebna
- Wbudowana obsługa PDF: Skanowane pliki PDF ładują się bezpośrednio przez
input.LoadPdf()bez konieczności konwersji przez oprogramowanie trzecie - 125+ języków przez NuGet: Każda paczka językowa to standardowa zależność NuGet —
dotnet add package IronOcr.Languages.ChineseSimplified— brak zarządzania katalogiem modeli - Bezpieczne dla wątków, zoptymalizowane pod kątem procesora: wbudowana równoległość bez wymagań sprzętowych dotyczących CUDA lub GPU
- Wsparcie komercyjne z umową SLA: firma Iron Software z siedzibą w USA zapewnia wsparcie komercyjne; produkt nie jest pobocznym projektem społeczności
- Wieczysta licencja: $999 Lite / $1,499 Plus / $2,999 Professional — płać raz, korzystaj bez ograniczeń bez opłat za stronę
Porównanie funkcji
| Funkcja | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| Wymagane pakiety NuGet | 4-5 | 1 |
| Wymagane pobranie pliku wzorcowego | Tak (~100 MB, serwery Baidu) | Nie (w pakiecie) |
| Czas konfiguracji | 30–60 minut | 5 minut |
| Dokładność w językach chińskim, japońskim i koreańskim | Doskonałe (95%+) | Dobre (85–90%) |
| Dokładność w języku angielskim/łacińskim | Dobre (92–95%) | Doskonałe (97–99%) |
| Obsługa GPU | Tak (złożona konfiguracja CUDA) | Zoptymalizowane pod kątem procesora |
| Natywna obsługa plików PDF | Nie | Tak |
| Obsługiwane języki | 14 | 125+ |
| Licencja | Apache 2.0 (bezpłatna) | Komercyjny ($999+) |
| Pochodzenie firmy | Chiny (Baidu) | USA (Iron Software) |
Szczegółowe porównanie funkcji
| Kategoria / Funkcja | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| Konfiguracja | ||
| Pakiety NuGet | 4-5 | 1 |
| Pobieranie modelu podczas instalacji | Wymagane | W zestawie |
| Pierwsze uruchomienie z zimnego startu | 3–5 sekund | Mniej niż 1 sekunda |
| Czas instalacji | 30–60 minut | Mniej niż 5 minut |
| Zależność od OpenCV | Wymagane | None |
| Obsługa języków | ||
| Obsługiwane języki | 14 | 125+ |
| Metoda instalacji języka | Pobierz wzór | Pakiet NuGet |
| Wielojęzyczne tłumaczenie symultaniczne | Sekwencyjna zmiana modelu | Tak (AddSecondaryLanguage) |
| Dokładność w językach chińskim, japońskim i koreańskim | Doskonałe | Dobrze |
| Dokładność w języku łacińskim/angielskim | Dobrze | Doskonałe |
| Obsługa danych wejściowych | ||
| Plik graficzny | Za pośrednictwem OpenCvSharp Mat | Bezpośrednia ścieżka do pliku |
| Natywne wprowadzanie plików PDF | Nie | Tak |
| Plik PDF chroniony hasłem | Nie | Tak |
| Dane wejściowe strumienia | Pośredni | Tak |
| Wejście tablicy bajtów | Pośredni | Tak |
| Przetwarzanie wstępne | ||
| Automatyczne przetwarzanie wstępne | Nie | Tak |
| Wyrównanie | Podręcznik | Wbudowane |
| DeNoise | Podręcznik | Wbudowane |
| Wzmocnienie kontrastu | Podręcznik | Wbudowane |
| Skalowanie rozdzielczości | Podręcznik | EnhanceResolution(300) |
| Wynik | ||
| Pełny tekst | Tak | Tak |
| Wyniki według regionu/WORD | result.Regions |
result.Words, result.Lines |
| Wyniki pewności | Za region (region.Score) |
Za słowo (word.Confidence) |
| Prostokąty ograniczające | region.Rect |
word.X, word.Y, word.Width, word.Height |
| Wynik w formacie PDF z możliwością wyszukiwania | Nie | Tak |
| eksport hOCR | Nie | Tak |
| Wydajność | ||
| CPU na obraz | 300–500 ms | 150–300 ms |
| GPU na obraz | 50–100 ms (wymaga CUDA) | Nie dotyczy (zoptymalizowane pod kątem procesora) |
| Wykorzystanie pamięci | 500 MB–1 GB | 100–200 MB |
| Rozmiar wdrożenia | 300–500 MB | ~80 MB |
| Wdrożenie | ||
| Rozmiar obrazu bazowego Docker | ~1,5 GB (z bazą CUDA) | ~400 MB |
| Wielopłatformowe | Windows/Linux (częściowo) | Windows, Linux, macOS |
| Wdrożenie w środowisku izolowanym | Tak (modele do pobrania) | Tak (nie wymaga pobierania) |
| Wsparcie i licencjonowanie | ||
| Rodzaj licencji | Apache 2.0 (bezpłatna) | Wieczyste prawo do użytkowania komercyjnego |
| Wsparcie komercyjne | Społeczność/GitHub | Tak, z umową SLA |
| Firma / opiekun | Baidu / opakowanie społecznościowe | Iron Software (USA) |
| Pobieranie z NuGet | ~200 tys. | ~5.3M |
Dokładność CJK a koszt wdrożenia
Dokładność przetwarzania języków chińskiego, japońskiego i koreańskiego (CJK) to prawdziwa mocna strona PaddleOCR. W przypadku dokumentów w chińskim uproszczonym architektura CRNN oparta na głębokim uczeniu zapewnia dokładność na poziomie ponad 95% — konsekwentnie wyprzedzając silniki oparte na Tesseract w przypadku gęstych siatek znaków chińskich, układów mieszanych chińsko-angielskich oraz pionowych bloków tekstu. Jeśli głównym zadaniem projektu jest przetwarzanie chińskich faktur, umów w języku mandaryńskim lub japońskich katalogów produktów, ta przewaga w zakresie dokładności jest realna.
Podejście PaddleOCR
Chiński model działa dobrze, ponieważ sieci wykrywania i rozpoznawania zostały przeszkolone na dużych zbiorach chińskich dokumentów przez firmę Baidu, której podstawowa działalność polega na przetwarzaniu chińskich treści internetowych na dużą skalę.
// 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
Wzorzec filtracji zaufania (r.Score >= 0.8) jest ważny, ponieważ etap wykrywania głębokiego uczenia czasami oznacza regiony nie-tekstu jako tekst. Bez filtrowania w wynikach pojawiają się obszary szumu. Sortowanie według Rect.Center.Y następnie Rect.Center.X przybliża kolejność czytania, ale nie gwarantuje jej dla złożonych układów wielokolumnowych.
Podejście IronOCR
Obsługa chińskiego uproszczonego w IronOCR instaluje się jako pakiet NuGet i nie wymaga zarządzania modelami. Dokładność w przypadku dokumentów chińskich wynosi 85–90% — jest to wynik niższy niż 95%+ osiągany przez PaddleOCR w przypadku tych samych materiałów, ale wystarczający w wielu zastosowaniach produkcyjnych, zwłaszcza gdy dokumenty mają spójne formatowanie.
// 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
Dla zespołów potrzebujących wielu języków jednocześnie — takich jak mieszane dokumenty chińsko-angielskie —IronOCR obsługuje łączenie z AddSecondaryLanguage. PaddleOCR wymaga przełączania zestawów modeli między językami, co oznacza oddzielne wywołania pobierania i oddzielne instancje silnika.
Kompromis jest konkretny: PaddleOCR wygrywa pod względem czystej dokładności w językach CJK.IronOCR wygrywa pod względem dokładności w języku angielskim/łacińskim (97–99% w porównaniu z 92–95%), przetwarzania wstępnego skanów o niskiej jakości oraz prostoty obsługi wynikającej z braku konieczności zarządzania plikami modeli. Zespoły przetwarzające dokumenty w różnych językach lub głównie dokumenty w językach europejskich, z okazjonalną zawartością w językach chińskim, japońskim i koreańskim, uznają profil dokładności IronOCR za bardziej przydatny w ujęciu ogólnym. Przykłady wielojęzyczne i dotyczące przetwarzania wstępnego można znaleźć w centrum samouczków IronOCR.
Pobieranie i zarządzanie modelami
Różnica w zarządzaniu modelami między PaddleOCR a IronOCR stanowi najważniejsze odróżnienie w codziennej pracy. Ma to wpływ na pierwszą konfigurację, potoki CI/CD, obrazy Docker oraz wdrożenia w środowisku izolowanym.
Podejście PaddleOCR
PaddleOCR dostarcza modele oddzielnie od pakietu NuGet. Do przeprowadzenia pełnego procesu OCR potrzebne są trzy katalogi modeli, a każde podejście do ich pozyskiwania wiąże się z innymi kompromisami:
// 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();
Wersja modelu musi odpowiadać wersji opakowania. Gdy Sdcb.PaddleOCR aktualizuje się, wcześniej pobrane modele z poprzedniej wersji mogą wymagać ponownego pobrania. Pipeline'y CI/CD, które buforują etap przywracania NuGet, muszą również oddzielnie zarządzać buforowaniem plików modeli lub uruchamiać pobieranie modeli podczas fazy kompilacji kontenera. Porównanie obrazów Docker pokazuje konsekwencję: kontener PaddleOCR zajmuje około 1,5 GB; kontener IronOCR o wielkości około 400 MB.
Podejście IronOCR
Modele językowe IronOCRsą standardowymi pakietami NuGet. Bez wywołań pobierania, bez zarządzania katalogami modeli, bez synchronizacji wersji. Pakiet NuGet dla IronOCR zawiera model angielski; Dodatkowe pakiety językowe instaluje się dokładnie tak samo, jak każdą inną zależność.
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese
using IronOcr;
// Nie 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;
// Nie 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
Imports IronOcr
' Nie 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
Paczki językowe odtwarzają się jako część dotnet restore. Krok budowy Docker, który kopiuje katalogi models/, uruchamia apt-get install libopencv-dev i dodaje bazowy obraz CUDA po prostu nie istnieje w kontenerze IronOCR. Dla zespołów korzystających z wdrożeń Docker lub Azure różnica w złożoności tworzenia kontenerów jest znaczna.
Zależność od GPU i CUDA
Wyniki wydajności PaddleOCR na GPU — 50–100 ms na obraz w porównaniu z 300–500 ms na CPU — są prawdziwe. Modele głębokiego uczenia się czerpią znaczne korzyści z równoległości GPU w sposób, w jaki nie robią tego silniki oparte na Tesseract. W przypadku obciążenia obejmującego przetwarzanie dziesiątek tysięcy obrazów dziennie, 5-10-krotny wzrost przepustowości zmienia dyskusję na temat infrastruktury.
Podejście PaddleOCR
Wnioskowanie na GPU wymaga całkowicie oddzielnego stosu oprogramowania poza NuGet. Wymagania środowiskowe są precyzyjne i powiązane z konkretnymi wersjami:
// 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
Jeśli CUDA_PATH nie jest ustawione, brakujący jest odpowiadający plik DLL cuDNN z oczekiwanej ścieżki, lub wersja pakietu uruchomieniowego nie pasuje do zainstalowanego zestawu narzędzi CUDA, wywołanie zgłasza wyjątek ładowania biblioteki natywnej. Diagnoza tej awarii wymaga sprawdzenia wersji sterowników, wpisów w ścieżce PATH oraz obecności bibliotek DLL w kilku katalogach. W Dockerze, wsparcie GPU wymaga bazowego obrazu nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 plus nvidia-container-toolkit na hoście, co dodaje złożoności zarówno w budowie obrazu, jak i konfiguracji uruchomienia kontenera.
W przypadku wdrożeń wyłącznie na procesorach CPU PaddleOCR domyślnie korzysta ze środowiska uruchomieniowego przyspieszonego przez MKL: ~300–500 ms na obraz przy 3–5 sekundowym czasie ładowania modelu przy zimnym starcie.
Podejście IronOCR
IronOCR został zaprojektowany z myślą o przetwarzaniu na procesorze. Zapewnia 150–300 ms na obraz na standardowym sprzęcie bez zależności od GPU, bez stosu CUDA i bez problemów z wersją sterowników. Silnik uruchamia się również w mniej niż sekundę, ponieważ modele są dołączone do pakietu, a nie ładowane z dysku podczas inicjalizacji.
using IronOcr;
// Nie 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;
// Nie 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
' Nie 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
Dla przepustowości w dużej skali bez sprzętu GPU, zaprojektowanie bezpieczne dla wątków w IronOCR pozwala na Parallel.ForEach w grupie obrazów z oddzielnymi instancjami IronTesseract — każda przetwarza niezależnie bez blokowania. Przykład wielowątkowości ilustruje ten schemat. Przy 150–300 ms na obraz na 4-rdzeniowym procesorze przetwarzanie partii 100 obrazów zajmuje 20–40 sekund dzięki równoległości — przepustowość procesora sprawia, że inwestycja w GPU jest zbędna w większości scenariuszy związanych z interfejsami API sieci Web i potokami dokumentów.
Przewodnik po korekcji jakości obrazu szczegółowo opisuje konfigurację przetwarzania wstępnego w przypadkach, gdy automatyczne przetwarzanie wstępne wymaga dostosowania.
Przetwarzanie plików PDF
PaddleOCR nie obsługuje natywnie plików PDF. Każdy plik PDF przetwarzany przez PaddleOCR wymaga zewnętrznej biblioteki do konwersji stron na obrazy, zarządzania plikami tymczasowymi między konwersją a wnioskowaniem oraz logiki czyszczenia.
Podejście PaddleOCR
// 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();
// Podręcznik 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();
// Podręcznik 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
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Dim results As New StringBuilder()
' Podręcznik 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
To ponad 30 wierszy dla jednego pliku PDF. Dodanie kolejnej zależności NuGet (PdfiumViewer), ręczne renderowanie strony przy wybranej rozdzielczości DPI, tworzenie i usuwanie plików tymczasowych oraz iteracyjne gromadzenie wyników — wszystko to przed uruchomieniem samego PaddleOCR. Zbyt niska wartość DPI obniża dokładność; zbyt wysokie powoduje wydłużenie czasu przetwarzania. Decyzja należy do programisty.
Podejście IronOCR
IronOCR odczytuje pliki PDF w sposób natywny. Bez biblioteki konwersji, bez plików tymczasowych, bez pętli na stronę w miejscu wywołania:
using IronOcr;
var ocr = new IronTesseract();
// Natywne wprowadzanie plików 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();
// Natywne wprowadzanie plików 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()
' Natywne wprowadzanie plików 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
PDF-y chronione hasłem używają tej samej ścieżki LoadPdf z parametrem Password. Przewodnik w formacie PDF oraz przewodnik w formacie PDF z funkcją wyszukiwania szczegółowo opisują opcje wielostronicowe i opcje wyjściowe. Dla organizacji digitalizujących archiwa zeskanowanych dokumentów — gdzie każdy plik przychodzi w formacie PDF — ta różnica eliminuje znaczną warstwę kodu integracyjnego.
Przewodnik po mapowaniu API
| PaddleOCR (Sdcb) | Odpowiednik IronOCR | Uwagi |
|---|---|---|
Sdcb.PaddleOCR |
IronOcr |
Przestrzeń nazw |
PaddleOcrAll |
IronTesseract |
Główna klasa koordynująca OCR |
FullOcrModel |
Nie dotyczy | Brak odpowiednika — modele w pakiecie |
OnlineFullModels.ChineseV4.DownloadAsync() |
dotnet add package IronOcr.Languages.ChineseSimplified |
Pozyskiwanie modeli |
LocalDetectionModel.FromDirectory(path) |
Nie dotyczy | Brak zarządzania ścieżkami modeli |
LocalClassificationModel.FromDirectory(path) |
Nie dotyczy | Brak zarządzania ścieżkami modeli |
LocalRecognitionModel.FromDirectory(path) |
Nie dotyczy | Brak zarządzania ścieżkami modeli |
new PaddleOcrAll(models) |
new IronTesseract() |
Instancjonowanie silnika |
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) |
Nie dotyczy (zoptymalizowane pod kątem procesora) | Wybór urządzenia GPU |
Cv2.ImRead(imagePath) (OpenCvSharp) |
new OcrInput(imagePath) lub input.LoadImage(path) |
Ładowanie obrazów |
ocr.Run(mat) |
ocr.Read(input) |
Uruchom OCR |
result.Text |
result.Text |
Pełny tekst dokumentu |
result.Regions |
result.Words / result.Lines |
Obszary tekstu ustrukturyzowanego |
region.Text |
word.Text |
Tekst z regionu |
region.Score |
word.Confidence |
Wartość pewności (0-1 vs 0-100) |
region.Rect.Center.X / .Center.Y |
word.X / word.Y |
Pozycja ramki ograniczającej |
region.Rect.Size.Width / .Height |
word.Width / word.Height |
Wymiary ramki ograniczającej |
AllowRotateDetection = true |
input.Deskew() |
Obsługa rotacji |
Enable180Classification = true |
Automatyczne | Wykrywanie tekstu odwróconego do góry nogami |
| Nie dotyczy | input.DeNoise() |
Usuwanie szumów |
| Nie dotyczy | input.Contrast() |
Wzmocnienie kontrastu |
| Nie dotyczy | input.EnhanceResolution(300) |
Skalowanie DPI |
| Nie dotyczy | input.LoadPdf(path) |
Natywne wprowadzanie plików PDF |
| Nie dotyczy | result.SaveAsSearchablePdf(path) |
Wynik w formacie PDF z możliwością wyszukiwania |
| Nie dotyczy | ocr.AddSecondaryLanguage(lang) |
Wiele języków jednocześnie |
Kiedy zespoły rozważają przejście z PaddleOCR na IronOCR
Kiedy wymagania językowe wykraczają poza 14
Projekt rozpoczyna przetwarzanie chińskich faktur — PaddleOCR radzi sobie z tym dobrze. Następnie baza klientów rozszerza się i dokumenty pojawiają się w języku polskim, holenderskim, greckim, wietnamskim i tureckim. Żaden z 14 języków obsługiwanych przez PaddleOCR nie obejmuje żadnego z nich. Migracja staje się konieczna, ponieważ narzędzie nie jest w stanie rozwijać się wraz z rosnącymi wymaganiami użytkowników. Dodanie obsługi języka polskiego w IronOCR wymaga jedynie dodania jednego pakietu NuGet i zmiany konfiguracji w jednym wierszu. Zespoły, które określają zakres projektu jako "początkowo skupiony na języku chińskim, ale ostatecznie wieloregionalny", muszą z góry zdecydować, czy rozpocząć pracę od narzędzia, które umożliwia skalowanie obsługiwanych języków bez konieczności przepisywania kodu.
Kiedy koszt wdrożenia przekracza budżet przeznaczony na rozwiązanie problemu
Dokumentacja PaddleOCR szacuje, że pierwsza konfiguracja zajmuje 30–60 minut w przypadku procesora CPU i 2–8 godzin w przypadku procesora graficznego GPU. Koszt pracy programisty wynoszący 100 USD/godz. oznacza, że pierwsza próba konfiguracji GPU kosztuje 200–800 USD, zanim zostanie przetworzony pierwszy obraz produkcyjny. Konfiguracja IronOCR to jedno polecenie instalacyjne i czterowierszowy przykład kodu — zajmuje to mniej niż pięć minut. W przypadku narzędzi wewnętrznych, prototypów lub projektów, w których OCR jest funkcją drugorzędną, a nie podstawowym produktem, ta różnica czasowa decyduje o tym, czy funkcja OCR zostanie dostarczona w bieżącym sprincie, czy też zostanie odłożona na dalszy plan. Rozpoczęcie pracy z IronOCR zajmuje mniej czasu niż konfiguracja środowiska CUDA.
Kiedy dominują procesy oparte na plikach PDF
Organizacje zajmujące się digitalizacją archiwów zeskanowanych dokumentów, przetwarzaniem faksów do formatu PDF lub wyodrębnianiem danych z faktur i umów w formacie PDF napotykają problem strukturalny związany z PaddleOCR: każdy plik PDF wymaga dodatkowej biblioteki, ręcznego renderowania stron, zarządzania plikami tymczasowymi oraz logiki wyboru DPI, zanim PaddleOCR będzie mógł go przetworzyć. Nie jest to przypadkowa złożoność — to stała konserwacja. Zespoły, które po wstępnej integracji z PaddleOCR odkrywają, że ponad 80% ich pracy opiera się na plikach PDF, zazwyczaj decydują się na migrację, gdy warstwa konwersji PDF staje się źródłem błędów, a nie gdy zawodzi sam PaddleOCR.
Gdy przeglądy zgodności wskazują na pochodzenie z Baidu
Zespoły ds. bezpieczeństwa w organizacjach rządowych, obronnych, służbie zdrowia i usługach finansowych coraz częściej stosują kryteria weryfikacji w odniesieniu do komponentów pochodzących od firm powiązanych z chińskim rządem. PaddleOCR to projekt firmy Baidu; Pobieranie modeli domyślnie łączy się z Baidu Cloud Storage; Framework PaddlePaddle jest produktem firmy Baidu. Kod działa lokalnie, a dokumenty nie są przesyłane, ale artefakty modelu pochodzą z infrastruktury Baidu. W środowiskach FedRAMP, ITAR lub CMMC pochodzenie danych powoduje przeprowadzenie kontroli zgodności, która może zablokować wdrożenie.IronOCR to produkt firmy Iron Software z siedzibą w USA, który przetwarza całą zawartość lokalnie, nie nawiązuje żadnych połączeń zewnętrznych i nie wymaga pobierania modeli z serwerów stron trzecich.
Gdy infrastruktura GPU nie jest dostępna
PaddleOCR na procesorze (300–500 ms/obraz, 3–5 sekund uruchamiania na zimno, 500 MB–1 GB pamięci) jest wolniejsze i bardziej obciążające niżIronOCR na procesorze (150–300 ms/obraz, poniżej 1 sekundy uruchamiania na zimno, 100–200 MB pamięci). Zaleta PaddleOCR związana z wykorzystaniem procesora graficznego (GPU) ujawnia się dopiero po skonfigurowaniu CUDA/cuDNN, a ta zaleta uzasadnia złożoność operacyjną tylko w przypadku dużych wolumenów. Zespoły korzystające ze standardowej infrastruktury chmurowej bez instancji GPU — EC2 bez GPU, Azure App Service, AWS Lambda — ponoszą koszty konfiguracji PaddleOCR, nie uzyskując w zamian korzyści wydajnościowych, które by to uzasadniały.
Typowe kwestie związane z migracją
Zastąpienie pakietów i przestrzeni nazw
Zmiana pakietu usuwa pięć zależności i dodaje jedną. Usuń Sdcb.PaddleOCR, Sdcb.PaddleOCR.Models.Online, pakiet Sdcb.PaddleInference.runtime.*, OpenCvSharp4 oraz OpenCvSharp4.runtime.win z .csproj. Dodaj IronOcr. Dodaj pakiety językowe jako pakiety NuGet dla każdego języka innego niż angielski, który wcześniej korzystał z pobranego zestawu modeli.
Dyrektywy using Sdcb.PaddleOCR i using OpenCvSharp zastąpiono przez using IronOcr. Wzorzec Mat mat = Cv2.ImRead(path) zastąpiono przez new OcrInput(path) lub input.LoadImage(path). Wywołanie ocr.Run(mat) staje się ocr.Read(input). Dla projektów korzystających z API wejścia obrazów, obiekt OcrInput akceptuje ścieżki plików, tablice bajtów, strumienie i System.Drawing.Bitmap — pośrednik OpenCvSharp znika całkowicie.
Przekształcenie struktury wyników
PaddleOCR zwraca result.Regions — tablicę obiektów PaddleOcrResultRegion, gdzie region.Score jest liczbą zmiennoprzecinkową od 0 do 1.IronOCR zwraca result.Words — gdzie word.Confidence jest procentem od 0 do 100. Filtr zaufania r.Score >= 0.8 mapuje do w.Confidence >= 80. Dostęp do ramki ograniczającej zmienia się z region.Rect.Center.X / region.Rect.Size.Width na word.X / word.Width. Przewodnik po wynikach strukturalnych obejmuje strony, akapity, wiersze i słowa.
Sortowanie przestrzenne (sortowanie według Y, a następnie X w celu przybliżenia kolejności czytania) jest rzadziej potrzebne w przypadku IronOCR, ponieważ silnik układu Tesseract wykonuje analizę kolejności czytania w ramach etapu segmentacji strony. W przypadku dokumentów, w których PaddleOCR wymagało jawnej logiki sortowania, przed przeniesieniem kodu sortowania należy sprawdzić, czy domyślna kolejność wyjściowa IronOCR już spełnia wymagania.
Przetwarzanie wstępne Przejście
Model wykrywania oparty na głębokim uczeniu się PaddleOCR toleruje umiarkowane pogorszenie jakości obrazu — sieć neuronowa radzi sobie z zakłóceniami i przekrzywieniem bardziej niezawodnie niż klasyczny proces segmentacji Tesseract. Podczas migracji do IronOCR należy dodać wyraźne przetwarzanie wstępne dla dokumentów, które wcześniej były przetwarzane pomyślnie bez niego:
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
W przypadku dokumentów zeskanowanych pod niestandardowymi kątami lub z zakłóceniami w tle te cztery filtry pozwalają w znacznym stopniu zniwelować różnice w dokładności. Przewodnik po korekcji orientacji obrazu oraz przewodnik po korekcji kolorów obrazu opisują wpływ każdego z filtrów na typowe artefakty skanowania. Przed sfinalizowaniem migracji należy przetestować reprezentatywne dokumenty w obu procesach, aby sprawdzić, czy dokładność spełnia wymagania w odniesieniu do rzeczywistego zestawu dokumentów.
Porządkowanie wdrożenia
Po migracji rozmiar artefaktu wdrożeniowego znacznie się zmniejsza. Usuń drzewo katalogu models/ (trzy podkatalogi, ~21MB plików modelu), paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB) oraz pliki opencv_world*.dll (~50MB łącznie). Usuń linię apt-get install libopencv-dev z pliku Dockerfile oraz krok kopiowania modelu. Usuń wszelkie kroki CI/CD, które wstępnie pobierają modele lub buforują katalogi modeli. Rozmiar obrazu Docker zmniejsza się z ~1,5 GB do ~400 MB.
Dodatkowe możliwości IronOCR
Oprócz wymienionych powyżej punktów porównawczych,IronOCR oferuje funkcje, które rozszerzają możliwości OCR poza wyodrębnianie tekstu:
- Odczytywanie kodów kreskowych podczas OCR: Ustaw
ocr.Configuration.ReadBarCodes = true, a kody kreskowe w tym samym dokumencie są dekodowane razem z tekstem w jednym przebiegu — nie jest potrzebna oddzielna biblioteka kodów kreskowych - OCR oparty na regionach: Użyj
CropRectangle, aby celować w określone strefy dokumentu (pole z numerem faktury, wiersz nagłówka, blok podpisu) bez przetwarzania pełnej strony - Async OCR: Pełna obsługa async/await dla integracji bezblokującej w kontrolerach ASP.NET i usługach działających w tle
- Ocena pewności: pewność na poziomie dokumentu i słowa umożliwia kontrolę jakości — odrzucanie lub oznaczanie wyników o niskim poziomie pewności do weryfikacji przez człowieka
- Eksport hOCR: Generowanie danych wyjściowych hOCR dla dalszych systemów zarządzania dokumentami, które wykorzystują HTML pozycjonalny
- Rozpoznawanie pisma ręcznego: wykracza poza OCR dokumentów pisanych na klawiaturze, obejmując formularze i notatki pisane odręcznie
- Pobieranie tabel: ustrukturyzowane pobieranie danych tabelarycznych z faktur, wyciągów i formularzy
- Śledzenie postępów: Raportowanie postępów OCR w przypadku długich, wielostronicowych operacji wsadowych w kontekstach interfejsu użytkownika
Zgodność z platformą .NET i gotowość na przyszłość
IronOCR jest przeznaczony dla platform .NET 6, 7, 8 i 9 w systemach Windows x64, Windows x86, Linux x64 i macOS. Działa na Azure App Service, AWS Lambda, kontenerach Docker oraz w lokalnych środowiskach odizolowanych — wszystko z tego samego pakietu NuGet. Biblioteka jest regularnie aktualizowana przez Iron Software zgodnie z cyklem wydawniczym platformy .NET, w tym planowaną kompatybilnością z .NET 10 po jego wydaniu. Owijka .NET dla PaddleOCR jest projektem utrzymywanym przez społeczność; Kompatybilność z nowymi wersjami .NET zależy od możliwości pojedynczego opiekuna projektu. Harmonogram wydawania opakowania oraz trzymiesięczne opóźnienie w udostępnianiu nowych wersji modelu PaddleOCR dla języka Python w środowisku .NET ilustrują zależność od dostępności społeczności, a nie od zobowiązań dotyczących komercyjnych wydań.
Wnioski
Przewaga PaddleOCR w zakresie dokładności przetwarzania tekstu w językach chińskim, japońskim i koreańskim jest rzeczywista i konkretna. W przypadku projektu, którego głównym obciążeniem są dokumenty w języku chińskim uproszczonym, a którego zespół posiada głęboką wiedzę specjalistyczną w zakresie uczenia głębokiego oraz istniejącą infrastrukturę GPU, koszt konfiguracji wielu pakietów oraz złożoność konfiguracji CUDA są uzasadnione wynikami dokładności, których silniki oparte na Tesseract nie są obecnie w stanie osiągnąć w zakresie rozpoznawania gęstych znaków chińskich.
Problem polega na tym, że ten konkretny scenariusz opisuje tylko niewielką część przypadków użycia OCR w środowisku .NET. Większość komercyjnych aplikacji przetwarza dokumenty w języku angielskim i językach europejskich, gdzie dokładnośćIronOCR wynosząca 97–99% przewyższa dokładność PaddleOCR wynoszącą 92–95%. Większość zespołów programistycznych nie ma wstępnie skonfigurowanej infrastruktury CUDA. Większość procesów przetwarzania dokumentów przyjmuje pliki PDF, których PaddleOCR nie może przetworzyć bez dodatkowej biblioteki. Większość programistów pracujących nad projektem .NET oczekuje, że instalacja jednego pakietu będzie kompletnym krokiem instalacyjnym — a nie pierwszym z pięciu pakietów, po którym następuje asynchroniczne pobieranie modelu i zależność od OpenCV.
W przypadku zespołów, które potrzebują przepustowości GPU na dużą skalę, wydajność PaddleOCR na procesorze (300–500 ms) już teraz pozostaje w tyle za wydajnościąIronOCR na procesorze (150–300 ms) — co oznacza, że jedynym scenariuszem, w którym argument dotyczący wydajności PaddleOCR ma sens, jest sytuacja, w której infrastruktura CUDA już działa. Koszt licencji wieczystej IronOCR zwraca się zazwyczaj w ciągu pierwszego tygodnia, jeśli weźmie się pod uwagę sam czas potrzebny na konfigurację GPU.
Pierwszym pytaniem jest to, czy dokładność chińskich znaków na poziomie 95%+ uzasadnia stosowanie pełnego stosu, który to zapewnia. W przypadku zadań wykonywanych głównie w języku chińskim w środowiskach z infrastrukturą GPU i zgodnością z przepisami dotyczącymi oprogramowania pochodzącego z Baidu, odpowiedź brzmi: tak. Co więcej,IronOCR zaczyna działać w mniej niż pięć minut i spełnia wymagania dotyczące języka, przetwarzania wstępnego i plików PDF, z którymi faktycznie spotyka się większość projektów OCR w środowisku .NET.
Często Zadawane Pytania
Czym jest PaddleOCR?
PaddleOCR to rozwiązanie OCR wykorzystywane przez programistów i przedsiębiorstwa do wyodrębniania tekstu z obrazów i dokumentów. Jest to jedna z kilku opcji OCR ocenianych obok IronOCR for .NET pod kątem tworzenia aplikacji .NET.
Jak IronOCR wypada w porównaniu z PaddleOCR for .NET dla programistów .NET?
IronOCR to natywna dla NuGet biblioteka OCR dla platformy .NET, wykorzystująca IronTesseract jako główny silnik. W porównaniu z PaddleOCR oferuje prostsze wdrożenie (brak instalatorów SDK), stałą cenę oraz przejrzysty interfejs API w języku C# bez interoperacyjności COM i zależności od chmury.
Czy IronOCR jest łatwiejszy w konfiguracji niż PaddleOCR?
IronOCR instaluje się za pomocą jednego pakietu NuGet. Nie ma żadnych instalatorów SDK, plików licencyjnych do skopiowania, komponentów COM do zarejestrowania ani oddzielnych plików binarnych środowiska uruchomieniowego, którymi trzeba by zarządzać. Cały silnik OCR jest zawarty w pakiecie.
Jakie różnice w dokładności występują między PaddleOCR a IronOCR?
IronOCR osiąga wysoką dokładność rozpoznawania standardowych dokumentów biznesowych, faktur, paragonów i zeskanowanych formularzy. W przypadku dokumentów o bardzo niskiej jakości lub rzadkich skryptów dokładność zależy od jakości źródła. IronOCR zawiera filtry wstępnego przetwarzania obrazu, które poprawiają rozpoznawanie danych wejściowych o niskiej jakości.
Czy IronOCR obsługuje wyodrębnianie tekstu z plików PDF?
Tak. IronOCR wyodrębnia tekst zarówno z natywnych plików PDF, jak i ze skanowanych obrazów PDF za pomocą jednego wywołania. Obsługuje również wielostronicowe pliki TIFF, obrazy i strumienie. W przypadku skanowanych plików PDF OCR jest stosowany strona po stronie, z obiektami wynikowymi dla każdej strony.
Jak licencjonowanie PaddleOCR wypada w porównaniu z IronOCR?
IronOCR korzysta z licencji wieczystej o stałej stawce, bez opłat za stronę lub skan. Organizacje przetwarzające duże ilości dokumentów płacą ten sam koszt licencji niezależnie od ilości. Szczegóły i ceny hurtowe znajdują się na stronie licencji IronOCR.
Jakie języki obsługuje IronOCR?
IronOCR obsługuje 127 języków za pośrednictwem oddzielnych pakietów językowych NuGet. Dodanie języka wymaga wykonania pojedynczego polecenia „dotnet add package IronOcr.Languages.{Language}”. Nie jest wymagane ręczne umieszczanie plików ani konfiguracja ścieżek.
Jak zainstalować IronOCR w projekcie .NET?
Instalacja przez NuGet: „Install-Package IronOcr” w konsoli menedżera pakietów lub „dotnet add package IronOcr” w CLI. Dodatkowe pakiety językowe instaluje się w ten sam sposób. Nie jest wymagany natywny instalator SDK.
Czy IronOCR nadaje się do wdrożeń w Dockerze i kontenerach, w przeciwieństwie do PaddleOCR?
Tak. IronOCR działa w kontenerach Docker za pośrednictwem pakietu NuGet. Klucz licencyjny jest ustawiany za pomocą zmiennej środowiskowej. Silnik OCR nie wymaga żadnych plików licencyjnych, ścieżek SDK ani montowania woluminów.
Czy mogę wypróbować IronOCR przed zakupem, w porównaniu z PaddleOCR?
Tak. Tryb próbny IronOCR przetwarza dokumenty i zwraca wyniki OCR z nakładką znaku wodnego na wyjściu. Przed zakupem licencji można sprawdzić dokładność na własnych dokumentach.
Czy IronOCR obsługuje odczytywanie kodów kreskowych oprócz wyodrębniania tekstu?
IronOCR koncentruje się na wyodrębnianiu tekstu i OCR. Do odczytu kodów kreskowych firma Iron Software udostępnia bibliotekę IronBarcode jako dodatek. Obie biblioteki są dostępne osobno lub w ramach pakietu Iron Suite.
Czy łatwo jest przejść z PaddleOCR na IronOCR?
Migracja z PaddleOCR do IronOCR zazwyczaj obejmuje zastąpienie sekwencji inicjalizacyjnych instancjonowaniem IronTesseract, usunięcie zarządzania cyklem życia COM oraz aktualizację wywołań API. Większość migracji znacznie zmniejsza złożoność kodu.

