iOS OCRライブラリ(無料および有料ツールの比較)
PaddleSharp (Sdcb.PaddleOCR) は、コードが実際に実行する OCR エンジンから 3 つの抽象化レイヤー離れた場所にあります。Baidu がニューラルネットワークモデルをトレーニングし、RapidOCR がそれを軽量な推論用に再パッケージ化し、PaddleSharp がそれを.NETで使用できるようにラップします。 各レイヤーごとにメンテナンス上の依存関係が追加され、CJK以外の言語が必要になったり、入力としてPDFが必要になったり、CUDAなしで本番環境に展開する必要が生じた瞬間に、このチェーンの限界が明らかになる。 この比較では、そのアーキテクチャがどのような点でメリットをもたらし、どのような点で.NETチームが事前にほとんど想定していないコストを発生させるのかを検証します。
PaddleSharp OCRについて理解する
PaddleSharp は、Baidu の PaddleOCR ディープラーニングフレームワークを .NET でラップしたもので、NuGet 上で Sdcb.PaddleOCR として公開されています。 PaddleOCRは、従来のOCRアルゴリズムを使用する代わりに、3段階のニューラルネットワークパイプラインを採用しています。検出モデルが画像内のテキスト領域を特定し、分類モデルがテキストの向きを判定し、認識モデルが各領域をテキストに変換します。 各ステージはそれぞれ独立したモデルファイルであり、ダウンロードして個別に設定する必要があります。
このラッパーは、Pythonを必要とせずに.NETでPaddlePaddleの推論機能を実現するために構築されました。 その目標は技術的には達成されているが、その代償として、OpenCvSharp画像処理ライブラリ(それ自体がプラットフォーム固有のランタイムパッケージを必要とする)、PaddleInferenceネイティブランタイム、およびモデルファイル自体を含む依存関係のスタックが発生する。 Windowsでは、文字を1文字でも認識できるようになるまでに、最低でも4つのNuGetパッケージをインストールする必要があります。
PaddleSharpの主な建築上の特徴:
-ラッパーの階層: 3層 — PaddlePaddle (Baidu) → PaddleOCR モデル → Sdcb.PaddleSharp .NETバインディング -モデル管理:検出、分類、認識モデルはそれぞれ別々にダウンロードされます (中国語版 V3 セットの場合、それぞれ約 3MB、約 2MB、約 10MB)。 パスとバージョンを手動で管理する
- OpenCV 依存: 画像読み込みには
OpenCvSharp4が必要です。 プラットフォームを切り替えるには、OpenCvSharp4.runtime.*パッケージを交換する必要があります -言語の重点:主な強みは中国語と英語です。 その他の言語のサポートは、PaddleOCRのモデルパックが利用可能で維持されているものに限られます。 - GPU アクセラレーション:
Sdcb.PaddleInference.runtime.win64.cudaパッケージを介したネイティブ CUDA サポート。これには、互換性のある CUDA ツールキットと cuDNN のインストールがホスト上で必要です - CPUパフォーマンスの低下: GPUがない場合、推論はCPU最適化された代替手段よりも遅くなります。最適化された非ディープラーニングエンジンでは100~400msであるのに対し、GPUでは画像1枚あたり500~1500msかかります。 -コミュニティの規模:小規模な英語圏コミュニティ。 ほとんどのドキュメント、Stack Overflowの回答、 GitHubのイシューは中国語です。
3段階推論セットアップ
PaddleSharpを単純なテキスト抽出タスク用にセットアップするには、3つのモデルステージすべてを接続する必要があります。
// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;
public class PaddleOcrService
{
private readonly PaddleOcrAll _ocr;
public PaddleOcrService()
{
// Three separate models, each downloaded independently
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
// GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
_ocr = new PaddleOcrAll(detModel, clsModel, recModel);
}
public string ExtractText(string imagePath)
{
// OpenCV required for image loading — not System.Drawing
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);
// Manual sort by position; no automatic reading-order guarantee
return string.Join("\n", result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X)
.Select(r => r.Text));
}
}
// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;
public class PaddleOcrService
{
private readonly PaddleOcrAll _ocr;
public PaddleOcrService()
{
// Three separate models, each downloaded independently
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
// GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
_ocr = new PaddleOcrAll(detModel, clsModel, recModel);
}
public string ExtractText(string imagePath)
{
// OpenCV required for image loading — not System.Drawing
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);
// Manual sort by position; no automatic reading-order guarantee
return string.Join("\n", result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X)
.Select(r => r.Text));
}
}
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models
Imports OpenCvSharp
Public Class PaddleOcrService
Private ReadOnly _ocr As PaddleOcrAll
Public Sub New()
' Three separate models, each downloaded independently
Dim detModel = LocalFullModels.ChineseV3.DetectionModel
Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel
Dim recModel = LocalFullModels.ChineseV3.RecognitionModel
' GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
_ocr = New PaddleOcrAll(detModel, clsModel, recModel)
End Sub
Public Function ExtractText(imagePath As String) As String
' OpenCV required for image loading — not System.Drawing
Using image = Cv2.ImRead(imagePath)
Dim result = _ocr.Run(image)
' Manual sort by position; no automatic reading-order guarantee
Return String.Join(vbLf, result.Regions _
.OrderBy(Function(r) r.Rect.Center.Y) _
.ThenBy(Function(r) r.Rect.Center.X) _
.Select(Function(r) r.Text))
End Using
End Function
End Class
コンストラクタだけで実際の処理を行います: モデルのバイナリをディスクから読み込み、推論エンジンを初期化します。その初期化コストは PaddleOcrAll インスタンスごとに一度だけ支払われるため、オブジェクトの作成には高コストがかかり、サービス指向の .NET アプリケーションではライフサイクル管理が慎重に行われる必要があります。
IronOCRを理解する
IronOCRは、最適化されたTesseract 5エンジンをベースに、自動前処理パイプラインをレイヤー化した.NET向け商用OCRライブラリです。外部モデルファイル、ネイティブバイナリ構成、二次的な画像処理ライブラリへの依存関係を一切必要とせず、単一のNuGetパッケージとしてインストールできます。 設計目標は、"インストール"と"正確なテキスト出力"の間のギャップを解消することです。このギャップは、他のほとんど for .NET OCRオプションに共通する特徴です。
IronOCRの主な特徴:
- 単一パッケージ展開:
dotnet add package IronOcr— モデルダウンロードなし、tessdata フォルダなし、OpenCV なし -自動前処理:入力画像に対して、傾き補正、ノイズ除去、コントラスト強調、二値化、解像度正規化が自動的に行われます。 必要に応じて、明示的な前処理フィルタを使用できます。 -ネイティブPDFサポート:スキャンされたPDFとテキストレイヤー付きPDFの両方を直接受け入れます。 パスワードで保護されたPDFには1つのパラメータが必要です - 125+ 言語: 個別の NuGet 言語パックとして提供されます(例:
IronOcr.Languages.ChineseSimplified)。他のパッケージ依存と同じ方法で管理されます -構造化された出力:結果には、ページ、段落、行、単語、および個々の文字の境界ボックスと信頼度スコアが表示されます。 - スレッドセーフ: 複数の
IronTesseractインスタンスが共有状態なしで並行して実行されます。 バッチワークロードを並列化するにはParallel.ForEach呼び出しです - 価格: $999 永続ライセンス (Lite, 1 開発者), $1,499 (Plus, 3 開発者), $2,999 (Professional, 10 開発者), $5,999 (Unlimited)
機能比較
| フィーチャー | PaddleSharp OCR | IronOCR |
|---|---|---|
| 必要なNuGetパッケージ | 最低3~4人 | 1 |
| モデル管理 | マニュアル(3つの別々のファイル) | None |
| PDF入力 | いいえ(変換が必要です) | ネイティブ |
| 言語数 | 約10~20 | 125+ |
| GPUアクセラレーション | はい(CUDA) | CPU最適化済み |
| 前処理 | マニュアル(OpenCV) | 自動翻訳 |
| 価格について | 無料(Apache 2.0) | $5,999 永続ライセンス |
詳細な機能比較
| フィーチャー | PaddleSharp OCR | IronOCR |
|---|---|---|
| セットアップと展開 | ||
| 必要なNuGetパッケージ | 3~4 | 1 |
| モデルファイルのダウンロード | はい(3ファイル、合計約15MB) | なし |
| OpenCVの依存関係 | 必須 | None |
| GPU向けCUDA/cuDNN | GPUモードに必要 | 該当なし |
| Dockerデプロイメント | 複雑な(ネイティブランタイム) | 単層追加 |
| エアギャップ展開 | はい(モデルのダウンロード後) | はい |
| テキスト認識 | ||
| 中国語/日本語/韓国語の正確性 | 高(主な焦点) | 高い |
| ラテン文字の正確性 | 適度 | 高い |
| 手書き | 制限的 | サポート対象 |
| 低品質スキャン処理 | 手動による前処理が必要 | 自動翻訳 |
| 自動傾き補正 | なし | はい |
| 自動ノイズ除去 | なし | はい |
| 入力ソース | ||
| 画像ファイル | はい(OpenCV経由) | はい |
| PDFファイル(ネイティブ形式) | なし | はい |
| パスワードで保護されたPDF | なし | はい |
| ストリームとバイト配列 | OpenCV経由 | はい |
| 複数ページTIFF | OpenCV経由 | はい |
| 出力 | ||
| プレーンテキスト | はい | はい |
| 検索可能なPDF | なし | はい |
| hOCR | なし | はい |
| 単語レベルの境界ボックス | はい | はい |
| 信頼度スコア | はい | はい |
| 構造化されたページ/行/単語階層 | 一部地域のみ | フル |
| 言語サポート | ||
| 言語数 | 約10~20 | 125+ |
| 言語のインストール方法 | モデルパックのダウンロード | NuGetパッケージ |
| 多言語文書 | 制限的 | はい |
| カスタム言語トレーニング | はい(パドルパドル) | はい |
| プラットフォームサポート | ||
| ウィンドウズ | はい | はい |
| Linux | はい(複雑な設定) | はい |
| macOS | 制限的 | はい |
| Docker | はい(ネイティブランタイムの場合) | はい |
| AWSラムダ | 複雑 | はい |
| パフォーマンス | ||
| CPUシングルイメージ | 500~1500ms | 100~400ms |
| GPUシングルイメージ | 100~300ms | 該当なし |
| メモリ(CPUモード) | より高い | 適度 |
| OCR中のバーコード読み取り | なし | はい |
| 商業化への準備 | ||
| 商用ライセンス | アパッチ2.0 | 開発者ごとに永久 |
| サポートチャンネル | GitHub の問題 | メールサポート |
| 英語のドキュメント | スパース | 豊富なドキュメント、チュートリアル、ハウツーガイド |
| 生産事例研究 | まれ(.NET固有) | 文書化済み |
抽象化の深さと保守リスク
PaddleSharpは、このカテゴリにおいて、前提条件として3つの独立したアップストリームプロジェクトを実行する唯一 for .NET OCRオプションです。 その深さこそが、制作チームにとって最大のリスクとなる。
パドルシャープアプローチ
実際の依存関係チェーンは次のようになります。
- Baidu PaddlePaddle — 基盤となる深層学習フレームワーク。 モデル形式と推論APIはここで定義されています。
- PaddleOCR — Baiduのモデルトレーニングプロジェクトで、検出、分類、認識モデルの重みを生成します。
- Sdcb.PaddleSharp — PaddleInferenceネイティブライブラリを呼び出し、モデル読み込みAPIをラップする.NETバインディングレイヤー。
各レイヤーには、独自のリリースサイクル、互換性のない変更履歴、およびコミュニティがあります。 BaiduがPaddlePaddleの推論APIを更新すると、バインディングレイヤーもそれに合わせて更新する必要があります。PaddleOCRのバージョン間でモデル形式が変更された場合、PaddleSharp内のモデルのダウンロードパスと読み込みコードを更新する必要があります。 .NETチームにとって、これらはデプロイメントが失敗するまで目に見えないものです。
初期化コストの簡略化された図解:
// Simplified — see Sdcb.PaddleOCR documentation for full API
// This is not one line of setup; it represents several coordinated decisions:
// - Which model version to use (ChineseV3, V4, etc.)
// - Whether models are local files or downloaded on first use
// - Which inference backend (CPU, MKL, GPU)
// - Which OpenCvSharp runtime package matches the deployment OS
var detModel = LocalFullModels.ChineseV3.DetectionModel; // Version-specific
var clsModel = LocalFullModels.ChineseV3.ClassifierModel; // Version-specific
var recModel = LocalFullModels.ChineseV3.RecognitionModel; // Version-specific
var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// If a newer model format is released, these names and classes may change
// Simplified — see Sdcb.PaddleOCR documentation for full API
// This is not one line of setup; it represents several coordinated decisions:
// - Which model version to use (ChineseV3, V4, etc.)
// - Whether models are local files or downloaded on first use
// - Which inference backend (CPU, MKL, GPU)
// - Which OpenCvSharp runtime package matches the deployment OS
var detModel = LocalFullModels.ChineseV3.DetectionModel; // Version-specific
var clsModel = LocalFullModels.ChineseV3.ClassifierModel; // Version-specific
var recModel = LocalFullModels.ChineseV3.RecognitionModel; // Version-specific
var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// If a newer model format is released, these names and classes may change
' Simplified — see Sdcb.PaddleOCR documentation for full API
' This is not one line of setup; it represents several coordinated decisions:
' - Which model version to use (ChineseV3, V4, etc.)
' - Whether models are local files or downloaded on first use
' - Which inference backend (CPU, MKL, GPU)
' - Which OpenCvSharp runtime package matches the deployment OS
Dim detModel = LocalFullModels.ChineseV3.DetectionModel ' Version-specific
Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel ' Version-specific
Dim recModel = LocalFullModels.ChineseV3.RecognitionModel ' Version-specific
Dim ocr As New PaddleOcrAll(detModel, clsModel, recModel)
' If a newer model format is released, these names and classes may change
ここではバージョンによる違いが非常に重要になる。 Sdcb.PaddleOCR のバージョン2.xに固定されているチームが、新しいモデルにアクセスするためにアップグレードするには、バインディング層でAPIの変更に直面します。 上流のモデルファイルは、PaddleOCRの主要リリース間で下位互換性がありません。
IronOCRのアプローチ
IronOCRは、エンジンとすべての依存関係をNuGetパッケージ内にバンドルして提供します。 選択するモデルバージョンはなく、設定する推論バックエンドもなく、同期を維持する二次ライブラリもありません。
// One package: dotnet add package IronOcr
// なし model downloads. なし OpenCV. なし runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var result = new IronTesseract().Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
// One package: dotnet add package IronOcr
// なし model downloads. なし OpenCV. なし runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var result = new IronTesseract().Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' One package: dotnet add package IronOcr
' なし model downloads. なし OpenCV. なし runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim result = New IronTesseract().Read("document.jpg")
Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")
IronOCRのアップグレードは、 NuGetパッケージのバージョンアップ1回で済みます。APIの変更点はリリースノートに記載されており、メジャーバージョン間の下位互換性は維持されています。 CI/CDパイプラインで作業するチームにとって、デプロイ対象領域の違いは大きい。1つのパッケージで済む場合と、4つのパッケージにPlusプラットフォーム固有のランタイムパッケージと、ディスク上の適切なパスに存在しなければならないモデルファイルが必要になる場合との違いだ。
設定オプションについてはIronTesseractのセットアップガイドを、対応している入力ソースの完全なリストについては画像入力方法ガイドを参照してください。
対応言語
PaddleOCRは主に中国語向けに訓練されており、英語は第二言語として扱われています。 PaddleSharp を取り巻く.NETコミュニティは、その起源を反映しています。中国語(簡体字、繁体字)、英語、その他いくつかの言語のモデル パックは存在しますが、約 10 ~ 20 言語を超える範囲は限られており、CJK 以外のモデルのメンテナンスは、上流プロジェクトが関心を持ち続けるかどうかにかかっています。
パドルシャープアプローチ
PaddleSharpで言語を切り替えるということは、モデルセットを切り替えることを意味します。 認識モデルは言語固有のものであり、単純なAPIフラグはありません。異なるモデルオブジェクトのセットをインスタンス化する必要があります。
// Simplified — see Sdcb.PaddleOCR documentation for full API
// English model set (if available for your version)
// var recModel = LocalFullModels.EnglishV3.RecognitionModel;
// Chinese model set (primary supported use case)
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// Non-CJK languages require checking upstream PaddleOCR model availability
// Mixed CJK + Latin in the same document may require model selection decisions
// Simplified — see Sdcb.PaddleOCR documentation for full API
// English model set (if available for your version)
// var recModel = LocalFullModels.EnglishV3.RecognitionModel;
// Chinese model set (primary supported use case)
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// Non-CJK languages require checking upstream PaddleOCR model availability
// Mixed CJK + Latin in the same document may require model selection decisions
' Simplified — see Sdcb.PaddleOCR documentation for full API
' English model set (if available for your version)
' Dim recModel = LocalFullModels.EnglishV3.RecognitionModel
' Chinese model set (primary supported use case)
Dim detModel = LocalFullModels.ChineseV3.DetectionModel
Dim recModel = LocalFullModels.ChineseV3.RecognitionModel
Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel
Dim ocr = New PaddleOcrAll(detModel, clsModel, recModel)
' Non-CJK languages require checking upstream PaddleOCR model availability
' Mixed CJK + Latin in the same document may require model selection decisions
フランス語の請求書、ドイツ語の契約書、アラビア語の書式などを処理するチームにとって、問題は単にモデルパックが現在存在するかどうかではなく、来年もそれが維持されるかどうか、そしてそれを設定するための英語のドキュメントが存在するかどうかである。
IronOCRのアプローチ
IronOCRは、125以上の言語をNuGetパッケージとして提供しています。 各言語パックは他の依存関係とまったく同じようにインストールされ、手動でのファイルデプロイなしに標準的なCI/CDパイプラインと統合されます。
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.Arabic
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English); // Mixed-language document
var result = ocr.Read("mixed-document.jpg");
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.Arabic
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English); // Mixed-language document
var result = ocr.Read("mixed-document.jpg");
' dotnet add package IronOcr.Languages.ChineseSimplified
' dotnet add package IronOcr.Languages.French
' dotnet add package IronOcr.Languages.Arabic
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.English) ' Mixed-language document
Dim result = ocr.Read("mixed-document.jpg")
多言語ガイド では、スクリプトを混在させたドキュメントに対する複数言語の同時認識をカバーしており、モデルレベルでの決定は必要なく、ただの AddSecondaryLanguage 呼び出しだけです。
複数の言語で文書を扱うチーム、あるいは言語要件が当初の範囲を超えて拡大することが予想されるチームにとって、メンテナンス体制が変動する10~20言語セットよりも、メンテナンスされたNuGetパッケージに支えられた125言語カタログの方が、より耐久性のある選択肢となります。
前処理とPDFサポート
PaddleOCRのニューラルネットワークパイプラインは、CJKテキストに関しては従来のOCRよりも画像品質のばらつきにうまく対応できますが、傾き補正、ノイズ除去、解像度正規化などのタスクのための組み込み画像前処理APIは提供していません。 前処理はすべてOpenCVで記述する必要がある。OpenCVはPaddleSharpが既に必要としているライブラリだが、画像処理の専門家ではないチームにとっては、コードを書く機会が大幅に増えることになる。
PDFへの対応は、より難しい課題です。PaddleSharpにはネイティブのPDFリーダーがありません。 PDFファイルを受け取るドキュメントパイプラインでは、OCRエンジンを呼び出す前に各ページを画像に変換する必要があります。そのためには、別途PDFライブラリが必要となり、依存関係が増え、中間ファイル管理が発生します。
パドルシャープアプローチ
// Simplified — see Sdcb.PaddleOCR documentation for full API
// PaddleSharp has no PDF support — pages must be pre-converted to images
// Preprocessing (deskew, denoise) requires OpenCV operations:
using OpenCvSharp;
// Load image via OpenCV
using var image = Cv2.ImRead("scan.jpg");
// Manual grayscale conversion
using var gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
// Manual threshold (binarization)
using var binary = new Mat();
Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary);
// Then pass to OCR engine
var result = _ocr.Run(binary);
// Each preprocessing step requires OpenCV knowledge
// PDF pages require a separate PDF-to-image conversion step first
// Simplified — see Sdcb.PaddleOCR documentation for full API
// PaddleSharp has no PDF support — pages must be pre-converted to images
// Preprocessing (deskew, denoise) requires OpenCV operations:
using OpenCvSharp;
// Load image via OpenCV
using var image = Cv2.ImRead("scan.jpg");
// Manual grayscale conversion
using var gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
// Manual threshold (binarization)
using var binary = new Mat();
Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary);
// Then pass to OCR engine
var result = _ocr.Run(binary);
// Each preprocessing step requires OpenCV knowledge
// PDF pages require a separate PDF-to-image conversion step first
Imports OpenCvSharp
' Load image via OpenCV
Using image As Mat = Cv2.ImRead("scan.jpg")
' Manual grayscale conversion
Using gray As New Mat()
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY)
' Manual threshold (binarization)
Using binary As New Mat()
Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary)
' Then pass to OCR engine
Dim result = _ocr.Run(binary)
' Each preprocessing step requires OpenCV knowledge
' PDF pages require a separate PDF-to-image conversion step first
End Using
End Using
End Using
この前処理を記述することは、OpenCVの経験を持つチームであれば可能です。 OpenCVを導入していないチームにとって、学習曲線は決して容易ではない。OpenCVは幅広いAPIを備えており、ドキュメントは主にC++を前提としているからだ。
IronOCRのアプローチ
IronOCRの前処理パイプラインは、外部ライブラリを必要としません。 画像を受け付けるのと同様に、同じ OcrInput オブジェクトがPDFも受け付け、前処理フィルタは単一のメソッド呼び出しです:
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
// Built-in preprocessing — no OpenCV, no manual image math
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
// Built-in preprocessing — no OpenCV, no manual image math
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
' Built-in preprocessing — no OpenCV, no manual image math
input.Deskew()
input.DeNoise()
input.Contrast()
input.Binarize()
input.EnhanceResolution(300)
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
PDF入力の場合、ネイティブサポートとは変換ステップが不要であることを意味します。
// PDF input — no external library, no page conversion
var result = new IronTesseract().Read("scanned-document.pdf");
// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
// Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
// PDF input — no external library, no page conversion
var result = new IronTesseract().Read("scanned-document.pdf");
// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
// Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronTesseract
' PDF input — no external library, no page conversion
Dim result = New IronTesseract().Read("scanned-document.pdf")
' Password-protected PDFs
Using input As New OcrInput()
input.LoadPdf("encrypted.pdf", Password:="secret")
result = New IronTesseract().Read(input)
End Using
' Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf")
画像品質補正ガイドでは、利用可能なすべてのフィルターを例を交えて解説しています。 PDF入力の手順では、ページ選択、ストリーム入力、パスワード処理について説明します。 スキャンした文書から検索可能なPDFを作成するチームにとって、検索可能なPDF出力は組み込みの出力形式であり、別途処理手順として行う必要はありません。
APIマッピングリファレンス
| PaddleSharp OCRコンセプト | IronOCR相当値 |
|---|---|
Sdcb.PaddleOCR (namespace) |
IronOcr (namespace) |
PaddleOcrAll |
IronTesseract |
LocalFullModels.ChineseV3.DetectionModel |
同等のものは存在しないため、モデル選択は不要です。 |
LocalFullModels.ChineseV3.RecognitionModel |
同等のものは存在しないため、モデル選択は不要です。 |
LocalFullModels.ChineseV3.ClassifierModel |
同等のものは存在しないため、モデル選択は不要です。 |
Cv2.ImRead(path) (OpenCV 画像読み込み) |
input.LoadImage(path) |
_ocr.Run(matImage) |
ocr.Read(input) または ocr.Read("file.jpg") |
result.Regions |
result.Words, result.Lines, result.Pages |
region.Text |
word.Text, line.Text, page.Text |
region.Rect.Center |
word.X, word.Y |
| 言語モデルの切り替え(新しいモデルセット) | ocr.Language = OcrLanguage.French |
PaddleConfig (推論バックエンド設定) |
同等のものはありません — 自動設定 |
| OpenCvSharpのしきい値処理/グレースケール操作 | input.Binarize(), input.ToGrayScale() |
| PDFはサポートされていません - 画像に事前変換してください | input.LoadPdf("file.pdf") |
| 検索可能なPDF出力はありません | result.SaveAsSearchablePdf("output.pdf") |
チームがPaddleSharp OCRからIronOCRへの移行を検討する場合
パイプラインはCJK以外の文書を処理します
PaddleSharpは中国人向けに作られた。 その伝統は、モデル命名規則(中国語V3)、主要なドキュメント言語、および言語パックの提供状況に表れています。 中国語の文書処理から始めて、フランス語の請求書やドイツ語の契約書へと業務を拡大しようとするチームは、大きな壁にぶつかる。CJK以外の言語に対応したモデルパックは少なく、CJK以外のモデルのメンテナンス体制は不確実であり、それらの設定に関する英語のドキュメントも乏しいからだ。 IronOCRのNuGet経由の125以上の言語カタログにより、言語拡張は研究プロジェクトではなく、パッケージのインストールで済む。
デプロイメント環境にはGPUがありません
PaddleOCRのディープラーニングパイプラインは、GPU推論向けに設計されています。 CPU処理に関しては、パフォーマンスの数値は正確です。一般的な文書解像度では、画像1枚あたり500~1500ミリ秒です。 数千ものドキュメントを処理するバッチパイプラインや、同時実行されるOCRリクエストを処理するASP.NETアプリケーションの場合、CPUモードのPaddleSharpは、規模が大きくなるにつれて累積するレイテンシを増加させます。 IronOCRの最適化されたTesseract 5エンジンは、GPUを必要とせず、CPU上で画像1枚あたり100~400ミリ秒で動作します。 標準のVMティア、GPUパススルーのないコンテナ、またはCIワーカーへのデプロイメントの場合、その違いは、ワークロードが適合するかしないかの違いになります。
PDF文書は入力パイプラインにあります
PDFはビジネス文書の記録形式として広く用いられています。 PaddleSharpにはPDFリーダーがありません。 PaddleSharpをベースに開発を進めた後でこの制限に気づいたチームは、次の選択肢に直面します。PDFライブラリを追加する(ライセンスやバージョン管理など、さらに別の依存関係を管理することになる)、前処理ステップとしてPDFを画像に変換する(ストレージとI/Oのオーバーヘッドが増加する)、またはネイティブのPDFサポートを備えたライブラリに移行する。 IronOCRは、パスワードで保護されたPDFやページ範囲選択など、PDF入力にネイティブに対応しているため、PDFから始まるドキュメントワークフローにとって最適な選択肢となります。
依存関係チェーンがセキュリティまたはコンプライアンスレビューに合格しない
医療、金融、政府機関などのEnterpriseソフトウェア導入では、多くの場合、ソフトウェアの構成部品表と依存関係の監査が必要となる。 PaddleSharpのチェーンには、Baidu由来のモデルファイルとBaiduの深層学習推論ランタイムが含まれています。ソフトウェアコンポーネントの提供元を特定のものに限定するポリシーを持つ組織、またはベンダーのセキュリティ開示への明確な道筋を必要とするチームにとって、Baidu由来のバイナリへの依存は追加のレビュー手順を必要とします。 IronOCRは、欧米のソフトウェアベンダーが提供する単一の商用製品であり、ライセンス条項が文書化されており、標準的な商用サポート契約が付帯しています。
チームは運営費を賄うだけの人員を確保できない
PaddleSharpのデプロイメントを18か月以上維持するには、モデルバージョンの互換性を追跡し、OpenCVランタイムパッケージのバージョンをプラットフォーム固有のデプロイメントと調整し、GPUを使用している場合はCUDAツールキットのバージョンを一致させ、破壊的変更がないか上流のGitHubイシュー(主に中国語)を監視する必要があります。 それは決して軽視できない運用投資である。 コアコンピタンスがディープラーニングのインフラストラクチャではなく、構築するアプリケーションであるチームにとって、PaddleSharpの管理にかかるオーバーヘッドは、そのコストに見合う価値を生み出しません。
一般的な移行の考慮事項
OpenCVへの依存関係を削除する
PaddleSharp には、OpenCvSharp4 と画像読み込み用のプラットフォーム特定の OpenCvSharp4.runtime.* パッケージが必要です。 IronOCR は System.Drawing.Bitmap、ファイルパス、ストリーム、およびバイト配列を OcrInput 経由で直接受け入れます。 移行とは、Cv2.ImRead() 呼び出しを input.LoadImage() に置き換え、OpenCvSharp パッケージの参照を完全に削除することを意味します:
// PaddleSharp pattern — requires OpenCV
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);
// IronOCR equivalent — no OpenCV
var result = new IronTesseract().Read(imagePath);
// PaddleSharp pattern — requires OpenCV
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);
// IronOCR equivalent — no OpenCV
var result = new IronTesseract().Read(imagePath);
Imports OpenCvSharp
Imports IronOcr
' PaddleSharp pattern — requires OpenCV
Using image As Mat = Cv2.ImRead(imagePath)
Dim result = _ocr.Run(image)
End Using
' IronOCR equivalent — no OpenCV
Dim result = New IronTesseract().Read(imagePath)
画像入力ガイドでは、ストリーム、URL、メモリ内ビットマップなど、受け入れられるすべての入力タイプについて説明しています。
地域レベルの結果マッピング
PaddleSharp は result.Regions を返します — 検出されたテキスト領域の境界ボックスとテキスト文字列を持つフラットリストです。 IronOCRはより詳細な階層構造を返します。ページには段落が含まれ、段落には行が含まれ、行には単語が含まれ、それぞれに座標と要素ごとの信頼度スコアが付与されます。 もしあなたの移行コードが result.Regions を使用している場合、位置データ付きのフラットワード列挙のための IronOCR の同等物は次のとおりです:
var result = new IronTesseract().Read("document.jpg");
// Per-word with position — equivalent to PaddleSharp region enumeration
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%");
}
var result = new IronTesseract().Read("document.jpg");
// Per-word with position — equivalent to PaddleSharp region enumeration
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%");
}
Imports System
Imports IronOcr
Dim result = New IronTesseract().Read("document.jpg")
' Per-word with position — equivalent to PaddleSharp region enumeration
For Each word In result.Words
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%")
Next
結果の読み取りガイドには、結果の完全な構造が記載されています。 信頼度スコアガイドでは、要素ごとの信頼度値と、それらを品質フィルタリングにどのように使用するかについて説明しています。
OCRエンジンのライフサイクル管理
PaddleSharp の PaddleOcrAll は構築が高コストです — 作成時にディスクからモデルバイナリをロードし、ASP.NET Core ではシングルトンまたはスコープサービスとして扱われるべきです。 IronOCR の IronTesseract は初期化コストが軽いですが、同じ原則が適用されます: ウェブアプリケーションでリクエスト間でインスタンスを再利用することは、リクエストごとに構築するよりも効率的です。両方のケースで、シングルトンまたはリクエストごとのスコープサービスとしての依存性注入が正しいパターンです。
言語パックのインストール
PaddleSharpの言語サポートとは、構築時に異なるモデルセットを選択することを意味します。IronOCRIronOCR、言語サポートはプロジェクトに追加されるNuGetパッケージと、1行の構成呼び出しによって実現されます。
// dotnet add package IronOcr.Languages.ChineseSimplified
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
var result = ocr.Read("document.jpg");
// dotnet add package IronOcr.Languages.ChineseSimplified
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
var result = ocr.Read("document.jpg");
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
Dim result = ocr.Read("document.jpg")
PaddleSharpから移行するCJKチーム向けには、中国語簡体字、中国語繁体字、日本語、韓国語がIronOCR言語パックとして利用可能です。 カスタム言語ガイドでは、特殊なユースケース向けにカスタムトレーニングされたtessdataを取り込む方法について説明しています。
IronOCRの追加機能
上記で比較した機能以外にも、 IronOCRはPaddleSharpの範囲を完全に超える機能を提供しています。
- 領域ベースの OCR: ページ全体を処理することなく、画像の特定ゾーン — ヘッダ行、請求書合計、特定のフォームフィールド — を
CropRectangleを使用してターゲットとします -非同期OCR :スレッドをブロックすることなく、OCRをASP.NET Coreリクエストパイプラインに統合するための組み込み非同期サポート -パスポートとIDの読み取り:旅行書類と身分証明書から機械可読ゾーンデータを構造的に抽出する -表の読み取り:単語座標の空間的グループ化により、表形式の文書レイアウトから行列構造を再構築する -ライセンス:開発者ごとに永続ライセンスが付与され、ランタイムロイヤリティは発生せず、試用モードでは開発段階での使用は無料です。
.NETの互換性と将来の準備
IronOCRは.NET 8および.NET 9を対象とし、x64およびx86アーキテクチャにおけるWindows、Linux、macOSを完全にサポートし、コンテナ化されたワークロード向けのDockerデプロイメントガイドを公開しています。 PaddleSharpは最新 for .NETランタイムをサポートしていますが、クロスプラットフォーム対応はOpenCVランタイムパッケージによって複雑になっています。OpenCVランタイムパッケージはプラットフォーム固有のNuGetパッケージとして個別に配布されているため、環境ごとに適切なパッケージを選択してデプロイする必要があります。 IronOCRのシングルパッケージ展開モデルは、このようなプラットフォームマトリックスを完全に排除し、 Linux 、 AWS 、 Azureの展開ガイドは、テスト済みの本番環境向け構成を反映しています。
結論
PaddleSharpは、ある特定のシナリオにおいて説得力のある主張を展開します。それは、CUDA対応GPUを搭載したハードウェア上で主に中国語の文書を処理するチームの場合で、CJKテキストに対するディープラーニングの精度上限が、導入の容易さよりも重要となる場合です。 それは現実的なユースケースであり、その中でPaddleSharpは期待に応えてくれる。 この3段階のニューラルネットワークパイプラインは、高度なディープラーニングへの投資を反映した精度で、密度の高い中国語テキストを認識する。
そのシナリオ以外では、抽象化の深さはむしろマイナス要因となる。 上流の依存関係にある3つのライブラリ(Baiduの推論フレームワーク、PaddleOCRモデルトレーニングプロジェクト、PaddleSharp .NETバインディングレイヤー)はそれぞれ独自のリリースサイクルを持っており、それらのメンテナンスの整合性は保証されていません。 英語のドキュメントは乏しい。 CJK以外の言語カタログは内容が乏しく、維持管理も一貫していない。 PDF入力には別途ライブラリが必要です。 GPUを使用しない場合、画像ごとのCPUレイテンシは500~1500msで、IronOCRの100~400msと比べて大幅に長くなります。
IronOCR のトレードオフは逆です: 単一の商用パッケージで、$999 のエントリ価格、モデル管理なし、ネイティブのPDFおよびマルチフォーマット入力、NuGet パッケージとしての125以上の言語、および OpenCV を不要とする組み込みの前処理があります。抽象化は設計上のもので、抽象化は安定しています — アプリケーションを稼働させ続けるために、チームが上流の Baidu モデルフォーマットの変更を追うことを要求していません。
汎用的な英語または多言語OCRのニーズ、PDFワークフロー、あるいはGPUハードウェアの使用が制限されるような導入上の制約があるチームにとって、 IronOCRは最適な選択肢です。IronOCRのドキュメントには、入力タイプ、前処理オプション、出力フォーマットの全範囲が網羅されており、チュートリアルハブには、請求書からパスポート、スキャンされたアーカイブまで、一般的なドキュメントタイプに対応した動作コードが用意されています。
よくある質問
PaddleSharp OCRとは何ですか?
PaddleSharp OCRは、開発者や企業が画像や文書からテキストを抽出するために使用するOCRソリューションです。これは.NETアプリケーション開発のためにIronOCRと共に評価されるいくつかのOCRオプションの一つです。
IronOCRは.NET開発者向けPaddleSharp OCRと比較してどうですか?
IronOCRはNuGetネイティブ for .NET OCRライブラリで、.CoreエンジンとしてIronTesseractを使用しています。PaddleSharp OCRと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額制の価格設定、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。
IronOCRはPaddleSharp OCRよりセットアップが簡単ですか?
IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。
PaddleSharp OCRとIronOCRにはどのような精度の違いがありますか?
IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。
IronOCRはPDFテキスト抽出をサポートしていますか?
IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。
PaddleSharp OCRライセンスはIronOCRと比較してどうですか?
IronOCRは、定額制の永久ライセンスで、ページ毎やスキャン毎の課金はありません。大量のドキュメントを処理する組織は、ボリュームに関係なく同じライセンス費用を支払います。詳しくはIronOCRライセンスページをご覧ください。
IronOCR はどの言語をサポートしていますか?
IronOCRは個別のNuGet言語パックにより127言語をサポートしています。言語を追加するには'dotnet add package IronOcr.Languages.{Language}'コマンドを実行するだけです。手動でのファイル配置やパス設定は必要ありません。
.NETプロジェクトにIronOCRをインストールするにはどうすればよいですか?
NuGet経由でインストールします:パッケージマネージャーコンソールで'Install-Package IronOcr'、またはCLIで'dotnet add package IronOcr'。追加の言語パックも同様にインストールされます。ネイティブSDKインストーラーは必要ありません。
IronOCRはPaddleSharpと違い、Dockerやコンテナ・デプロイメントに適していますか?
IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。
PaddleSharpと比較して、購入前にIronOCRを試すことはできますか?
IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。
IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?
IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。
PaddleSharp OCRからIronOCRへの移行は簡単ですか?
PaddleSharp OCRからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス生成に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減します。

