#主たる質問
Tessract の日本語処理と英語処理では、日本語処理の方がとても時間がかかります。処理を速くするにはどうすればよいでしょうか。
#環境等
Windows 10 上の Visual Studio 2019 で、C# でプログラムしています。
NuGet で、Tesseract 3.3.0 を次のようにインストールしました。
処理しようと考えている画像は、まだテスト用のもので、次のような画像です。
#ソースコード
プログラムは次のとおりです。
C#
1using System.Drawing; 2using System.Windows.Forms; 3 4namespace test22 5{ 6 public partial class Form1 : Form 7 { 8 public static string GetStringFromImage(Bitmap img) 9 { 10 string langPath = @"./"; 11 string lngStr = "eng"; 12 13 using (var tesseract = new Tesseract.TesseractEngine(langPath, lngStr)) 14 { 15 var page = tesseract.Process(img); 16 return page.GetText(); 17 } 18 } 19 public Form1() 20 { 21 InitializeComponent(); 22 Bitmap img = global::test22.Properties.Resources.test; 23 PictureBox pi = new PictureBox(); 24 25 pi.Size = new System.Drawing.Size(img.Size.Width, img.Size.Height); 26 pi.Image = img; 27 this.Controls.Add(pi); 28 29 string myResult = GetStringFromImage(img); 30 31 MessageBox.Show(myResult); 32 } 33 } 34}
#Tessdata
tessdata を格納するために、下図のようにフォルダを作成しました。
このなかに、日本語と英語の tessdata を入れました。
これらのデータは、次のGitHub から取得したものです。
https://github.com/tesseract-ocr/tessdata/blob/master/jpn.traineddata
https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata
#エラー
コンパイルエラー、実行時のエラーはありません
#動作について
上のプログラムを実行すると、(言語は英語なので)次のような結果が得られます。
ログをみてみると、次のような結果になっていました。
'test22.exe' (CLR v4.0.30319: DefaultDomain): 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: DefaultDomain): 'C:\Hiro_Win\hoga\test22\bin\Debug\test22.exe' が読み込まれました。シンボルが読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Hiro_Win\hoga\test22\bin\Debug\Tesseract.dll' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'InteropRuntimeImplementer.LeptonicaApiSignaturesInstance' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'InteropRuntimeImplementer.TessApiSignaturesInstance' が読み込まれました。 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました。モジュールがシンボルなしでビルドされました。 プログラム '[10680] test22.exe' はコード 0 (0x0) で終了しました。
表示されるまでの時間は、1秒未満です。次に、言語を日本語に変更します。
このように変更してプログラムを実行すると、次のような結果が得られます。
ところが、これが表示されるまでに、15秒程度の時間がかかります。ログを見てみると次のような大量の文が表示されています。
エディターにコピーしてみたところ、全部で4万行近くになっていました。
#質問
0. なにか必要なパラメータを設定しなかったために、このような重い処理になってしまったのでしょうか。
0. 必要な設定があれば、教えていただければ幸いです。
0. あるいは、日本語処理というものは、おおむねこのような時間が必要なものなのでしょうか。
0. tesseract よりもさらに速い OCR は存在するのでしょうか。
#追記
上の質問を投稿した時点では、Debug ビルドで試してましたが、Release ビルドでも試してみしました。しかし残念ながら、ログの行数はほぼ同じでした(38795行)。
ParamsModel::Incomplete line ParamsModel::Incomplete line ParamsModel::Incomplete line Pス ParamsModel::Incomplete line ParamsModel::Incomplete line `<E ParamsModel::Incomplete line ・ ParamsModel::Incomplete line ParamsModel::Incomplete line ・,ュ ParamsModel::Incomplete line ParamsModel::Incomplete line jpn:synth20170629:[1,48,0,1Ct3,3,16Mp3,3Lfys64Lfx96Lrx96Lfx512O1c1] 'test22.exe' (CLR v4.0.30319: test22.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました。モジュールがシンボルなしでビルドされました。 プログラム '[18080] test22.exe' はコード 0 (0x0) で終了しました。
回答1件
あなたの回答
tips
プレビュー