この記事ではオープンソースの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の連携は別記事で。