Paddle OCR対Tesseract:詳細なOCR比較
PaddleOCRは最先端の中国語文字認識機能を提供しますが、 .NETアプリケーションで単一の画像を処理するには、5つのNuGetパッケージ、中国のBaiduサーバーに接続する非同期モデルのダウンロード(約100MB)、画像読み込みごとにOpenCvSharpへの依存関係、そして初回実行時の3~5秒のコールドスタート時間が必要です。 これは、 .NETプロジェクトからPythonを主軸とした深層学習システムを使用する際に発生するコストです。 中国語の文字の正確性が必須条件であり、GPUインフラが既に存在するCJK文字を多用するワークロードにおいては、そのコストを支払う価値がある。 それ以外の点では、それはプロジェクトにとって全く必要のない余剰資源である。
PaddleOCRについて
PaddleOCRは、Baiduが独自の深層学習フレームワークであるPaddlePaddleをベースに構築したオープンソースのOCRシステムです。 プロジェクトはPython開発者向けにゼロから設計されており、.NETコミュニティはZhou Jie(sdcb)がGitHubで維持しているコミュニティラッパーSdcb.PaddleOCRを通じてアクセスします。
認識パイプラインは、3つのニューラルネットワークを順番に連結します。テキスト領域の境界ボックスを識別する微分可能な二値化(DB)を使用したテキスト検出モデル、テキストの向きを決定する方向分類器、および検出された領域のピクセルを文字列に変換する畳み込みリカレントニューラルネットワーク(CRNN)を使用した認識モデルです。 これらのネットワークはそれぞれ独立したモデルファイルであり、推論を開始する前にディスク上に存在している必要があります。
主な建築上の特徴:
- マルチパッケージインストール: コアパッケージ(
Sdcb.PaddleOCR.Models.Online)、画像読み込み用のOpenCvSharp—最小で4つのパッケージ、OpenCvSharpランタイムを分離する場合は5つ -**モデルのダウンロードは必須です。**モデルは同梱されていません。 最初の使用時にはbj.bcebos.com)からダウンロードされ、デプロイメントアーティファクトに約100MB追加されます。 -**画像ごとに OpenCV に依存しています:**ファイル パスから直接推論に至るパスはありません。 画像はocr.Run(mat)に渡す前にOpenCvSharpMatオブジェクトとして読み込まれなければなりません。 - **GPUアクセラレーションにはCUDA/cuDNNのセットアップが必要です。**公称性能を実現するには、NVIDIAドライバー、CUDA Toolkit 11.8、cuDNN 8.6以降、および別途GPUランタイムNuGetパッケージが必要です。環境ごとに2~8時間のセットアップ時間が必要です。
- **Python優先のリリースサイクル:**新しいPaddleOCRモデルバージョンはまずPythonでリリースされ、 .NETラッパーのアップデートは数週間から数か月後にリリースされます。 -**対応言語は14言語:**中国語(簡体字)、中国語(繁体字)、英語、フランス語、ドイツ語、韓国語、日本語、イタリア語、スペイン語、ポルトガル語、ロシア語、アラビア語、ヒンディー語、タミル語 — 上限は厳格
このNuGetパッケージは約20万回ダウンロードされています。 フットプリントが小さくなるということは、Stack Overflowの回答数が減り、実戦で検証された運用レポートも減り、経験に基づいて質問に答えられる開発者の数も少なくなることを意味する。
実践における3モデルパイプライン
PaddleOCRの推論呼び出しでは、毎回3つのニューラルネットワークが連続して実行されます。 以下のコードは、開発者がテキストを返す前に遭遇する完全なセットアップパスを示しています。
// 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 UsingRectバウンディングボックスを持っています。 信頼性でフィルタリングするには: result.Regions.Where(r => r.Score > 0.8)。 領域の順序付けは空間的ですが、読み順を保証するものではないため、region.Rect.Center.Xでソートするのが一般的なパターンです。
IronOCRを理解する
IronOCRは、最適化されたTesseract 5 LSTMエンジンをベースに構築された、 .NET向けの商用OCRライブラリです。生のTesseractに必要な設定や前処理作業を不要にするように設計されています。 NuGetパッケージ1つで、ランタイム、言語モデル、ネイティブバイナリ、およびプリプロセッシングパイプライン一式がインストールされます。
主な特徴:
- シングルパッケージデプロイメント:
dotnet add package IronOcrはすべてをインストールします。 追加のランタイムパッケージ、モデルのダウンロード、ネイティブライブラリの設定は不要です。 -**自動前処理:**低品質の入力に対して、傾き補正、ノイズ除去、コントラスト調整、二値化、解像度向上処理が自動的に適用されます。 必要に応じて、明示的なコントロールが可能です。 - ネイティブPDFサポート: スキャンされたPDFは
input.LoadPdf()を介して直接ロードされ、サードパーティの変換ステップが不要です。 - NuGetを通じた125以上の言語: 各言語パックは標準NuGet依存関係です—
dotnet add package IronOcr.Languages.ChineseSimplified—モデルディレクトリ管理はありません。 -スレッドセーフ、CPU最適化: CUDAやGPUハードウェアを必要とせずに並列処理を内蔵 - **SLAに基づく商用サポート:**米国に拠点を置くIron Softwareが商用サポートを提供します。 この製品はコミュニティのサイドプロジェクトではありません
- 永続ライセンス: $999 Lite / $1,499 Plus / $2,399 Professional—一度支払えば、無期限に実行、1ページごとの料金なし
機能比較
| フィーチャー | パドルOCR(Sdcb) | IronOCR |
|---|---|---|
| 必要なNuGetパッケージ | 4-5 | 1 |
| モデルのダウンロードが必要です | はい(約100MB、Baiduサーバー) | いいえ(バンドル) |
| セットアップ時間 | 30~60分 | 5分 |
| CJK精度 | 非常に良い(95%以上) | 良好(85~90%) |
| 英語/ラテン語の正確性 | 良好(92~95%) | 非常に優れている(97~99%) |
| GPUサポート | はい(複雑なCUDA設定) | CPU最適化済み |
| ネイティブPDFサポート | なし | はい |
| 対応言語 | 14 | 125+ |
| ライセンス | アパッチ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~100ミリ秒(CUDAが必要) | 該当なし(CPU最適化済み) |
| メモリ使用量 | 500MB~1GB | 100~200MB |
| 展開サイズ | 300~500MB | ~80MB |
| デプロイメント | ||
| Dockerベースイメージサイズ | 約1.5GB(CUDAベースを含む) | 約400MB |
| クロスプラットフォーム | Windows/Linux(一部対応) | Windows、Linux、macOS |
| エアギャップ展開 | はい(事前ダウンロードモデル) | はい(ダウンロード不要) |
| サポートとライセンス | ||
| ライセンスの種類 | アパッチ2.0(無料) | 永久商業 |
| 商用サポート | コミュニティ/ GitHub | はい、SLA付きで |
| 会社/保守担当者 | Baidu / コミュニティラッパー | Iron Software(米国) |
| NuGetのダウンロード | 約20万 | ~5.3M |
CJK精度とセットアップコストの比較
CJKの精度こそがPaddleOCRの真の強みである。 中国語簡体字文書の場合、深層学習CRNNアーキテクチャは95%以上の精度を達成し、密集した中国語文字グリッド、中国語と英語が混在するレイアウト、縦書きのテキストブロックにおいて、Tesseractベースのエンジンを常に上回る結果を示しています。 プロジェクトの主な作業内容が中国語の請求書処理、中国語の契約書作成、または日本語の製品カタログ作成である場合、その精度の高さは大きなメリットとなります。
パドルOCRアプローチ
中国語モデルのパイプラインが優れた性能を発揮するのは、検出および認識ネットワークが、中国語のウェブコンテンツを大規模に処理することを主要事業とするBaiduによって、大規模な中国語文書データセットで訓練されているためである。
// 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信頼性フィルタパターン(r.Score >= 0.8)は重要です。なぜなら、深層学習検出ステップが時折非テキスト領域をテキストとしてフラグ付けすることがあるからです。 フィルタリングを行わない場合、出力にノイズ領域が現れます。 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}%");
}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複数の言語を同時に必要とするチーム—たとえば混合中国語/英語の文書—のために、IronOCRはAddSecondaryLanguageで組み合わせを処理します。 PaddleOCRでは、言語ごとにモデルセットを切り替える必要があるため、ダウンロード呼び出しとエンジンインスタンスが別々に必要になります。
トレードオフは明確だ。純粋なCJK精度においてはPaddleOCRが優れている。 IronOCRは、英語/ラテン語の認識精度(97~99%対92~95%)、低品質スキャン画像の事前処理、およびモデルファイルの管理が不要な操作の簡便さにおいて優れています。 複数の言語で書かれた文書を処理するチーム、あるいは主にヨーロッパ言語の文書を処理し、時折CJKコンテンツが含まれるようなチームにとっては、IronOCRの精度プロファイルは全体としてより有用であることがわかるでしょう。 多言語対応や前処理の例については、 IronOCRのチュートリアルハブをご覧ください。
モデルのダウンロードと管理
PaddleOCRとIronOCRのモデル管理の違いは、日々の運用において最も重要な相違点である。 これは、初回セットアップ、CI/CDパイプライン、Dockerイメージ、およびエアギャップ環境へのデプロイに影響します。
パドルOCRアプローチ
PaddleOCRは、 NuGetパッケージとは別にモデルを同梱しています。 フルパイプラインOCRを実行するには3つのモデルディレクトリが必要であり、それらを取得する方法ごとに異なるトレードオフが存在する。
// 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();netモデルのバージョンはラッパーのバージョンと一致している必要があります。 Sdcb.PaddleOCRが更新されると、以前のバージョンからの事前ダウンロード済みのモデルは再ダウンロードが必要になる可能性があります。 NuGetの復元ステップをキャッシュするCI/CDパイプラインは、モデルファイルのキャッシュを別途管理するか、コンテナ構築フェーズ中にモデルのダウンロードをトリガーする必要があります。 Dockerイメージの比較結果を見ると、PaddleOCRコンテナのサイズは約1.5GBであることがわかります。 約400MBのIronOCRコンテナ。
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 restoreの一環として復元されます。 apt-get install libopencv-devを実行し、CUDAベースのイメージを追加するDockerビルドステップは、IronOCRコンテナには存在しません。 DockerデプロイメントまたはAzureデプロイメントを使用するチームにとって、コンテナ構築の複雑さの違いは大きい。
GPUおよびCUDAの依存関係
PaddleOCRのGPUパフォーマンス数値(画像1枚あたり50~100msに対し、CPUでは300~500ms)は紛れもない事実です。ディープラーニングモデルは、Tesseractベースのエンジンとは異なり、GPU並列処理の恩恵を大きく受けています。 1日に数万枚の画像を処理するワークロードの場合、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);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 UsingCUDA_PATHが設定されていない場合、対応するcuDNN DLLが期待されるパスに存在しないか、ランタイムパッケージのバージョンがインストールされたCUDAツールキットと一致しない場合、呼び出しはネイティブライブラリロード例外をスローします。 その障害を診断するには、複数のディレクトリにわたってドライバのバージョン、PATH環境変数、およびDLLファイルの存在を確認する必要があります。 Dockerでは、GPUサポートにはnvidia-container-toolkitが必要であり、イメージビルドおよびコンテナランタイムの設定に複雑さを追加します。
CPUのみのデプロイメントの場合、PaddleOCRはデフォルトでMKLアクセラレーションによるランタイムを使用します。これは、画像1枚あたり約300~500ミリ秒で、モデルの読み込みに3~5秒のコールドスタートが必要です。
IronOCRのアプローチ
IronOCRはCPUによる推論処理を前提に設計されています。 標準的なハードウェア上で、GPUへの依存、CUDAスタック、ドライババージョンの制約なしに、画像1枚あたり150~300ミリ秒の処理速度を実現します。 また、モデルは初期化時にディスクから読み込むのではなくバンドルされているため、エンジンは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}%");
GPUハードウェアなしでの大規模スループットを目指し、IronOCRのスレッドセーフな設計により、IronTesseractインスタンスで画像のバッチに適用できます—各々がロックなしで独立して処理します。 マルチスレッドの例は、そのパターンを示している。 4コアCPUで画像1枚あたり150~300ミリ秒の処理時間で、並列処理を用いることで100枚の画像のバッチ処理が20~40秒で完了します。このCPUスループットにより、ほとんどのWeb 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();
つまり、1つの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");
パスワード保護されたPDFは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) | input.LoadImage(path) | 画像読み込み中 |
ocr.Run(mat) | ocr.Read(input) | OCRを実行する |
result.Text | result.Text | 文書全文 |
result.Regions | result.Lines | 構造化されたテキスト領域 |
region.Text | word.Text | 地域からのテキスト |
region.Score | word.Confidence | 信頼度(0~1 vs 0~100) |
.Center.Y | word.Y | バウンディングボックスの位置 |
.Height | 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パッケージを1つ追加し、設定ファイルを1行変更するだけで済みます。 "当初は中国語中心だが、最終的には複数地域にまたがる"というプロジェクトを計画するチームは、書き直しなしで言語対応範囲を拡大できるツールから始めるかどうかを事前に決定する必要がある。
セットアップ費用が問題予算を超えた場合
PaddleOCRのドキュメントによると、初回セットアップにかかる時間は、CPUの場合は30~60分、GPUの場合は2~8時間と見積もられています。 開発者の人件費が1時間あたり100ドルだとすると、最初の製品イメージが処理される前に、最初のGPU構成の試行に200ドルから800ドルの費用がかかることになる。 IronOCRのセットアップは、インストールコマンド1つと4行のコードサンプルだけで完了し、5分もかかりません。 社内ツール、プロトタイプ、またはOCRがコア製品ではなく二次的な機能であるプロジェクトの場合、その時間差によって、OCR機能が現在のスプリントでリリースされるか、優先順位が下げられるかが決まります。 IronOCRを使い始めるのにかかる時間は、CUDA環境を構成するよりも短い。
PDFワークフローが主流になるとき
スキャンされた文書アーカイブをデジタル化したり、ファックスからPDFへのパイプラインを処理したり、PDF形式の請求書や契約書からデータを抽出したりする組織は、PaddleOCRに関して構造的な問題に直面しています。PaddleOCRがPDFを処理するには、すべてのPDFに対して追加のライブラリ、手動によるページレンダリング、一時ファイル管理、およびDPI選択ロジックが必要となるためです。 それは偶発的な複雑さではなく、恒久的なメンテナンスの問題だ。 PaddleOCRを最初に導入した後、ワークロードの80%以上がPDFベースであることが判明したチームは、PaddleOCR自体が故障した時ではなく、PDF変換レイヤーがバグの原因となった時に移行する傾向があります。
コンプライアンスレビューでBaiduの起源が指摘された場合
政府、防衛、医療、金融サービスなどの組織のEnterpriseセキュリティチームは、中国政府関連企業に由来する部品に対して、ますます厳格な審査基準を適用するようになっている。 PaddleOCRはBaiduのプロジェクトです。 モデルのダウンロードは、デフォルトでBaiduクラウドストレージに接続されます。 PaddlePaddleフレームワークはBaiduの製品です。 コードはローカルで実行され、ドキュメントは送信されませんが、モデル成果物はBaiduのインフラストラクチャから生成されます。 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のセットアップコストを支払っているにもかかわらず、それに見合うパフォーマンス上のメリットを得ていない。
一般的な移行の考慮事項
パッケージと名前空間の置換
パッケージの入れ替えにより、5つの依存関係が削除され、1つの依存関係が追加されます。 .csprojから削除します。 IronOcrを追加します。 以前ダウンロードしたモデルセットを使用していた英語以外の言語については、言語パックをNuGetパッケージとして追加してください。
using IronOcrに置き換えられます。 input.LoadImage(path)に置き換えられます。 ocr.Read(input)になります。 画像入力APIを使用するプロジェクトでは、System.Drawing.Bitmapを受け入れます—OpenCvSharpの仲介が完全に消えます。
結果構造のリマッピング
PaddleOCRはw.Confidence >= 80にマップされます。 バウンディングボックスアクセスはword.Widthに変更されます。 構造化された結果ガイドは、ページ、段落、行、単語を対象としています。
IronOCRでは、Tesseractレイアウトエンジンがページ分割ステップの一部として読み上げ順序分析を実行するため、空間ソート(Y軸、次にX軸の順に並べ替えて読み上げ順序を近似する)が必要となるケースは少なくなります。PaddleOCRで明示的なソートロジックが必要だった文書については、ソートコードを移植する前に、IronOCRのデフォルトの出力順序が既に要件を満たしているかどうかをテストしてください。
前処理トランジション
PaddleOCRの深層学習検出モデルは、ある程度の画像品質劣化に対応できます。ニューラルネットワークは、Tesseractの従来のセグメンテーションパイプラインよりもノイズや歪みをより確実に処理します。IronOCRに移行する際は、以前は前処理なしで正常に処理されていた文書に対して、明示的な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);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非標準的な角度でスキャンされた文書や、背景にノイズが含まれている文書の場合、これら4つのフィルターを使用することで、精度の差の大部分を補正できます。画像方向補正ガイドと画像色補正ガイドには、各フィルターが一般的なスキャン時のアーティファクトに及ぼす影響が記載されています。 移行を完了する前に、代表的な文書を両方のパイプラインで実行し、実際の文書セットの精度が要件を満たしていることを確認してください。
デプロイメントのクリーンアップ
移行後、デプロイメントアーティファクトのサイズは大幅に縮小します。 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リリースサイクルに合わせた定期的なアップデートを受けており、リリース予定 for .NET 10との互換性も含まれています。 PaddleOCR for .NETラッパーは、コミュニティによって維持されているプロジェクトです。 新しい.NETバージョンとの互換性は、単一のメンテナーの能力に依存します。 ラッパーのリリーススケジュールと、新しいPaddleOCR Pythonモデルバージョンが.NETに反映されるまでの3ヶ月の遅延は、商用リリースの約束よりもコミュニティの可用性に依存していることを示している。
結論
PaddleOCRのCJK精度における優位性は、紛れもなく明確で具体的なものです。 主なワークロードが中国語簡体字文書であり、チームが深層学習の専門知識と既存のGPUインフラストラクチャを備えているプロジェクトの場合、複数のパッケージのセットアップコストとCUDA構成の複雑さは、Tesseractベースのエンジンが現在、密集した中国語文字認識において達成できない精度によって正当化されます。
問題は、この特定のシナリオが、 .NET OCRのユースケースのごく一部しか説明していないという点です。 ほとんどの商用アプリケーションは英語およびヨーロッパ言語の文書を処理しますが、IronOCRの97~99%の精度はPaddleOCRの92~95%を上回ります。 ほとんどの開発チームは、CUDAインフラストラクチャを事前に構成していません。 ほとんどのドキュメント処理パイプラインはPDFファイルを受け取りますが、PaddleOCRは追加のライブラリなしではPDFファイルを処理できません。 そして、 .NETプロジェクトに取り組むほとんどの開発者は、単一のパッケージのインストールが完全なインストール手順であると想定しています。つまり、非同期モデルのダウンロードとOpenCVの依存関係が続く、5つのパッケージのインストールが最初のステップであるとは考えていません。
大規模なGPUスループットを必要とするチームにとって、PaddleOCRのCPUパフォーマンス(300~500ms)は既にIronOCRのCPUパフォーマンス(150~300ms)を下回っており、PaddleOCRのパフォーマンス上の利点が認められるのは、CUDAインフラストラクチャが既に稼働している場合に限られる。 IronOCRの永久ライセンス費用は、GPUの設定時間だけを考慮すると、通常1週間以内に回収できます。
まず最初に問われるのは、95%以上の中国語文字精度を実現するために、フルスタックのシステムを導入する価値があるかどうかだ。 GPUインフラストラクチャを備え、Baidu由来のソフトウェアに対するコンプライアンス承認を受けた環境における、中国語を主とするワークロードに関しては、答えはイエスです。 その他の点については、 IronOCRは5分以内に動作を開始し、ほとんど for .NET OCRプロジェクトで実際に遭遇する言語、前処理、およびPDFの要件に対応しています。
