様々な紙媒体や手書きテキストの画像を文字コードの列に変換することを目的とする光学文字認識(OCR/Optical character recognition)エンジンソフトウェアの1つで日本語を含む今や優に100を超える国々の言語をサポート済みのTesseract OCR。
Tesseract OCRは、ヒューレットパッカード社が1985年から開発していたプロプライエタリソフトウェアで2005年にオープンソース化、2006年からGoogleが支援しているとされています。
今日は、このTesseract OCRで英語、横書き・縦書きの日本語の精度を確認してみたいと思います。
これは、OpenCV+Tesseract OCR+Pythonで温湿度計付きデジタル時計を読む布石、というか、既に読んでみた(文字解析・テキスト取得してみた)後追いです。
自身は、Raspberry Pi 400パソコン/Raspberry Pi OSを使いますが、Tessaractについては、tesseract-ocrというパッケージがリポジトリにあるのでこれをインストールします。
Tesseractは、デフォルトでは英語対応なので横書き・縦書きの日本語にも対応できるように併せてtesseract-ocr-jpn、tesseract-ocr-jpn-vertというパッケージもインストールします。
尚、当環境のTesseractバージョンは、4.1.1です。
実行方法としては、端末上でtesseractコマンドに他のパスにあるならパス付きでファイル名と標準出力への出力を表すハイフンの2つを渡して[tesseract FILE_PATH -]のようにするとデフォルトの英語版Tesseractが機能します。
デフォルトなので省略が可能ですが、省略せずに[-l]オプションに [eng]を渡してもOKです。
デフォルトではない日本語などの場合、この[-l]オプションに横書きなら[jpn]、縦書きなら[jpn_vert]を設定します。
[eng]、[jpn]、[jpn_vert]のような値は、/usr/share/tesseract-ocr/VERSION/tessdata/にある[*.traineddata]ファイルの[*]部分を表しており、別途追加したい場合、ここに対象となる適切な学習済み[*.traineddata]ファイルを配置すれば使えることになります。
tesseractには非公式のGUIもありますが、このようにtesseract自体はCLIベースです。
もちろん、Pythonなどのスクリプトにも組み込むことができます。
早速、この英語版WikipediaのTesseract (software)ページの一部をTesseract OCRにかけてみます。
端末での実行結果がこちら。
行の間隔が一部ズレていたり、引用の[]が一部文字化けしているものの、文字や数値は合っており、ソフトウェアのデフォルト言語であり、母語のラテン文字とは言え、本文のテキストは、正確で完璧ですね。
次は、日本語版WikipediaのTesseract(ソフトウェア)ページの一部をTesseract OCRにかけてみます。
端末での実行結果がこちら。
やはり、引用の[]が苦手なようで、それ自体、またそれに引きづられる恰好で数値も化けている部分、[ページ]と[ノート]の並びを[ぺ]といくつかの[改行]、[フート]、右向きの鍬の先端のような記号を「=で」と解釈している部分以外は、正確です。
書籍の注釈以外では、[]は、あまり登場しないと思いますけどね。
続いてWeb|ブラウザ版AIR草子において青空文庫から任意に選んだ[図書カード:ファラデーの伝]の5ページめを日本語縦書きの例としてTesseract OCRで処理してみます。
端末での実行結果がこちら。
縦書き、日本語用ということもあり、ページ上部の横書き部分、ページ下部のページ数/ページ総数については、さておきましょう。
文中においては、「修養の料にはならない」の「養」が[姜]に、「ならない」に[な]がだぶって[なならない]に、「一時に一人」の「に一人」が[た「人]になっていたりはしますが、それら以外は、正確です。
更に青空文庫のトップページの画像をお借りして日本語縦書き、かつ、背景のある画像を使ってTesseract OCRで解析してみます。
端末での実行結果がこちら。
「電子」が[衛生]に、「私たち」がスペースを含みつつ「系たまち」に、「青空の本」が[埋空の本]になっていますが、それら以外は、正確です。
ただ、「青空」については、後続の2つが正しく[青空]となっていることから、背景色が微妙に影響している可能性が高いように思います。
ひいては、「私」や「電子」が[系]や[衛生]となったのも、そうかもしれません。
また、jpn_vertによる縦のみならず、横のjpnで試しても青系の背景に青系の文字の「青空文庫」については、認識できませんでしたが、これも同じようにコントラストの可能性が高いようです。
尚、Tesseractにおいては、正面は得意ながら、それ以外は苦手という話もあるので読み取り対象が正面を向くように事前に編集・対処する必要がある場合もあるでしょう。
更に追加で、これら『こころ 夏目漱石』の青空文庫の書籍の表紙もTesseract OCRしてみましたが、一文字も検出されませんでした。
ただ、一方で同じ背景でも他の著者の書籍『銀河鉄道の夜 宮沢賢治』については、「青空文庫」を読み取ることはできず、「宮」を[官]と読み取り間違いはありつつもタイトル、作者まで読み取れたものもありました。
このことからするとTesseract OCRにとっては想定外のフォントだったとか、画像内の背景と文字のコントラスト、画像サイズ・文字サイズなどの違いや、実は微妙に正面を向いていなかったといったようなことが影響した可能性も考えられます。
もし、これらの仮説通りなら狙い通りで、冒頭、OpenCV+Tesseract OCR+Pythonで読んでみた結果の後追いと言いましたが、ほんの僅かでも陰影や光の当たり方や強弱、背景色と文字色の兼ね合いなどによって、また、対象画像の向きによっても文字の読みとりに影響があったと思われるケースがあったことから、あえて例として挙げてみた次第です。
最後にというか、ホントは最初に試してみたのですが、後述の縦書きバージョンもありつつ、自作の横書き日本語で、フォントやフォントサイズを微妙に変えてみたものをTesseract OCRにかけてみます。
自作テキスト日本語横書き版の端末での実行結果がこちら。
なぜか、空白混じりの「光工文」と四角2つが余計に入っている行がある、斜字のフォントにおいては「像」が[人]、「読」が[本]になっていたりします。
更にフォントを変えたことよりも、フォントサイズが小さすぎたのか、また、半角のクエスチョンマークを入れた影響もあるのか「無理じゃね?」が[押運じゃねの]にはなっています。
とは言え、そこを意識して対象を準備するか、編集・加工できれば解消する道もあるわけで他は、日付の数値含め、良好な結果と言えるのではないでしょうか。
ほんとに最後の自作の縦書き日本語バージョンで、フォントやフォントサイズを微妙に変えてみたものをTesseract OCRにかけてみます。
あ、テッサラクトじゃなくてテッセラクトか、お題が間違ってますね...。
自作テキスト日本語縦書き版の端末での実行結果がこちら。
縦書きの方は、線が細すぎたのか、フォントが意外だったのか、フォントサイズが小さすぎたのか、何らかの複合要因なのか、「光学式文字認識ソフト」の一文が丸々認識されませんでした。
が、ほかはTesseractにとって苦手なフォントがなかったようでクエスチョンマークの前に余計な[2]が入っている以外は良い感じです。
というわけで条件によっては、完璧に解読できており、Tesseractの基本的な精度は、なんとなく理解できた気がします。
よって、もし、さらなる文字の認識精度を上げたいと思った場合には、Tesseractの更なる進化に期待という部分もあるにせよ、入力として、どのような画像を提供できるか、解像度やフォント等々を含め、元画像をどれだけ編集・加工してTesseractが解釈しやすいように渡せるかを考慮するのが妥当、その方が、自分でコントロールできる分、遥かに建設的で積極的な対策と言えそうです。
ちなみに読み取り後、ところどころにある空白については、ワンライナーやスクリプト、プログラム内であれば、予め除去するなど処理可能なので解析する上では、さほど問題ではありません。
同時に必要な空白がある場合は、ちょっとややこしくなるケースもあるかもしれませんが。