質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

2598閲覧

tesseract jpn の処理を速くしたい (Windows10, Visual Studio 2019, C#, .Net 4.7)

TAKASE_Hiroyuki

総合スコア21

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/05/02 00:07

編集2020/05/02 03:41

#主たる質問
Tessract の日本語処理と英語処理では、日本語処理の方がとても時間がかかります。処理を速くするにはどうすればよいでしょうか。

#環境等
Windows 10 上の Visual Studio 2019 で、C# でプログラムしています。
NuGet で、Tesseract 3.3.0 を次のようにインストールしました。
Tesseract 3.3.0

処理しようと考えている画像は、まだテスト用のもので、次のような画像です。
テスト画像

これを、Resources として取り込みました。
リソース

#ソースコード
プログラムは次のとおりです。

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 を入れました。
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秒程度の時間がかかります。ログを見てみると次のような大量の文が表示されています。
ログその1

エディターにコピーしてみたところ、全部で4万行近くになっていました。
ログその2

#質問
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) で終了しました。

Release ビルド

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/02 00:11

それを使ったことはありませんが、見る限り日本語の処理がまったくできていませんね。ほかのものを使うのが良いんじゃないかと思います。 https://codezine.jp/article/detail/10748
Zuishin

2020/05/02 00:12

上記「まったくできていない」と言うのは、ログを見ての勘違いでした。
dodox86

2020/05/02 00:14

Debugビルドでお試しのようですが、Releaseビルドで実行してみるとまた結果が変わるかもしれません。(4万行のデバッグ出力だと、それだけでもそれなりに時間を消費していると思います)
TAKASE_Hiroyuki

2020/05/02 00:14

御回答いただきありがとうございます。言語を eng とすれば、当然日本語の処理はできません。言語を jpn としたときには、本文の後半で述べているとおりほぼ正確に処理しています。ただし、時間がかかってしまうので、それを速くすることはできないでしょうか、という質問です。
TAKASE_Hiroyuki

2020/05/02 00:15

なるほど。Release ビルドで試してみます。しばらくお待ち下さい。
Zuishin

2020/05/02 00:21

https://qiita.com/ltzz/items/5a33700571488b0a6101 2500 個の画像に 1 時間かかるそうです。1 個約 40 秒ということですね。並列処理でそれを 10 分に縮めたということです。言語は Python ですが、ライブラリの主要な部分は同じでしょう。
TAKASE_Hiroyuki

2020/05/02 00:26

本文に追記したとおり、Release ビルドにしてもログの行数は、ほぼ同じでした。
dodox86

2020/05/02 00:41 編集

残念。必ず出力する類のメッセージなのですね。"Incomplete line ..."と出ているので、たぶん解析に失敗して別の条件を与えて再試行を繰り返しているのだと思います。ローカルで動くOCRエンジンは多分にCPUパワーを要求するものなので、Zuishinさんが紹介してくださっている記事のように、動作の最適化を自ら行わないと難しいのでしょう。手っ取り早いのはお使いのPCのスペックを上げるか。最近は、対象の画像を含むリソースをクラウド上にアップして、莫大なインフラとCPUパワーをもとにクラウド上で処理し、クライアントに送り返すような手法が主流だと思います。Tesseractは歴史が古いもので、クラウドが一般化する前から存在するソフトです。Googleも恐らくもう積極的にはメンテしていないと思います。
dodox86

2020/05/02 00:53

> Googleも恐らくもう積極的にはメンテしていないと思います。 失礼しました。「Googleも...」は本体のエンジンの話で、それも私が少し触ったことのあった過去の古い話でした。今はGitHub上にあって、有志の皆さんを含めてバージョンアップ、改良、保守が続けられているようですね。
YAmaGNZ

2020/05/02 00:56

デバッグビルドというよりは、デバッガでの動作でのログ出力にかなり時間が取られているのではないかと思います。 当方で、 デバッガ上での実行:約2500ms EXEを直接実行:約750ms となりました。
TAKASE_Hiroyuki

2020/05/02 03:35

dodox86 さん、YAmaGNZ さん、ありがとうございました。「まったくできない」ということではないので、とりあえず、だましだまし作ってみようと思います。特に、YAmaGNZ さんの「EXEを直接実行で750ms」に励まされました。本件は、とりあえず「自己解決」にさせていただければ幸いです。
guest

回答1

0

自己解決

「まったくできていない」ということではないので、実際のソフトウエアに組み込みながら、様子をみてみたいと思います。

特に、YAmaGNZさんの「デバッグビルドというよりは、デバッガでの動作でのログ出力にかなり時間が取られているのではないかと思います。当方で、デバッガ上での実行:約2500ms EXEを直接実行:約750ms となりました。」というコメントがありがたかったです。

投稿2020/05/02 03:39

TAKASE_Hiroyuki

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問