Python用のOCRライブラリ、tesserocrのインストール

この記事ではオープンソースのOCRライブラリであるTesseract OCRのPythonバインディングであるtesserocrのインストールと簡単な使用例を紹介します。

Tesseract OCRのPython用ラッパーはpyocrpytesseracttesserocrの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
$ sudo apt-get install libpython3-dev python3-venv

python3-venvtesserocrをインストールする環境を分離するため。

日本語用のデータファイル(言語データ)のインストール#

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
List of available languages (6):
Japanese
eng
Japanese_vert
jpn_vert
osd
jpn

コマンドの構文は下記のとおり。

$ tesseract -l lang 入力画像ファイル 出力ファイルの接頭辞 オプション

オプションはハイフン形式か、パラメータを記述したファイルの名称を指定。
入力・出力にそれぞれstdinstdoutを指定すると標準入力、標準出力となる。

"example 1"
$ tesseract -l jpn test.png stdout --psm 6

認識結果の文字列が出力されればOK。

書字系別のデータファイル場合の例は以下のとおり。

"example 2"
$ tesseract -l Japanese test.png stdout --psm 6

試した範囲では余計な空白が入ってしまう。

作業ディレクトリの作成とtesserocrのインストール#

$ mkdir workplace
$ cd workplace
$ python3 -m venv venv
$ source venv/bin/activate

画像処理ライブラリとして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

import tesserocr

import tesserocr
from PIL import Image

image = Image.open('test.png')

print(tesserocr.image_to_text(image, lang='jpn'))

テスト用の画像ファイル

$ python test_ocr.py
これは日本語の文章です。Ltnux上のエディタで作成しています。
Ubuntu 18.64 LTS

LsTM搭載の、新しい認識エンジンのテストです。

かなり惜しいですね。

補足情報#

バージョン4.00.beta.3以降での注意点。

  • osdetect.hというファイルがincludeディレクトリにコピーされなくなった
  • API呼び出し時にロケールのチェック処理が入るようになった

まず1つ目の問題。osdetect.hというファイルが見つからないためにtesserocrのインストールが失敗します。対処法ほとしてはTesseractのソースアーカイブから対象ファイルをincludeディレクトリにコピーするだけです。

なお、修正がマージされているのでbeta.5または安定版リリースでは修正されるはずです。

次に2つ目の問題について。こちらはロケールによって発生するケースが報告されたため、その対策としてチェック処理が追加されています。
後述のようにAPI呼び出し前にロケール設定を変更することで対応できます。

ロケール変更が好ましくない場合は、現在のロケール設定を保存しておいて処理が完了してからAPI設定をもとに戻すという方法があります。

osdetect.h問題#

インストール済みのTesseractのバージョンに対応したソースコードをリリースページから入手するか、git cloneしてソースコードを入手。

osdetect.hというファイルがincludeディレクトリにコピーされなくなっています。

$ cd tesseract
$ cp /src/ccmain/osdetect.h /usr/local/include/tesseract

コピー先は環境に応じて適宜変更のこと。

ロケールチェック対策#

具体的なエラーメッセージは以下のとおり。Pythonインタプリタが強制終了します。

!strcmp(locale, "C"):Error:Assert failed:in file baseapi.cpp, line 203
Abort trap: 6

Python側でLocaleをCにセットすればOK。

import locale
locale.setlocale(locale.LC_ALL, 'C')
import tesserocr

まとめ#

この記事の最大のポイントは、Tesseract OCRのPython用ラッパーはpytesseractだけではないというところ。

より高度な使い方、Pillow、OpenCVの連携は別記事で。