かくすけのいろいろ作るブログ

かくすけの開発者ブログです。開発の他いろいろなモノづくりについて書きます。

【Tesseract OCR】【C#】Tesseract OCR をWindows Form Appで使ってみる

こんばんは。かくすけです!
相変わらずかめの速度ですが以下のWindows Form アプリケーションを継続して開発しています!

kakusuke98.hatenablog.com

今回はオープンソースOCRエンジン "Tesseract OCR" を導入し、その精度を "Google Translation API" "Windows10 のOCRエンジン" と比較してみました!

【注意】
私が開発しているのはゲーム内の英文をOCRで認識するものです。
日本語の精度確認はしておりません。

導入のきっかけ

まず、前回↓の記事でWindows 10のOCRエンジンを試してみて納得していたのになぜ Tesseract OCR に手を出したかというと、Windows10のOCRエンジンを使用する場合、利用する方に事前準備をしていただく必要があるからです。

kakusuke98.hatenablog.com

アプリ上でその準備をできるようにしたかったのですが、厳しそうだったので別のOCRエンジンを探したところ、Tesseract OCRを見つけました。

これであればアプリ内に必要データを入れこむことができるはず!!

アプリへの実装

C#での実装はこちらのページの内容ほぼそのまま使わせていただきました!

qiita.com

私はv3とv4の両方を使ってみたのですが、上の参考ページの方法はv3の方法です。
v4を使う場合は

Tesseract.Page page = tesseract.Process(img);

の部分を

Pix pix = PixConverter.ToPix(img);
Tesseract.Page page = tesseract.Process(pix);

みたいにしてTesseract専用のPixクラスに変換してあげる必要があります。
また、Pixクラスを使用するため最初に"using Tesseract;"での読み込みも必要です!

ちなみにv4はまだテスト段階です(2019/11/13 時点)

精度確認

さて、メインの精度検証に入ります。
Windows10のOCRを導入した際の以下記事での動作確認ではソースコードを読ませるという、精度確認とは絶対に言えないものだったので、Google, Windowsの精度確認も兼ねてます。

kakusuke98.hatenablog.com

今回は開発中のアプリの利用を想定し、ちゃんとゲーム画面で検証しましたよ!!

【ポイント】

  • 改行位置は開発中システムでいじっていたりするので気にしないこと
  • 実際の利用を想定して画面の切り抜き範囲(赤枠部分)は広めに設定している
  • 画面画像→認識結果表 の順番で載せていきます
  • 認識結果表の赤文字は誤字部分黄色ハイライトは問題のある脱字部分青文字は評価除外部分です。記号など、認識できなくても仕方ない部分は無視しています。
  • 認識結果表の赤文字と黄色ハイライトは私が手作業で付けてます。ちょっとくらい間違ってても許してくださいw
  • 誤認識率といった数字での結果は出していません。全部所感です。
  • Tesseract OCR v4 だけは切り抜き範囲を手動で指定しなおしたので若干元画像が違います。v3と同時に動作させることができなかったためです。精度にも少し影響あるかも…

使用した画面画像は11枚、画面画像を使わせていただいたゲームは

  • Remnant From the Ashes
  • The Wolf's Bite
  • Pyre

の3本です!どれも日本語がなくて自分自身悲しんでいるゲームです。自分のシステム使って遊ぶぞ!

画像1(Remnant From the Ashes)

f:id:kakusuke98:20191113234720p:plain

f:id:kakusuke98:20191113235251p:plain

画像2(Remnant From the Ashes)

f:id:kakusuke98:20191113235320p:plain

f:id:kakusuke98:20191113235342p:plain

画像3(The Wolf's Bite)

f:id:kakusuke98:20191113235553p:plain

f:id:kakusuke98:20191113235620p:plain

画像4(The Wolf's Bite)

f:id:kakusuke98:20191113235944p:plain

f:id:kakusuke98:20191113235704p:plain

画像5(The Wolf's Bite)

f:id:kakusuke98:20191114000108p:plain

f:id:kakusuke98:20191113235712p:plain

画像6(The Wolf's Bite)

f:id:kakusuke98:20191114000017p:plain

f:id:kakusuke98:20191113235724p:plain

画像7(Pyre)

f:id:kakusuke98:20191114000153p:plain

f:id:kakusuke98:20191113235817p:plain

画像8(Pyre)

f:id:kakusuke98:20191114000208p:plain

f:id:kakusuke98:20191113235825p:plain

画像9(Pyre)

f:id:kakusuke98:20191114000243p:plain

f:id:kakusuke98:20191113235836p:plain

画像10(Pyre)

f:id:kakusuke98:20191114000310p:plain

f:id:kakusuke98:20191113235843p:plain

画像11(Pyre)

f:id:kakusuke98:20191114000326p:plain

f:id:kakusuke98:20191113235852p:plain

感想

"考察"なんてタイトル付けられるほどの考察はできないので"感想"でw

私での所感での大雑把な精度の高さは
Google Translation API > Windows10 OCRエンジン > Tesseract OCR v4 > Tesseract OCR v3
ですね

やはりGoogleの認識精度はとんでもないですね!
Remnant From the Ashes のような"ゲーム画面に直接文字が表示されている"パターンでもばっちり。
選択肢部分をまとめて切り抜いた場合もしっかり認識してくれます。

Windows 10OCRエンジンは目立った問題はなく、たまに謎の誤認識があります。

そして今回のメイン、Tesseract OCR ! Tesseract OCRは背景の影響を強く受けてしまっていますね。文字以外の部分がごちゃっとしていると余計な文字が認識結果に含まれてしまいます。
画像4の↓の部分が全く認識できていませんでしたが、
f:id:kakusuke98:20191114002420p:plain ここの部分だけを指定してあげればちゃんと認識してくれました。やはり背景の影響を受けているみたいですね。画像全体の色味を元に画像変換処理がされているとかかもしれません。

また、文字が小さいものも苦手なようです。
画像8の認識結果は散々でしたが、切り抜き部分を拡大した状態で切り抜き、認識させてあげることでちゃんと認識されました。
システムで拡大させるだけで精度を上げることができるのであればここはそんなに問題ありませんね!
v3とv4は大きな差はこれだけではわかりませんが、やはり精度が上がっているような気がします。

Tesseract OCRGoogleWindowsには劣りますが、オープンソースですから。十分な精度を出してくれていると思います!
普通に吹き出しの内容だけを認識させてあげた場合にはちゃんと認識していますからね。

今後の方針

精度確認の結果から、私のアプリの方針が決まりました。

  1. デフォルトで使えるのは"Tesseract OCR"
  2. ちょっとした手間をかけて設定してくれる人は"Windows 10 のOCR"を使える
  3. 課金で"Google Translation API"の使用回数を購入できる

こんな感じ!
課金までしてGoogleを使う人は少ないと思いますが、それでコール回数分の使用量はまかなえます。

やっぱりこういう比較をするのは楽しいですね!
最後までお読みくださりありがとうございました!!