C# Kullanarak Daha İyi OCR Sonuçları için Görüntü Kalitesini Artırma
.NET geliştiricilerini IronOCR'a tam bir geçiş sürecinden geçiren bu kılavuz, Sdcb.PaddleOCR paket ailesinden nasıl geçileceğini açıklar. Tam değiştirme yolunu kapsar: çok paketli PaddlePaddle yığınını kaldırma, model dosyası yönetimini ve GPU yapılandırmasını ortadan kaldırma ve OpenCV bağımlı sonuç çıkarma boru hattını tek bir NuGet yüklemesi ile değiştirme. Her bölüm, kendine yeterlidir — karşılaştırma makalesinin önceden okunması gerekmez.
PaddleOCR'den Neden Geçiş Yapmalısınız
Sdcb.PaddleOCR kaplaması, PaddlePaddle'ın Python derin öğrenme ekosistemi ile .NET arasında topluluk tarafından desteklenen bir köprüdür. İşini yapar, ancak o köprünün tüm yükünü taşır — model dosyaları, yerel sonuç çıkarma ikili dosyaları, görüntü yükleme için OpenCV ve isteğe bağlı CUDA altyapısı. Çoğu .NET OCR iş yükü için, bu proje için hiç gerek duyulmayan bir altyapıdır.
Tek Karakter Okunmadan Önce Üç Model Dizini. PaddleOCR'un sonuç çıkarma boru hattı, üç sinir ağı zincirler: bir tespit modeli, bir yön sınıflandırma modeli ve bir tanıma modeli. Her ağ, diskte var olması gereken .pdmodel ve .pdiparams dosyalarının ayrı bir dizinidir, böylece new PaddleOcrAll(models) çalışan bir motor haline gelir. Bu dosyalar, Baidu'nun Çin'deki bj.bcebos.com depolamasına bağlanan bir asenkron indirme çağrısı yoluyla veya elle bakılan bir models/ dizin ağacı yoluyla gelir, modelin sürüm kontrolü geliştiricinin sorumluluğundadır. Sdcb.PaddleOCR güncelleme yaptığında, önceki sürümden indirilen modelleri tekrar indirmeniz gerekebilir. IronOCR, model dosyaları, model dizinleri ve sürüm senkronizasyonu sorunu içermez. Motor, NuGet paketine dahil edilir.
OpenCV Zorunludur. Bir dosya yolundan PaddleOCR tahmini aşamasına OpenCvSharp'ı devre dışı bırakarak geçiş yapmak mümkün değildir. Format ne olursa olsun her resim, Cv2.ImRead(path) aracılığıyla bir Mat nesnesi haline gelmeden önce geçmelidir ve ocr.Run(mat) bunu kabul edebilir. Bu, iki ekstra NuGet paketini (OpenCvSharp4 ve OpenCvSharp4.runtime.win), dağıtım çıktısında platforma özgü yerel DLL'leri ve Dockerfile'da bir apt-get install libopencv-dev satırını ifade eder. IronOCR, dosya yollarını, akışları, bayt dizilerini ve System.Drawing.Bitmap doğrudan kabul eder. Mat aracı mevcut değildir.
GPU Yapılandırması Çok Günlük Bir Projedir. PaddleOCR'un ilan edilen GPU performans rakamları — resim başına 50-100ms, CPU üzerinde 300-500ms'ye karşı — gerçektir. Bunu başarmak belirli bir sürümde NVIDIA sürücüleri, CUDA Toolkit 11.8 (12.x değil), doğru PATH konumlarına yerleştirilmiş cuDNN 8.6+ ve ayrı bir GPU çalışma zamanı NuGet paketi gerektirir. Docker'da, temel görüntü nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 olmalı ve ana makine nvidia-container-toolkit kurulu olmalıdır. Varlıklı olmayan GPU altyapısına sahip ekipler, ortam başına CUDA yapılandırması için 2-8 saat harcar. IronOCR, CPU sonuç çıkarma için tasarlandı, standart donanımda görüntü başına 150-300ms sunar ve GPU ayarı gerektirmez.
Dağıtım Artifaktları 4-6 kat Daha Büyük. PaddleOCR dağıtım çıktısı, paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB), opencv_world*.dll dosyaları (~50MB toplam) ve model dizinlerini (~21MB) içerir. Bir Docker görüntüsü yaklaşık 1.5GB ulaşıyor. Bir IronOCR dağıtımı toplamda yaklaşık 80MB'dir; Docker görüntüsü yaklaşık 400MB ulaşıyor. Fark, CI/CD'de birleşir: NuGet paketlerini geri yükleyen her boru hattı çalıştırması, Baidu'dan modelleri indirmeniz veya ayrı bir önbellek katmanından çekmeniz gerekir.
Aranabilir bir PDF Çıkışı Yok. PaddleOCR, görüntülerden metin bölgelerini geri döndürür ve tanınan metni PDF'ye aranabilir bir katman olarak yerleştirme mekanizmasına sahip değildir. PaddleOCR çıktısından aranabilir bir PDF oluşturma, üçüncü taraf bir PDF kütüphanesi, sayfa bazında metin katmanı ekleme ve koordinat yeniden eşleme gerektirir. IronOCR, sadece bir satırla tamamen aranabilir bir PDF üretir: result.SaveAsSearchablePdf("output.pdf").
Temel Sorun
PaddleOCR, sonuç çıkarma başlamadan önce üç model dizini gerektirir:
// PaddleOCR: three model directories, all must exist and match the wrapper version
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"), // ~5MB
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"), // ~2MB
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer") // ~15MB
);
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("document.png"); // OpenCvSharp required for every image
PaddleOcrResult result = ocr.Run(mat);
IronOCR'un model dosyaları, model dizinleri veya OpenCV bağımlılığı yoktur:
// IronOCR: one package, zero model management
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
IronOCR vs PaddleOCR (.NET): Özellik Karşılaştırması
Aşağıdaki tablo, geçiş planlamasında en önemli olan boyutları kapsar.
| Özellik | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| NuGet paketleri gerekli | 4-5 | 1 |
| Model dosyaları gerekli | Evet (3 dizin, ~21MB) | Hayır (pakette dahil) |
| Model indirme kaynağı | Baidu sunucuları (bj.bcebos.com) | NuGet geri yükleme (Iron Software) |
| OpenCV bağımlılığı | Gerekli (OpenCvSharp4) | None |
| Görüntü girişi | Via Mat mat = Cv2.ImRead() | Doğrudan dosya yolu, akış, bayt dizisi |
| Yerel PDF girişi | Hayır | Evet (input.LoadPdf()) |
| Aranabilir PDF çıktısı | Hayır | Evet (result.SaveAsSearchablePdf()) |
| Çoklu-çerçeve TIFF girişi | Çerçeve başına manuel döngü | input.LoadImageFrames() |
| GPU desteği | Evet (CUDA 11.8 + cuDNN gerekli) | CPU'ya optimize edilmiş (GPU gerekmez) |
| Dahili ön işleme | Hayır (sinir ağı çarpıklık/gürültü ile başa çıkar) | Evet (Deskew, DeNoise, Kontrast, Binarize, Keskinleştir) |
| Desteklenen diller | 14 | 125+ |
| Dil yükleme yöntemi | Her dil modeli için DownloadAsync() | dotnet add package IronOcr.Languages.* |
| Çoklu dil aynı anda | Hayır (ayrı dil başına model) | Evet (OcrLanguage.English + OcrLanguage.French) |
| Yapılandırılmış çıktı | result.Regions (mekansal, sıralanmamış) | Sayfalar, Paragraflar, Satırlar, Kelimeler, Karakterler |
| Güven puanlama | Bölge başına kayan nokta (0-1) | Kelime başına yüzde (0-100) |
| Barkod okuma | Hayır | Evet (ocr.Configuration.ReadBarCodes = true) |
| hOCR içeri aktarma | Hayır | Evet |
| Dağıtım boyutu | 300-500MB | ~80MB |
| Docker görüntü boyutu | ~1.5GB (CUDA tabanlı) | ~400MB |
| Soğuk başlatma zamanı | 3-5 saniye (model yükleme) | 1 saniyeden az |
| Çapraz platform | Windows, Linux (kısmi) | Windows, Linux, macOS, Docker, Azure, AWS |
| .NET uyumluluğu | .NET 6+ (topluluk sarmalayıcısı) | .NET Framework 4.6.2+, .NET 5/6/7/8/9 |
| Ticari destek | Topluluk / GitHub sorunları | Evet (Iron Software, SLA ile birlikte) |
| Lisans | Apache 2.0 (ücretsiz) | Süresiz ($999 Lite / $1,499 Pro / $2,999 Enterprise) |
Hızlı Başlangıç: PaddleOCR (.NET) to IronOCR Geçişi
Adım 1: NuGet Paketlerini Değiştirin
PaddleOCR ile ilgili beş paketin hepsini kaldırın:
dotnet remove package Sdcb.PaddleOCR
dotnet remove package Sdcb.PaddleOCR.Models.Online
dotnet remove package Sdcb.PaddleInference.runtime.win64.mkl
dotnet remove package OpenCvSharp4
dotnet remove package OpenCvSharp4.runtime.win
GPU çalışma zamanı yüklüyse, onu da kaldırın:
dotnet remove package Sdcb.PaddleInference.runtime.win64.cuda118
NuGet paketi sayfasından IronOCR yükleyin:
Adım 2: Ad Alanlarını Güncelleyin
PaddleOCR ve OpenCvSharp ad alanı içe aktarmalarının hepsini değiştirin:
// Before (PaddleOCR)
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
// After (IronOCR)
using IronOcr;
Adım 3: Lisansa İzin Verin
Herhangi bir IronTesseract örneği oluşturulmadan önce, uygulama başlatıldığında lisans başlatma ekleyin:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Ücretsiz bir deneme anahtarı IronOCR lisanslama sayfasından mevcuttur. Deneme, filigranlı çıktı üretir ve satın almadan önce tam özellik testi yapılmasına izin verir.
Kod Göç Örnekleri
Yerel Model Yolu Yapılandırmasının Ortadan Kaldırılması
Çalışma zamanında Baidu sunucu bağlantılarını önlemek için PaddleOCR model dosyalarını önceden indiren projeler, üç ayrı dizin yolunu yapılandırmalıdır. Bu yapılandırma, sarmalayıcı sürümü değiştiğinde güncellenmelidir.
PaddleOCR Yaklaşımı:
// Local model configuration — developer owns the directory structure
// Each wrapper update may require re-downloading model files
string modelsRoot = Path.Combine(AppContext.BaseDirectory, "models");
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_det_infer")),
LocalClassificationModel.FromDirectory(
Path.Combine(modelsRoot, "ch_ppocr_mobile_v2.0_cls_infer")),
LocalRecognitionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_rec_infer"))
);
// Fails at runtime if any of the three directories is missing or stale
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("document.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
IronOCR Yaklaşımı:
//Hayırmodel directories, no path configuration, no version matching
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
models/ dizin ağacı, üç FromDirectory() çağrısı ve sürüm senkronizasyon kaygısı tamamen ortadan kalkar.IronOCR motoru, geri yükleme sırasında NuGet paketinin içinde yer alır ve çalışma zamanı yol çözümlemeleri gerektirmez. Lisans anahtarını appsettings.json yerine koymayı da içeren başlatma seçenekleri için IronTesseract kurulum kılavuzu'na bakın.
İki Aşamalı Tespit ve Tanıma Boru Hattı Konsolidasyonu
PaddleOCR'un döndürme ve yönlendirme altyapısı, PaddleOcrAll üzerindeki özellikler aracılığıyla yapılandırılır. Bu davranış IronOCR'da OcrInput ön işleme yöntemlerini kullanarak çoğaltılır, bu yöntemler aynı belge sorunlarını daha basit bir çağrı yüzeyi ile ele alır.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Separate async initialization step — blocks startup for 3-5 seconds on cold run
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true, // Enables 0/90/180/270 degree rotation detection
Enable180Classification = true // Additional pass for upside-down text
};
// OpenCV Mat required — no direct file path support
using Mat mat = Cv2.ImRead("rotated-scan.png");
if (mat.Empty())
{
throw new FileNotFoundException("Image could not be loaded by OpenCvSharp");
}
// Three neural network passes: detection → classification → recognition
PaddleOcrResult result = ocr.Run(mat);
// Regions arrive in spatial order, not reading order
// Manual sort required for top-to-bottom, left-to-right output
var orderedRegions = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in orderedRegions)
{
Console.WriteLine($"{region.Text} (confidence: {region.Score:P1})");
}
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("rotated-scan.png");
input.Deskew(); // Corrects rotation and skew automatically
var result = ocr.Read(input);
// Output is already in reading order — no sort needed
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
Console.WriteLine($"{line.Text} (confidence: {line.Confidence}%)");
}
}
IronOCR'un Deskew() yöntemi, döndürme tespitini ön işleme hattının bir parçası olarak ele alır. Sonucun Lines koleksiyonu, Tesseract düzen motoru tarafından okuma sırasına göre teslim edilir ve manuel sıralama modelini ortadan kaldırır. görüntü yönü düzeltme rehberi, dönme ve eğilme seçeneklerinin tam yelpazesini belgeler.
GPU ve CPU Cihaz Seçiminin Kaldırılması
GPU tahmini çalıştıran PaddleOCR uygulamaları, en büyük geçiş yüzeyine sahiptir: GPU çalışma zamanı NuGet paketi, CUDA/cuDNN ortam ön gereksinimleri ve PaddleDevice.Gpu() yapılandırma çağrısı. Bunların hepsi geçiş sırasında kaldırılır.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference; // GPU configuration namespace
using OpenCvSharp;
// Prerequisites must exist on every deployment environment:
// - NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// - CUDA Toolkit 11.8 (not 12.x — version must match exactly)
// - cuDNN 8.6.0+ placed in CUDA bin directory
// - dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB initial memory pool
// Throws native load exception if CUDA_PATH not set or cuDNN DLL missing
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("scanned-batch.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine($"Text regions: {result.Regions.Length}");
Console.WriteLine(result.Text);
IronOCR Yaklaşımı:
IronOCR yaklaşımı yukarıdaki örnekle aynıdır; IronTesseract bu senaryoyu aynı API çağrısı ile ele alır. Herhangi bir GPU paketi, CUDA ön koşulu ve cihaz seçimi gerekmez. new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))'yi new IronTesseract() ile değiştirin ve GPU ile ilgili tüm yapılandırmaları kaldırın.
IronOCR, CPU üzerinde görüntü başına 150-300ms sunar — PaddleOCR'a göre CPU üzerinde daha hızlı (300-500ms) ve herhangi bir GPU altyapısı olmadan çoğu web API'si ve belge boru hattı iş yükleri için yeterlidir. Yüksek geçiş senaryoları için, hız optimizasyonu rehberi iletişim seçeneklerini kapsar, iş parçacığı yönetimi ve sayfa bölümlendirme modu ayarlamalarını.
Yapılandırılmış Belge Verisi Çıkarımı
PaddleOCR, PaddleOcrResultRegion nesnelerinin düz bir dizisini döndürür, bunlar okuma akışına göre değil mekansal olarak sıralanmıştır. Paragraf seviyesi veya satır seviyesi yapı çıkarımı, sınır kutusu yakınlığına dayalı manuel gruplama mantığı gerektirir. IronOCR, okuma sırası garantili bir hiyerarşik sonuç ağacı sağlar.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Collections.Generic;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("invoice.png");
PaddleOcrResult result = ocr.Run(mat);
//Hayırparagraph or line grouping — must implement manually
// Group regions into lines by proximity on the Y axis
var lineGroups = new Dictionary<int, List<PaddleOcrResultRegion>>();
foreach (var region in result.Regions)
{
// Round Y center to nearest 15 pixels to approximate line grouping
int lineKey = (int)(region.Rect.Center.Y / 15) * 15;
if (!lineGroups.ContainsKey(lineKey))
lineGroups[lineKey] = new List<PaddleOcrResultRegion>();
lineGroups[lineKey].Add(region);
}
// Sort lines top to bottom, then regions left to right within each line
foreach (var line in lineGroups.OrderBy(kv => kv.Key))
{
var lineText = string.Join(" ", line.Value
.OrderBy(r => r.Rect.Center.X)
.Select(r => r.Text));
Console.WriteLine(lineText);
}
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");
var result = ocr.Read(input);
// Hierarchical structure: Pages → Paragraphs → Lines → Words → Characters
// All delivered in reading order by the layout engine
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber} — {page.Words.Count} words");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y}):");
Console.WriteLine($" {paragraph.Text}");
}
}
Manuel satır gruplama yaklaşıklığı — Y koordinatlarını piksel kova büyüklüğüne yuvarlama — Tesseract yerleşim motorunun yerleşik paragraf bölümlendirmesi ile değiştirilir. Bağıntı kutusu koordinatları, paragraph.X, paragraph.Y, paragraph.Width ve paragraph.Height aracılığıyla hiyerarşinin her seviyesinde mevcuttur. yapılandırılmış sonuç rehberi ve görüntüden yazı okuma eğitimi, tam sonuç ağacı kapsamını içerir.
Aranabilir PDF Oluşturma
PaddleOCR, herhangi bir PDF çıktısı üretmez. PaddleOCR sonuçlarından aranabilir bir PDF oluşturmak, ayrı bir PDF kütüphanesi, region.Rect'den PDF sayfa birimlerine manuel koordinat eşlemesi ve bir görünmez metin katmanı enjeksiyonu gerektirir. IronOCR, OCR sonucundan doğrudan aranabilir bir PDF üretir.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Requires additional package: PdfSharp, iTextSharp, or similar
// Manual coordinate remapping from OpenCV pixel space to PDF point space
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("scanned-page.png");
PaddleOcrResult paddleResult = ocr.Run(mat);
//Hayırbuilt-in searchable PDF output — must build with external library
// region.Rect coordinates are in pixel space, PDF uses points (1 point = 1/72 inch)
// DPI conversion required for coordinate mapping
float dpiScale = 72.0f / 96.0f; // Assuming 96 DPI source image
// ... hundreds of lines of PDF construction code using external library ...
// This is permanent maintenance, not a one-time cost
Console.WriteLine("Searchable PDF output requires external PDF library and coordinate mapping.");
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-page.png");
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Searchable PDF in one line — no external PDF library, no coordinate mapping
result.SaveAsSearchablePdf("searchable-output.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Koordinat eşleme sorunu — OpenCV piksel koordinatlarını doğru DPI'de PDF nokta alanına dönüştürme — IronOCR'da mevcut değildir. aranabilir PDF rehberi, çok sayfalı çıktı, şifre korumalı PDF'ler ve çıktı kalitesi ayarlarını kapsar. Taralı arşivleri dijitalleştiren veya fakstan aranabilir PDF boru hattı oluşturan ekipler için bu tek yöntem çağrısı, aksi halde önemli bir entegrasyon projesi olacak durumu değiştirir.
Çok Kareli TIFF Yığın İşleme
Çok sayfalı TIFF dosyaları, belge tarama iş akışlarında sıkça görülür. PaddleOCR, doğrudan TIFF çok çerçeve desteğine sahip değildir — her çerçeve ayrı bir Mat olarak yüklenmelidir ve önceden bir dış resim kütüphanesi kullanılarak ayrı ayrı çıkarılmalıdır.IronOCR çoklu çerçeve TIFF'leri yerel olarak yönetir.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Drawing; // For multi-frame TIFF extraction
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var fullText = new StringBuilder();
// Must use System.Drawing to extract individual TIFF frames
// OpenCvSharp cannot enumerate TIFF frames directly
using var tiff = Image.FromFile("multipage-scan.tiff");
FrameDimension dimension = new FrameDimension(tiff.FrameDimensionsList[0]);
int frameCount = tiff.GetFrameCount(dimension);
for (int i = 0; i < frameCount; i++)
{
tiff.SelectActiveFrame(dimension, i);
// Save frame to temp file — OpenCvSharp needs a file path
string tempPath = Path.GetTempFileName() + ".png";
tiff.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
fullText.AppendLine($"=== Frame {i + 1} ===");
fullText.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
Console.WriteLine(fullText.ToString());
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImageFrames("multipage-scan.tiff"); // All frames in one call
var result = ocr.Read(input);
foreach (var page in result.Pages)
{
Console.WriteLine($"=== Frame {page.PageNumber} ===");
Console.WriteLine(page.Text);
}
// Optionally save the entire multi-frame result as searchable PDF
result.SaveAsSearchablePdf("multipage-searchable.pdf");
Çerçeve çıkarımı yinelemesi, System.Drawing bağımlılığı, geçici dosya oluşturma ve temizleme mantığı tamamen kaldırılır. IronOCR, tüm çerçeveleri tek bir LoadImageFrames() çağrısında yükler ve her çerçeveyi sonuçta bir Page olarak ortaya çıkarır. TIFF ve GIF giriş rehberi, çoklu çerçeve yükleme seçenekleri, seçici çerçeve aralıkları ve büyük TIFF arşivleri için bellek değerlendirmelerini kapsar.
PaddleOCR (.NET) API'den IronOCR Eşleme Referansı
| PaddleOCR (Sdcb) | IronOCR | Notlar |
|---|---|---|
Sdcb.PaddleOCR | IronOcr | Namespace |
Sdcb.PaddleOCR.Models.Online | Yok | Model edinimi alan adı gerekmiyor |
Sdcb.PaddleInference | Yok | Sonuç çıkarma arka uç alan adı gerekmiyor |
FullOcrModel | Yok | Eşdeğeri yok — modeller pakete dahil |
OnlineFullModels.ChineseV4.DownloadAsync() | dotnet add package IronOcr.Languages.ChineseSimplified | Model edinimi NuGet ile değiştirildi |
LocalDetectionModel.FromDirectory(path) | Yok | Model yolu yönetimi yok |
LocalClassificationModel.FromDirectory(path) | Yok | Model yolu yönetimi yok |
LocalRecognitionModel.FromDirectory(path) | Yok | Model yolu yönetimi yok |
new PaddleOcrAll(models) | new IronTesseract() | Motor örnekleme |
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) | Yok | GPU cihaz seçimi tamamen kaldırıldı |
PaddleDevice.Cpu() | Yok | Tek mod CPU'dur; seçim gerekmez |
ocr.AllowRotateDetection = true | input.Deskew() | Dönme düzeltmesi |
ocr.Enable180Classification = true | Otomatik | Ters tespit dahili olarak sağlanmış |
Cv2.ImRead(path) | input.LoadImage(path) | Görüntü yükleme — OpenCV gerekli değil |
ocr.Run(mat) | ocr.Read(input) | OCR'yi yürüt |
result.Text | result.Text | Tam belge metin dizgisi |
result.Regions | result.Pages[0].Lines veya .Words | Yapılı metin bölgeleri |
region.Text | word.Text / line.Text | Bir bölgenin metin içeriği |
region.Score (float 0-1) | word.Confidence (int 0-100) | Güven değeri — kapsam farklıdır |
region.Rect.Center.X | word.X | Yatay pozisyon |
region.Rect.Center.Y | word.Y | Dikey pozisyon |
region.Rect.Size.Width | word.Width | Sınır kutusu genişliği |
region.Rect.Size.Height | word.Height | Sınır kutusu yüksekliği |
| Yok | input.LoadPdf(path) | Doğal PDF girişi (PaddleOCR eşdeğeri yoktur) |
| Yok | input.LoadImageFrames(path) | Çoklu çerçeve TIFF (PaddleOCR eşdeğeri yoktur) |
| Yok | result.SaveAsSearchablePdf(path) | Aranabilir PDF çıktısı (PaddleOCR eşdeğeri yoktur) |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Güven Ölçeği Uyuşmazlığı
PaddleOCR: Bölge güveni 0,0 ile 1,0 arasında bir float'dir. Düşük kaliteli tespitleri filtrelemek için yaygın bir eşik region.Score >= 0.8'dir.
**Çözüm:**IronOCR güveni, 0'dan 100'e kadar bir int yüzdesidir. PaddleOCR eşik değeri 100 ile çarpılmalı:
// PaddleOCR: filter at 0.8
var highConfidence = result.Regions.Where(r => r.Score >= 0.8);
//IronOCR equivalent: filter at 80
var highConfidence = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence >= 80);
Belge seviyesinde güven, hızlı kalite kontrolü için result.Confidence olarak mevcuttur. güven skorları rehberi, kelime başı ve belge seviyesinde eşikler hakkında bilgi verir.
Sorun 2: Okuma Sırası Varsayımları
PaddleOCR: result.Regions tespit sırasına göre sıralanır, okuma sırasına göre değil. result.Text üst-ten-alt ve sol-dan-sağa beklendiğinde manuel sıralama modeline bağlı olarak PaddleOCR örnekleri boyunca kullanılan kodda sıralama düzenine istinaden manuel olarak sıralama modeline güvenir.
Çözüm: IronOCR'un result.Text zaten okuma sırasındadır. Elle sıralamayı kaldırın. Satır satır bir çıkış oluşturmak için sıralamanın kullanıldığı durumlarda, doğrudan result.Pages[0].Lines'yi kullanın:
// PaddleOCR: manual sort required for reading order
var lines = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X)
.Select(r => r.Text);
// IronOCR: reading order is the default
var lines = result.Pages[0].Lines.Select(l => l.Text);
Sorun 3: OpenCV Mat Dönüştürme Kodu
PaddleOCR: Bazı kod tabanları, Cv2.ImRead() çağrısı yapmadan önce bir geçici dosyaya yazarak veya bayt dizilerinden resimleri yükleyen yardımcı yöntemler içerir. Bu kalıplar, Cv2.ImRead() sadece dosya yollarını kabul ettiği için mevcuttur.
Çözüm: IronOCR'un OcrInput doğrudan akışları ve bayt dizilerini kabul eder. Geçici dosya aracı dosyasını silin:
// PaddleOCR: stream → temp file → Mat → OCR
string tempPath = Path.GetTempFileName() + ".png";
using (var fs = File.Create(tempPath))
await imageStream.CopyToAsync(fs);
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
File.Delete(tempPath);
// IronOCR: stream → OCR (no temp file)
using var input = new OcrInput();
input.LoadImage(imageStream);
var result = ocr.Read(input);
akış giriş rehberi, HTTP yanıtları, veritabanı blobları ve bellek akışlarından akış yüklemeyi kapsar.
Sorun 4: Async Başlatma Modeli Kaldırma
PaddleOCR: Motor başlatması asenkron çünkü model indirme ağ I/O işlemi içerir. Bu, çağrı zinciri boyunca asenkron yapılar gerektirir, bu da yapıcılar veya asenkron olmayan olay işleyicileri gibi eşzamanlı bağlamlarda sorun olabilir.
**Çözüm:**IronOCR başlatması eşzamanlıdır. new IronTesseract() I/O gerçekleştirmez. Herhangi bir model indirme işleminin yalnızca asenkron operasyon olduğu herhangi bir yöntemden await ve async değiştiricisini çıkarın:
// PaddleOCR: async forced by model download
public async Task<string> ExtractTextAsync(string imagePath)
{
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead(imagePath);
return ocr.Run(mat).Text;
}
// IronOCR: synchronous — no async required unless the caller needs it
public string ExtractText(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
IronOCR ek olarak, asenkron bağlamda gerçekten gerektiğinde, engelleme yapmaksızın çalışma sağlamak için ocr.ReadAsync(input) yoluyla yerel asenkron destek sunar.
Sorun 5: Docker Build Adım Temizleme
PaddleOCR: Dockerfile, apt-get install libopencv-dev, bir COPY models/ /app/models/ talimatı ve genellikle bir model önceden indirme RUN adımı içerir. Temel görüntü genellikle GPU dağıtımları için NVIDIA CUDA görüntüsüdür.
Çözüm: Tüm PaddleOCR'a özgü Dockerfile talimatlarını kaldırın.IronOCR Docker görüntüsü, özel bir temel görünüme ya da model kopyalama adımına ihtiyaç duymaz:
# PaddleOCR Dockerfile (remove all of this)
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y libopencv-dev libgdiplus
COPY models/ /app/models/
COPY . /app
# IronOCR Dockerfile (clean)
FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
Sonuç olarak ortaya çıkan görüntü yaklaşık 1,5GB'dan yaklaşık 400MB'ye düşer. Docker dağıtım rehberi, Linux kütüphane gereksinimleri ve çoklu mimari derlemeleri kapsar.
Sorun 6: CI/CD Model Önbelleği Geçersiz Kılma
PaddleOCR: NuGet geri yükleme adımını önbelleğe alan CI/CD hatları, model dosyası önbelleklerini ayrı ayrı yönetmelidir. Yaygın bir desen, çalıştırmalar arasında bir models/ klasörünün önbelleğe alınmasıdır. Wrapper sürümü güncellendiğinde, önbellek anahtarı değişir ve modeller Baidu sunucularından yeniden indirilmeli, bu, hattan 30-60 saniye ekler.
Çözüm: IronOCR, model önbellek dizinine sahip değildir. Gerekli olan tek önbellek, standart NuGet paket önbelleğidir. Ayrı önbellek adımı yok, sarmalayıcı güncellemelerinde önbelleği geçersiz kılma yok, CI sırasında üçüncü taraf sunuculardan indirme yok:
# Remove from CI/CD pipeline:
# - name: Cache PaddleOCR models
# uses: actions/cache@v3
# with:
# path: models/
# key: paddleocr-models-${{ env.PADDLEOCR_VERSION }}
# IronOCR only needs standard NuGet caching:
- name: Cache NuGet packages
uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: nuget-${{ hashFiles('**/*.csproj') }}
PaddleOCR (.NET) Geçiş Kontrol Listesi
Öncesi-Geçiş
Herhangi bir değişiklik yapmadan önce tüm PaddleOCR kullanımlarını tanımlamak için kod tabanını kontrol et:
# Find all PaddleOCR namespace imports
grep -rn "using Sdcb.PaddleOCR" --include="*.cs" .
# Find all OpenCvSharp imports (added as PaddleOCR dependency)
grep -rn "using OpenCvSharp" --include="*.cs" .
# Find all Mat usage patterns
grep -rn "Cv2\.ImRead\|new Mat\|Mat mat" --include="*.cs" .
# Find all async model download calls
grep -rn "DownloadAsync\|OnlineFullModels\|LocalDetectionModel" --include="*.cs" .
# Find all GPU device configuration
grep -rn "PaddleDevice\|EnableUseGpu\|cuda" --include="*.cs" .
# Find all result region access patterns
grep -rn "result\.Regions\|region\.Score\|region\.Rect" --include="*.cs" .
# Locate model directory references in configuration files
grep -rn "PP-OCRv4\|cls_infer\|det_infer\|rec_infer" --include="*.cs" --include="*.json" --include="*.yaml" .
Model dizinlerinin envanterini çıkarın ve toplam boyutu not edin. Kullanılan dil modellerinin hangileri olduğunu belirleyin (Çince, İngilizce, Japonca, vb.) hangi IronOcr.Languages.* paketlerini eklemeniz gerektiğini belirlemek için. GPU yapılandırmasının mevcut olup olmadığını not edin — bu dosyalar temizlenecek alanın en geniş kısmına sahiptir.
Kod Geçişi
Sdcb.PaddleOCR,Sdcb.PaddleOCR.Models.Online,Sdcb.PaddleInference.runtime.*,OpenCvSharp4veOpenCvSharp4.runtime.*'yi.csprojdosyasından kaldırınIronOcrdosyasına.csprojekleyin- Daha önce PaddleOCR modeli olarak indirilen her dil için
IronOcr.Languages.*paketlerini ekleyin - Tüm
using Sdcb.PaddleOCR*veusing OpenCvSharpyönergeleriniusing IronOcrile değiştirin - Uygulama başlatıldığında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin FullOcrModel models = await OnlineFullModels.*.DownloadAsync()'yı hiçbir şeyle değiştirmeyin — satırı tamamen kaldırınnew PaddleOcrAll(models)'yınew IronTesseract()ile değiştirinnew PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))'yınew IronTesseract()ile değiştirinMat mat = Cv2.ImRead(path)'yıvar input = new OcrInput();ile değiştirin input.LoadImage(path);'ocr.Run(mat)'yıocr.Read(input)ile değiştirinresult.Regionserişiminiresult.Pages[0].Linesveyaresult.Pages[0].Wordsile değiştirinregion.Score >= threshold'yıword.Confidence >= threshold * 100ile değiştirinregion.Rect.Center.X / .Center.Y'yıword.X / word.Yile değiştirin- Elle sıralama mantığını kaldırın —IronOCR sonuçları zaten okuma sırasındadır
models/dizinini ve tüm model dosyalarını depodan ve dağıtım betiklerinden kaldırın
Geçiş Sonrası
dotnet build'ninSdcb.*,OpenCvSharpveyaPaddleInference'ye sıfır referansla başarılı olduğunu doğrulayın, derleme çıktısındadır- PaddleOCR çıktısının doğruluğunu doğrulamak için kullanılan aynı temsilci doküman seti üzerinde OCR çalıştırın ve metin doğruluğunu karşılaştırın
- Güven değerlerinin tüm filtre noktalarında 0-100 olarak (0-1 değil) okunduğunu onaylayın
- Elle sıralama olmaksızın okuma sırasının doğru olduğunu doğrulayın – özellikle çok kolonlu ve fatura düzenlerini kontrol edin
- CUDA temel görüntüsü veya
apt-get install libopencv-devolmadan Docker görüntüsü oluşturma işleminin tamamlandığını test edin - Docker imaj boyutunun 500MB'nin altında olduğunu onaylayın
- CI/CD hattını baştan sona çalıştırın ve yapı sırasında dış indirmelerin olmadığını doğrulayın
- İzole edilmiş dağıtımda test yapın: uygulamanın outbound ağ bağlantıları olmadan belgeleri başlatıp işlediğini doğrulayın
- Çok çerçeveli TIFF girişleri için, tüm çerçevelerin işlendiğini ve çerçeve sayısının kaynak dosyayla eşleştiğini doğrulayın
- Herhangi bir PDF girdisi için,
input.LoadPdf()'nin önceki PdfiumViewer tabanlı dönüşümle aynı sayfa sayısını ve metin içeriğini ürettiğini doğrulayın
IronOCR'a Geçişin Ana Faydaları
Dağıtım Artifaktları Yüzde 80 Daha Küçük. PaddleOCR dağıtım alanı — paddle_inference.dll, OpenCV DLL'leri ve üç model dizini — her dağıtım hedefi için300-500MBekler. Geçişten sonra,IronOCR dağıtımı yaklaşık 80MB'dir. Docker imajları ~1,5GB'dan ~400MB'ye düşer. Konteyner başlangıcı daha hızlıdır, depolama maliyetleri daha düşüktür ve daha önce 500MB olan artefaktlara transfer edilen dağıtım hatları şimdi 80MB transfer eder.
Soğuk Başlama Süresi Saniyelerden Milisaniyelere Düşer. PaddleOCR, ilk çıkarımda üç sinir ağı model dosyasını diskte yükler, bu, ilk çağrı dönmeden önce 3-5 saniyelik bir duraklamaya ekler. Sunucusuz işlevlerde, otomatik ölçeklendirme senaryolarında veya talep üzerine yeni örneklerin döndüğü her bağlamda, bu soğuk başlama tekrarlanarak ücretlendirilir. IronOCR'un motoru paketlenmiştir ve bir saniyenin altında başlatılır. temel OCR örneği, başlatma modelini gösterir.
Dil Kapsamı 14'ten 125'e Altyapı Çalışması Olmadan Genişler. PaddleOCR 14 dili destekler. IronOCR'un PaddleOCR'un sınırının ötesinde desteklediği 111 dilden herhangi birini eklemek, dil başına tek bir NuGet paketi eklemesidir — model indirimi yok, dizin yönetimi yok, sürüm senkronizasyonu yok. Belgelerin kapsamı yeni pazarlara genişleyen ekipler, Lehçe, Vietnamece, Yunanca veya İbranice OCR desteği eklemek için bir yeniden yazma veya yeni bir altyapı projesiyle karşılaşmazlar. Tam dil kataloğu, mevcut125+paket gösterir.
Aranabilir PDF Çıktısı Tek Bir Satır Gerektirir. PaddleOCR metin bölgeleri döndürür. Bu bölgeleri aranabilir bir PDF katmanına dönüştürmek, ayrı bir PDF kütüphanesi, pikselden noktaya koordinat dönüşümü ve kalıcı bir bakım haline gelen görünmez metin enjeksiyonu kodu gerektirir. Geçişten sonra, result.SaveAsSearchablePdf("output.pdf") tüm bu alt sistemi değiştirir. Taralı belge arşiv iş akışları, faksdan-PDF hatları ve belge yönetim entegrasyonları doğrudan fayda sağlar. aranabilir PDF nasıl yapılır ve PDF veri çıkarım blog yazısı, tam çıktı seçeneklerini kapsar.
Herhangi Bir Aşamada Dış Ağ Bağlantısı Yok. PaddleOCR, model indirmeleri için Baidu'nun bj.bcebos.com depolamasına bağlanır. Çıkış bağlantılarının kısıtlandığı ortamlar — hükümet ağları, izole sistemler, finansal hizmet altyapısı — bu bağlantı ya bir güvenlik duvarı istisnası ya da CI/CD karmaşıklığı ekleyen bir ön indirme işlemine ihtiyaç duyar.IronOCR çalışırken hiçbir dış bağlantı yapmaz. Modeller, NuGet'ten dotnet restore'nin bir parçası olarak geri yüklenir ve dağıtım çıktısında bulunur. AWS dağıtım rehberi ve Azure dağıtım rehberi, ağ kısıtlamalarının bulunduğu ortamlar için bulut özgü yapılandırmayı kapsar.
Tüm OCR Yığını İçin Tek Ticari Destek Teması. PaddleOCR sorunları, Sdcb.PaddleOCR kaplaması (topluluk GitHub), PaddlePaddle çerçevesi (Baidu), OpenCvSharp (topluluk) ve CUDA/cuDNN (NVIDIA) içerir. Her katman, yanıt süresi garantisi olmayan farklı bir destek kanalıyla sahiptir. Iron Software'den tek bir ürün olan IronOCR, ticari e-posta desteği ve öncelik yanıt katmanları ile gelir. IronOCR dokümantasyon merkezi, tüm API dokümantasyonunu, nasıl yapılır rehberlerini ve sorun giderme kaynaklarını tek bir yerde toplar.

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.