Pythonで書くTesseract 4の基本的な使い方。APIとCLIからOCRを実行する方法
こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。
今回はオープンソースのOCRエンジンTesseract 4の使い方を解説します。TesseractのPythonラッパーtesserocrを使い、Pythonでコードを書いていきます。
Tesseract 4から深層学習を取り入れているので、OCRの認識精度も大幅アップ!本記事を読んでぜひ一度お試しください。
目次
実行環境
実行環境は下記のとおりです。本記事ではUbuntuを使っていますが、Tesseractはマルチプラットフォームに対応しているので、WindowsやMacでも使えます。
- Ubuntu 18.04 LTS
- Python 3.7.2
- Tesseract 4.0.0
- tesserocr 2.4.1
事前準備
まずは下記のコマンドでTesseractパッケージをインストールします。最初にapt updateで最新のパッケージ情報を取得しておくのがオススメです。
sudo apt update sudo apt install tesseract-ocr libtesseract-dev libleptonica-dev pkg-config
インストールできたら下記コマンドで確かめましょう。バージョンが表示されたらOKです。
tesseract -v
C++であればこのままでも使えますが、本記事ではPythonから使うのでラッパーのtesserocrをpipからインストールします。
pip install tesserocr
続いて日本語読み取りに対応させるため、日本語の学習済みデータをダウンロードし、所定のフォルダに配置します。デフォルトは英語のみですが、100以上の言語に対応しています。
学習済みデータは、速さを重視したtessdata_fastと精度を重視したtessdata_bestの2種類あります。今回はtessdata_fastを使います。tessdata_bestを使いたい方はこちらからダウンロードできます。
tessdata_fastから日本語の学習済みデータをダウンロードするには下記コマンドを実行します。言語データの配置先はOSによって異なりますが、Ubuntuの場合は/usr/share/tesseract-ocr/4.00/tessdata/になります。下記コマンドを実行する際は、適宜配置先を置き換えてください。
curl -L -o /usr/share/tesseract-ocr/4.00/tessdata/jpn.traineddata https://github.com/tesseract-ocr/tessdata/raw/master/jpn.traineddata
Tesseract APIの使い方
事前準備が終わったら早速OCRを実装していきましょう。サンプルとして夏目漱石の「吾輩は猫である」の冒頭文を使います。
PythonラッパーのtesserocrはTesseractのAPIをそのまま使えます。基本的な使い方は最初にPyTessBaseAPIのインスタンスを作ります。そして読み取る画像を指定し、文字列を出力します。
from tesserocr import PyTessBaseAPI, PSM api = PyTessBaseAPI(psm=PSM.AUTO, lang='jpn') api.SetImageFile('sample.png') print(api.GetUTF8Text())
間違えている箇所は赤字で示した実行結果は下記のようになります。448文字中、間違っている文字は18文字、つまり認識できている文字数と総文字数の割合で精度を算出すると約96%になります。
Tesseractオプション: ページセグメンテーションモード(PSM)
TesseractにはPSM(Page Segmentation Mode)というレイアウト解析のオプションがあり、13のモードが用意されています。デフォルトは3番ですが、複数行の文章であれば6番を指定することで精度の向上を見込めます。また、一行の文章や一文字専用のオプションもあるので、状況に応じてモードを変えましょう。
- 0 テキストの傾斜角度や言語の種類を検知(OSD)して出力
- 1 OSDありでOCR(回転した画像にも対応してOCR可)
- 2 OSDなしでテキストの傾斜角度情報を標準出力(OCRなし)
- 3 OSDなしでOCR(デフォルトの設定はこれ)
- 4 単一列にさまざまなテキストサイズが入り混じったものと想定してOCR
- 5 縦書きのまとまった文章と想定してOCR
- 6 横書きのまとまった文章と想定してOCR
- 7 一行の文章と想定してOCR
- 8 一単語と想定してOCR
- 9 円の中に一単語がある想定でOCR(①、➁など)
- 10 一文字と想定してOCR
- 11 順序を気にせずできるだけ画像内に含まれる文章をOCRで取得
- 12 OSDありでできるだけ画像内に含まれる文章をOCRで取得
- 13 Tesseract固有の処理を飛ばして一行の文章としてOCR処理
Tesseractオプション: OCRエンジンモード(OEM)
TesseractにはOCRエンジンを変更できるオプションも用意されています。
- 0 Legacyエンジンのみ
- 1 ニューラルネットワークを取り入れた最新エンジンのみ
- 2 Legacyエンジンとニューラルネットワークエンジンの両方を使用
- 3 状況に応じて利用可能なエンジンを利用(デフォルトはこれ)
tesserocrのヘルパー関数
tesserocrはTesseractがより使いやすくなる以下のヘルパー関数を用意しています。
import tesserocr from PIL import Image # Tesseractのバージョンを出力 print(tesserocr.tesseract_version()) # tessdataへのパスと利用可能な言語を出力 print(tesserocr.get_languages()) image = Image.open('sample.png') # PillowのImageオブジェクトからテキスト出力 print(tesserocr.image_to_text(image, lang='jpn')) # ファイルパスから文字列出力 print(tesserocr.file_to_text('sample.png', lang='jpn'))
コマンドライン上での実行
コードを書かなくともコマンドラインから画像を指定することでOCRを実行できます。コマンドラインでは、読み込み元の画像と出力先ファイル名、-lオプションで言語を指定します。PSMやOEMを変更するときはそれぞれ–psm, –oemに続けて番号を指定します。
tesseract sample.png text -l jpn --psm 6
まとめ
Tesseractの基本的な使い方を解説しました。深層学習を取り入れたTesseract 4は高い精度が魅力です。学習機能も備わっているため、用意されている言語データで対応できなければ独自の学習データも作れます。
従量課金ですがGoogle Cloud Vision APIのOCRもかなり精度が高いです。一定数の無料枠もあるので、興味がある方は下記の記事をご覧ください。
Google Cloud Vision APIのOCRを使ってPythonから文字認識する方法