この記事ではオープンソースのOCRライブラリであるTesseract OCRのPythonバインディングであるtesserocrのインストールと簡単な使用例を紹介します。
Tesseract OCRのPython用ラッパーはpyocr、pytesseract、tesserocrの3つがあります。
tesserocrはCythonを用いてC++のAPI(libtesseract)を使用するため、tesseractコマンドを呼び出すpytesseractより性能面で優位です(理論上は)。
pyocrはコマンド呼び出し、APIの両方に対応するようですが試していません。
目次#
環境及び前提条件#
- Ubuntu 18.04 LTS
- Python 3.6.5
- tesserocr 2.3.0
標準パッケージとしてTesseract OCRのバージョン4.xの開発版パッケージが提供されているUbuntu 18.04上で作業しています。
tesserocrはTesseract OCRのバージョン3系でも使用可能です。
Tesseract 本体およびビルドに必要なパッケージのインストール#
Tesseract 本体のインストール。
| sudo apt install tesseract-ocr | 
build-essentialおよび各種*-devパッケージが必要。
| $ sudo apt install build-essential libleptonica-dev libtesseract-dev | 
python3-venvはtesserocrをインストールする環境を分離するため。
日本語用のデータファイル(言語データ)のインストール#
tesseract-ocrパッケージをインストールしただけでは英語用のデータおよび文字の方向および書字系検出(OSD)用のデータしかインストールされない。
| $ sudo apt install tesseract-ocr-jpn tesseract-ocr-jpn-vert | 
※ tesseract-ocr-jpn-vertは縦書き用のデータファイル。
Tesseract 4.xから追加された書字軽蔑のデータファイルを試す場合は下記のパッケージもインストールする。
| $ sudo apt install tesseract-ocr-script-jpan tesseract-ocr-script-jpan-vert | 
どちらかのデータの認識率がいいかは不明。試した範囲では五十歩百歩。
Tesseract の動作チェック#
使用可能な言語の確認#
| $ tesseract --list-langs | 
コマンドの構文は下記のとおり。
| tesseract -l lang 入力画像ファイル 出力ファイルの接頭辞 オプション | 
オプションはハイフン形式か、パラメータを記述したファイルの名称を指定。
入力・出力にそれぞれstdin、stdoutを指定すると標準入力、標準出力となる。
| tesseract -l jpn test.png stdout --psm 6 | 
認識結果の文字列が出力されればOK。
書字系別のデータファイル場合の例は以下のとおり。
| tesseract -l Japanese test.png stdout --psm 6 | 
試した範囲では余計な空白が入ってしまう。
作業ディレクトリの作成とtesserocrのインストール#
| mkdir workplace | 
| python3 -m venv venv | 
画像処理ライブラリとしてPillowをインストールする(オプション)。
| pip install pillow | 
最後に本命のtesserocrをインストールする。
| pip install tesserocr | 
“Failed building wheel for tesserocr”というエラーメッセージが表示されるが
インストール自体は成功しているので無視してよい。
bdist_wheelコマンドが見つからないという原因によるもの。
tesserocr の基本的な使い方#
対象の言語をimage_to_textメソッドのlang=オプションに指定する。
省略した場合はeng(英語)。
| #! /usr/bin/env python3 | 
| python test_ocr.py | 
かなり惜しいですね。
補足情報#
バージョン4.00.beta.3以降での注意点。
- osdetect.hというファイルが- includeディレクトリにコピーされなくなった
- API呼び出し時にロケールのチェック処理が入るようになった
まず1つ目の問題。osdetect.hというファイルが見つからないためにtesserocrのインストールが失敗します。対処法ほとしてはTesseractのソースアーカイブから対象ファイルをincludeディレクトリにコピーするだけです。
なお、修正がマージされているのでbeta.5または安定版リリースでは修正されるはずです。
次に2つ目の問題について。こちらはロケールによって発生するケースが報告されたため、その対策としてチェック処理が追加されています。
後述のようにAPI呼び出し前にロケール設定を変更することで対応できます。
ロケール変更が好ましくない場合は、現在のロケール設定を保存しておいて処理が完了してからAPI設定をもとに戻すという方法があります。
- Test for correct locale settings · tesseract-ocr/tesseract@3292484
 (https://github.com/sirfz/tesserocr/issues/137)
- Various fixes for Tesseract 4 beta.3 · ropensci/tesseract@2784542
- [Couldn’t import tesserocr, because locale check error · Issue #137 · sirfz/tesserocr]
osdetect.h問題#
インストール済みのTesseractのバージョンに対応したソースコードをリリースページから入手するか、git cloneしてソースコードを入手。
osdetect.hというファイルがincludeディレクトリにコピーされなくなっています。
| $ cd tesseract | 
コピー先は環境に応じて適宜変更のこと。
ロケールチェック対策#
具体的なエラーメッセージは以下のとおり。Pythonインタプリタが強制終了します。
| !strcmp(locale, "C"):Error:Assert failed:in file baseapi.cpp, line 203 | 
Python側でLocaleをCにセットすればOK。
| import locale | 
まとめ#
この記事の最大のポイントは、Tesseract OCRのPython用ラッパーはpytesseractだけではないというところ。
より高度な使い方、Pillow、OpenCVの連携は別記事で。
