画像内に記された文字をUnityプロジェクト上で認識する上で、Tesseractが比較的導入が容易であり精度もよかったので、ひとまず導入と軽い動作確認までの記録を残していこうと思います。
私の使用目的としては、画像内に記された"数字"を"ある程度"認識できれば良いというユルいものなので、ひとまず数字認識用途に最低限いじるところをメモとして残していきます。
#プロジェクト導入
Unity上で簡易的な文字認識が実行可能なgitリポジトリが公開されていて、これを落としてくるだけで、基本的なEnglishの文字認識は動作します。
https://github.com/Neelarghya/tesseract-unity
※左が読み込んだ画像で認識した緑枠内の文字をTextで出力しています
#数字認識用途に少しいじってみる
下記の画像を読み込んでみます。
取り敢えず実行してみます(プロジェクトのmainシーン→Tesseractオブジェクト→TesseractDemoScriptコンポーネント→ImageToRecognizeに認識させたい画像の参照を持たせて実行)
結果画像の様に、全て数字として認識させたくとも文字を認識してしまう場合があります。
今回は意図的に数字の"11"に近い"ll"を置いていますが、数字を数字以外の文字列
として認識してしまう場合も当然あります。
Tesseractバージョン4以降深層学習が導入されているので、読み込んだ画像の"ll"が、"11"にどれくらい近いのかと言うスコアと"il"のスコアを比べてスコアの高い"il"を結果として出力したものだと考えますが、そもそも数字以外の結果を出さない様にいじることができます。
まず、DLLに用意されている関数をDllImportで引っ張ってくる必要があります。
TesseractWrapperクラスにDllImportを記述してある箇所があるので、そこに下記を追記します。
[DllImport(TesseractDllName)]
private static extern int TessBaseAPISetVariable(IntPtr handle, string name, string value);
TessBaseAPISetVariableは認識結果を限定するための関数です。
第2引数には、第3引数の文字列のみを結果として出す
「tessedit_char_whitelist」
第3引数の文字列を省略する
「tessedit_char_blacklist」が設定できます。
他どの様な関数が用意されているかは下記に並んでいるので参考にしてみると良いです。
http://tess4j.sourceforge.net/docs/docs-1.4/net/sourceforge/tess4j/TessAPI.html
TessBaseAPISetVariable関数を呼び出してみましょう。
Init関数に下記の要領で記述します。
_tessHandle = TessBaseAPICreate();
int init = TessBaseAPIInit3(_tessHandle ,dataPath , "eng");
// 数字のみの認識制限
TessBaseAPISetVariable(_tessHandle ,"tessedit_char_whitelist" ,"1234567890" );
以上で数字のみを認識結果とする処理に変わりました。
改めて出力してみます。
Boxパースクラスのインスタンスに読み込んだ文字のPositionも入っているので、応用すると
色んなことができそうですね。
ちなみに、gitリンクのプロジェクトはApacheライセンスなので商用利用も可能です。
https://github.com/tesseract-ocr/tesseract/blob/master/README.md
#最後に
より精度向上を考えるなら下記等の資料からtesseractの概要を把握する必要があります。gitのunityプロジェクトのtesseractはバージョン5.0alphaですが、リリースノートを確認する限り枠組み自体は大きく変わっていないので、そのままリンクの資料を参考にしても問題ないかと思います。
※tesseract4 https://laplace-daemon.com/training-tesseract/
※リリースノート https://github.com/tesseract-ocr/tesseract/releases
勉強する機会があったら次はTesseractの中身をまとめてみたいです。