orizuru

つながる.見える.わかる IoTソリュ-ション

Tesseract OCR

約 6 分
Tesseract OCR

はじめに

 Tesseract-OCRはオープンソースの文字認識エンジンである。文字認識を担うライブラリとそれを用いたコマンドラインツールが提供される。C/C++APIを用いてプログラム内に組み込むことができるが、そのほか多くの言語によるラッパーも提供される。最近リリースされた最新版(4.0)には、従来の認識エンジンに加え、LSTMベースのニューラルネットワークによる認識エンジンが搭載された。今回の記事では、この最新版の導入手順と使用方法を概説する。私の環境がMacであるので、以下の説明は全てMac環境での動作事例である。

インストール手順

 ビルド済みパッケージをHomebrewを用いてインストールする方法と、ソースからビルドする方法を示す。

Homebrew

 以下のコマンドでインストールできる。

--HEADをつけないと1つ前の3系がインストールされてしまうので注意が必要である。

Macports(ソースのコンパイル)

 Macportsでインストールできるのは3系のみなので、ソースをコンパイルする必要がある。詳細な手順はこちらに記載されている。私が行った手順は以下の通り。最初に依存ライブラリを入れる。

次に、ソースをダウンロードしコンパイルする。

OpenMPを組み込むこともできるが、Macのコンパイラ(clang)がオプション-fopenmpをサポートしておらず今回は割愛した。必要であれば別のコンパイラ(gcc)を用いれば良い。

 ここまでの作業で本体のインストールは完了した。コマンドラインに以下を打ち込んでみる。

訓練済みモデルの導入

 Homebrewによるインストールであれば必要ない作業であるが、ソースから導入した場合は訓練済みモデルをここから別途ダウンロードする必要がある。サポートされる言語は161個である。ダウンロードしたファイルは/usr/local/share/tessdata/に置く。このディレクトリはtesseractがデフォルトで見に行く場所であるので、環境により異なるだろう。

今回は英語(eng.traineddata)と日本語(jpn.traineddata)を用いる。

 ここまでの作業でtesseractを使う準備は整った。

プログラム内での実装例

 C++による実装例は以下の通り。

  • 7行目:読み込む画像へのパス
  • 11行目:OCRオブジェクトを作成
  • 14行目:OCRオブジェクトを初期化。Initの第1引数には言語ファイルが存在するディレクトリへのパスを記載する。デフォルトのディレトリに格納した場合はnullptrにする。第2引数には言語ファイルの種類を記載する。第3引数には認識エンジンの種類を書く。ここではLSTMを用いたエンジンを選択した。
  • 18行目:画像のレイアウト解析のためのオプションである。APIリファレンスを読んでも良くわからないが、このページが参考になる。
  • 21行目:画像を読み込む。
  • 24行目:OCRオブジェクトに画像を設定する。第1引数は画像データ、第2引数は画像の高さ、第3引数は画像の幅、第4引数は1画像あたりのバイト数、第5引数は画像の幅をバイト数に換算した値である。今の場合は幅に3を掛けた値になる。
  • 27行目:OCRを実行する。Getの付く関数は何かを返すだけの処理にすべきである。この関数で認識処理までさせるのはどうかと思う。また、この関数はcharのポインターを返し、メモリ管理はユーザに委ねられる仕様となっている。なのでユーザ側がメモリ解放の責任を負う。std::stringで受けても良い。
  • 31行目:初期化前の状態に戻す。
  • プログラムの実行例

     使用言語をengにし、次の画像を与える(このページから切り出した画像)。

    実行結果は以下の通り。

    全文字正解。

    次は手書き文字を試してみる。ここの画像を用いた。

    結果は以下の通り。

    ところどころ余計な文字や行があるが、ほぼ正解。

    次はこれ。ここから切り出した。

    結果は以下の通り。

    良くない。筆記体は無理なようだ。出力先頭に「Detected 7 diacritics」が出ている。diacriticとは文字の頭につく記号のこと。

     次は日本語で。使用言語をjpnに変更し、以下の画像を読み込む。このページから切り出した。

    結果は以下の通り。

    ” 「 “が” ` “として認識されている。3Dの” 3 “も間違っている。余分な行が挿入されている。

    次は青空文庫から切り出した画像。谷崎潤一郎「痴人の愛」より。

    結果は以下の通り。

    先頭に「Detected 8 diacritics」が出力されているが全文字正解である。

    次は手書き。ここから切り出した。

    結果は以下の通り。

    無理。切り出し元のページではGoodNotesなるメモアプリの紹介をしている。上の手書き文字を難なく認識している。

    まとめ

     今回は、文字認識エンジンTesseract-OCRを紹介した。その最新版にはLSTMベースのニューラルネットワークが搭載されている。使用事例としてC++APIを用いた実装を示し、いくつかのサンプル画像について認識結果を見た。くずれた手書き文字(例えば筆記体など)を除けば、そこそこの精度で認識できている。
     今回は紹介していないが、他言語(例えばPython)による実装も可能である。また、訓練のためのライブラリも提供されている。詳細は本家のサイトを見て欲しい。

    参照文献

    本家以外で参照したページはここである。

    About The Author

    IoT/AIソリューション事業部(深層/機械学習・画像処理エンジニア)KumadaSeiya
    深層/機械学習と画像処理などを担当。物性理論で博士号を取得。
    http://seiya-kumada.blogspot.jp/
    https://twitter.com/seiya_kumada

    Leave A Reply

    *
    *
    * (公開されません)