Tesseract OCRのPythonバインディング、pyocr
のセットアップと使い方を紹介します。
pyocr
は現在もメンテナンスされているTesseractのPython用ライブラリ(バインディング)としては最古参です(2012年リリース)。
目次#
PyOCRについて#
pyocr
はTesseractとCuneiform(ロシア製のOCRエンジンでヨーロッパ系の言語をサポート)の2つに対応しています。
OpenPaper.workというプロジェクトの一部でライセンスはGPL v3。
プロジェクトのページ:OpenPaper.work - Open-source
公式リポジトリ:World / OpenPaperwork / pyocr · GitLab
Tesseractに関してはC言語用のAPIを使う方式とtesseract
コマンドを呼び出す方式の2つの方式に対応している点が特徴です。
なお、この記事ではCuneiformについては日本語に対応していない関係で対象外とします。
tesseract
コマンドの呼び出しにはPythonのsubprocessモジュールが使用されます。
コマンド呼び出し(tesseract
)とC言語用API(libtesseract
)機能の比較は以下のようになります。
実行方式 | 文字の認識 | 数字限定 | 文字方向検出 | PDF出力 |
---|---|---|---|---|
コマンド呼び出し(tesseract ) |
Yes | Yes (ver. 3.0x) | Yes (only ver. 3.0x) | No |
C言語用API(libtesseract ) |
Yes | Yes (ver. 3.0x) | Yes | Yes |
認識対象を数字に限定するオプションが用意されていますがTesseract 4.0系では通常の認識モードと同じ結果になります(理由は後述)。
pyocr
の欠点としてはTesseract 4.0系と組み合わせる際に、OCRエンジンのモードを切り替えることができません(--oem
オプションに対応していない)。
またコマンド呼び出し方式で使用する場合は画像データの一時ファイルへの書き出しと、結果をテキストファイルから読み込む処理が入る分、処理に余分に時間がかかります。
コマンド呼び出し方式での実行時は、tesseract
コマンドをpsm
オプションとconfig
ファイルとしてmakebox
を指定して実行する形式になります。
環境とインストール#
この記事ではUbuntu 18.04LTSおよび標準パッケージのTesseract OCR 4.00beta.1を対象としています。
- Ubuntu 18.04 LTS
- Tesseract OCR 4.00beta.1
- Python 3.6.5
- pyocr 0.5.2
- Pillow 5.2.0
Tesseract本体はapt
コマンドでインストールしてあるものとします。
pip3 install pyocr |
依存ライブラリとして画像処理ライブラリのPillowが必要です。下記のコマンドでインストールします。
pip3 install Pillow |
使い方#
テスト画像は以下を使用します。
なお、tesseract
コマンドの詳細はで解説しているのでそちらも参照して下さい。
利用可能なOCR tool の確認#
pyocr
では利用可能なOCRエンジンをtoolという名前で抽象化しています。
利用可能なツールのリストをget_available_tools()
で取得できます。
import pyocr |
出力は以下のようになります。
Tesseract (sh) |
利用可能な言語の確認#
import pyocr |
出力結果の例を示します。
['Japanese', 'eng', 'Japanese_vert', 'Latin', 'jpn_vert', 'osd', 'jpn'] |
OCR処理の実行#
文字認識処理の実行にはimage_to_string()
メソッドを使用します。
引数の入力画像はPILのImage、lang
に言語を指定します。出力形式の制御はbuilder
オプションで制御できます。
lang
を省略した場合のデフォルトはtool依存(ほとんどのケースでeng
)。
また、builder
に指定可能なオプションは以下のとおり(省略した場合はTextBuilder
。
- TextBuilder : テキスト全体
- WordBoxBuilder : 単語単位(画像内の位置座標付き)
- LineBoxBuilder : 行単位(画像内の位置座標付き)
- DigitBuilder : 数字のみ
- DigitLineBoxBuilder :
DigitBuilderおよびDigitLineBoxBuilderは認識対象の文字の種類を数字に限定してTesseractを動作させるオプション。ただし、Tesseract 4.0系の新しい認識エンジンでは機能しない。
from PIL import Image |
認識結果は以下のようになります。
The quick brown fox jumped over the lazy dogs. |
詳細#
Builderのオプション#
pyocr
ではTesseractのオプションはbuilder
オブジェクトでコントロールするようです。
例えば、ページセグメンテーションモードはbuilder
オブジェクトのtesseract_layout
オプションで設定します。
txt = tool.image_to_string( |
tesseract_layout
のデフォルト値は3です。
BoxBuilder#
BoxBuilder
という名前のついたbuilder
をimage_to_string()
メソッドのオプションに指定すると、LineBox
オブジェクトのリストを返します。このオブジェクトはcontents
とpostion
というattributeを持ちます。
ループ処理することで認識結果と座標(左下原点系)を得ることができます。
|
出力例を以下にに示します。
word: The, pos: ((41, 50), (66, 63)) |
方向検出#
Tesseract 4.0系で方向検出機能を使用する場合、tesseract
コマンドの出力が変化している。そのため、pyocr
との組み合わせではlibtesseract
を使う必要がある。
from PIL import Image |
出力例は以下のように、角度と確からしさが出力されます。
{'angle': 0, 'confidence': 2.7592315673828125} |
PDF生成#
libtesseract
を使用する場合、TesseractのPDF生成機能を利用できます。
from PIL import Image |
エラーメッセージが表示されますが、PDFの生成は成功します。
Error in fopenReadStream: file not found |
上記の例の場合、pdf_test.pdf
という名前でPDFファイルが作成されます。
その他#
hOCR出力#
BoxBuilder系の出力オプションを指定した場合、builder.write_file()
メソッドを使うことによりxml(hOCR)形式でファイルに書き出すことができます。
詳細は公式ドキュメントを参照。
World / OpenPaperwork / pyocr · GitLab
macOS環境での注意#
pyocr
は*nix環境ではlibtesseract
の共有ライブラリの拡張子が.so
であることを期待しています。macOS環境では拡張子が違うのでlibtesseract
を検出しません。
対処方法としてはソースをいじるか、libtesseract.dylib
に対してlibtesseract.so.3
またはlibtesseract.so.4
というシンボリックリンクを作成する必要があります。
サーバーサイドで使うケースがほとんどだろうと思いますが念の為。