オープンソースのOCRエンジン、Tesseract OCR付属のtesseract
コマンドについて解説します。
目次#
Tesseract OCRとは#
オープンソースの文字認識(OCR)エンジンです。基本的に文字認識機能を提供するライブラリであって一般の方が想像するようなOCRソフトウェアではありません。
基本的にユーザー側でプログラムを作成して使うことを想定していますが、コマンドラインのツールとしてtesseract
コマンドが提供されています。
前提条件#
最新の安定版はバージョン3.05.02ですが、このバージョンは日本語の認識率に問題があることで知られています。そのため、この記事ではバージョン4.0系のベータ版を対象とします。
- Ubuntu 18.04.1
- Tesseract OCR 4.0.beta.1
インストール#
Ubuntu 18.04 LTSを対象にします。コンパイル済みのパッケージが提供されているのでこれを利用します。Tesseract本体と別に認識させたい言語ごとにtraineddata
という拡張子のデータファイルが必要です。
sudo apt install tesseract-ocr |
標準では英語用の言語別の辞書データしかインストールされません。例えば日本語の場合は以下のように追加でインストールします。
tesseract-ocr-jpn tesseract-ocr-jpn-vert |
tesseract-ocr-jpn-vert
は縦書き用のデータです。
データファイルについて#
バージョンごとに対応したファイルを使用する必要があります。
Ubunt 18.04では/usr/share/tesseract-ocr/4.00/tessdata/
に配置されています。
バージョン4.0向けのデータとしては下記の3種類のリポジトリがあります。
- tessdata: tesseract-ocr/tessdata
- tessdata_fast: tesseract-ocr/tessdata_fast: Fast integer versions of trained models
- tessdata_best: tesseract-ocr/tessdata_best: Best (most accurate) trained LSTM models.
データファイルの詳細については公式リポジトリのWikiサイトにあるData Filesというページを参照して下さい。
Ubuntu 18.04のパッケージに含まれているのはtessdata_fast
リポジトリにあるファイルです。
必要に応じてGitHubのリポジトリから入手します。git clone
する際は--depth 1
をセットすることでダウンロードする容量を削減できます。
バージョン4.0系から書字系(script)別のデータファイルも提供されるようになっていますがこの記事では詳細は割愛します。
また、データファイルの入手にはダウンロード用のPythonスクリプトを使用するともできます。
GitHub - zdenop/tessdata_downloader: Tesseract tessdata downloader from GitHub repositories
Data Files · tesseract-ocr/tesseract Wiki · GitHub
データファイルの格納先の変更#
環境変数TESSDATA_PREFIX
、または--tessdata-dir
で指定することも可能です。
注意:バージョン3系ではtessdata
ディレクトリの親ディレクトリ。一方、バージョン4系では*.traineddata
ファイルのあるディレクトリを指定。
データファイルの格納先ディレクトリには設定ファイルも保存されています。
ls
コマンドでデフォルトの格納先ディレクトリを表示してみます。
$ ls /usr/share/tesseract-ocr/4.00/tessdata/ |
優先順位は--tessdata-dir
オプション、環境変数TESSDATA_PREFIX
、デフォルトのディレクトリの順です。
オプションが指定されるか、環境変数が設定されている場合はデフォルトのディレクトリは参照されません。
基本的な使い方#
入力画像の形式はLeptonicaという画像処理ライブラリが対応している画像形式(JPEG, png, tiff, webp, jepg2000, bmp, pnm, gif)。
$ tesseract image outputbase [-l lang] [--psm pagesegmode] [--oem ocr engine mode] [configfile...] |
image
: 画像ファイル(もしくはstdin
を指定すると標準入力)outpubtbase
: 拡張子を除いた出力ファイル名(またはstdout
を指定すると標準出力)-l lang
: 各言語のデータファイルの拡張子を除いた部分(例:eng
)--psm
: ページセグメンテーションモードを指定する整数--oem
: OCRエンジンのモード(0, 1, 2, 3、デフォルトは3)configfile
: コントロールパラメーターを記載したファイル
-l
オプションを省略した場合はeng
が使用されます。
tesseract sample.jpg output -l jpn |
上記の例では、sample.jpg
ファイルの読み込み、output.txt
に認識結果を出力します。
また、マルチページのTIFFファイルを扱うこともできます。
※ pnm形式はpbm、pgm、ppmの三種類の総称。
出力形式#
デフォルトのテキスト形式の他、HTMLをベースにしたhOCR
、タブ区切りテキスト、PDFで出力可能です。
tesseract
コマンドの末尾に各出力形式のconfigファイルの名称を指定します。
configファイルはデータファイルと同じ場所を参照します。
実行時のカレントディレクトリに配置したconfig
ファイルを指定することも可能です。
テキスト形式#
tesseract sample.jpg output -l jpn txt |
hOCR (HTML)#
tesseract sample.jpg output -l jpn hocr |
TSV(タブ区切りテキスト)#
tesseract sample.jpg output -l jpn tsv |
出力はoutput.tsv
。英単語は単語単位、日本語の文字はN-gram区切りになります。
取得できる情報は以下のとおり。
level, page_num, block_num, par_num, line_num, word_num, left, top, width, height, conf, text |
PDF形式#
tesseract sample.jpg output -l jpn pdf |
画像の上に透明なテキストが追加された形式になります。画像は圧縮されてPDFに埋め込まれます。
画像なしの、透明なテキストのみのPDFを作ることもできます。
画像の圧縮率を調整したい場合に有用です。
tesseract sample.jpg output -l jpn -c textonly_pdf=1 pdf |
透明なテキストのみのPDFが生成されます。
一手間かかりますが、qpdf
コマンドなどを使用して画像を埋め込むことで背景画像の画質をコントロールできます。
オプションの詳細と高度な使い方#
パラメーターによる挙動の制御#
コントロールパラメーターを-c
オプションまたは設定ファイルに記載することで挙動を変更できます。
設定可能なパラメーターおよびデフォルト値を下記のコマンドで表示できます。
tesseract --print-parameters |
下記のWikiも参照して下さい。
ControlParams · tesseract-ocr/tesseract Wiki · GitHub
存在しないパラメーターをセットしようとした場合、下記のようなメッセージが表示されます。処理は続行される点に注意が必要です。
Could not set option: include_page_breaks=1 |
コロンの右側は指定しようとしたパラメーターによって変化します。
複数言語モード#
+
で区切ることで-l
オプションに複数の言語名を指定できます。
$ tesseract test.png stdout -l eng+jpn --psm 1 |
指定する順序で認識結果に影響を与える場合があります。
tesseract test.png stdout -l jpn+eng |
日本語主体で英単語を含む場合はjpn+eng
の方がベターです。eng
を優先すると分かち書きされてしまう点に注意して下さい。
複数ファイルの一括処理#
前述のとおり、画像ファイルのリストを記述したファイルを引数に与えることで一括処理が可能です。出力ファイルは単一のファイルで、ファイルごとの認識結果の区切りに改ページ文字(^L
)が挿入されます。
この挙動を変更するには-c page_separator=
オプションを使用します。
ページ区切りに何も挿入しない場合の例を示します。
tesseract -c page_separator='' image_list.txt output |
なお、従来のinclude_page_breaks
というパラメータは廃止されています。
有効な言語の一覧(データファイルのリスト)#
--list-langs
オプションを指定すると現在使用可能な言語の一覧を表示します。
$ tesseract --list-langs |
エンジンモードの切り替え#
従来の認識エンジン(Legacy engine)に加え、LSTMベースのニューラルネットワークによる認識エンジン(LSTM engine)が採用されています。
ただし、従来の認識エンジンを使用するには古い形式の各言語別のデータを含んだデータファイルが必要になります。つまり、tessdata
リポジトリのデータファイルを用意する必要があります。
従来の認識エンジンを使用する場合は--oem 0
、新しい認識エンジンは--oem 1
です。両方を組み合わせる場合は--oem 2
。
指定しない場合はデータファイルに合わせて利用可能なエンジンが使用されます(--oem 3
、実際は新しい認識が優先)。
以下、ヘルプメッセージからの抜粋。
- 0 Legacy エンジンのみ
- 1 Neural nets LSTM エンジンのみ
- 2 Legacy + LSTM の両方を使用
- 3 Default, 利用可能なエンジンを使用
ページセグメンテーションモード (PSM)#
画像のレイアウト解析のためのオプションです。
ページセグメンテーションモード(PSM)を整数で指定することによりレイアウト解析処理の挙動をコントロールできます。
バージョン3.05以降では--psm
のようにハイフンが2つ必要です。
--psm
オプションは以下のように指定します。
$ tesseract sample.png stdout -l jpn --psm 6 |
指定可能なオプションのリストです。
- 0 文字方向および書字系の検出 (Orientation and script detection: OSD) のみ
- 1 自動ページセグメンテーション(OSDありでOCR).
- 2 自動ページセグメンテーション(OSDなし)
- 3 完全自動ページセグメンテーション(OSDなし) (Default)
- 4 単一カラムの様々なサイズのテキストとみなす
- 5 垂直方向に整列した単一カラムの均一ブロックテキストとみなす
- 6 単一カラムの均一ブロックテキストとみなす
- 7 画像を単一行のテキストとして扱う
- 8 画像を単語1つのみ含まれるものとして扱う
- 9 画像を円で囲まれた単語1つのみを含むものとして扱う
- 10 画像を1文字のだけが含まれるものとして扱う
- 11 Sparse text: 不特定の順序でできるだけ多くのテキストを探す
- 12 Sparse text: OSDあり
- 13 Raw line: 内部の処理をバイパスしつつ画像内にテキストが1行だけあるものとして扱う
--psm 0
および--psm 2
ではOCR処理は実行されません。
認識対象の画像によりますが、--psm 6
や--psm 4
を指定することで認識結果が改善する場合があります。
特に画像内に含まれるテキストが1行のみの場合、--psm 7
が有効です。
方向と言語の判定#
OSDモードの使用例です。文字の方向やページの回転、書字系(書字体系や用字系とも)の情報を表示します。
$ tesseract test.png stdout -l osd --psm 0 |
osd.traineddata
というデータファイルが必要です。また、Tesseract 4.0系ではOSD処理は旧式のエンジンで処理されています。
情報表示系のオプション#
以下、バージョン情報などの表示オプションを紹介します。
バージョンの表示#
$ tesseract --version |
省略形は-v
です。
モード別詳細#
OCRエンジンモードの一覧表示。
$ tesseract --help-oem |
ページセグメンテーションモードの一覧表示。
$ tesseract --help-psm |
ヘルプ表示#
下記のコマンドでヘルプメッセージを表示します。
tesseract --help |
より詳細なヘルプメッセージの表示。
tesseract --help-extra |
その他#
警告メッセージについて#
tesseract
コマンドの実行時に、下記のメッセージが表示されますが、これは内部で使用している画像処理ライブラリ(Leptonica)の警告メッセージで無視して問題ないです。
Warning. Invalid resolution 0 dpi. Using 70 instead. |