Tesseract OCR 近況(2018/06)
スポンサーリンク
オープンソースのOCRエンジン(正確に言うとOCR用のライブラリ)、Tesseract OCRの開発状況ウォッチング、です。
しばらくメーリングリスト、GitHubのリポジトリからの通知をチェックできていなかった時期があるので見落としがあるかも。
2017年秋ごろに下書きして、途中で興味が他の方向に行ったりして放置しているうちに半年以上経っていたという。
今年の3月頃、「5月中にバージョン4.00をリリースしたい」という話が出ていた……。
3.0x系
バグフィックスリリースとしてバージョン 3.05.2 がリリース。
ビルド絡みのバグのほか、4.00系のブランチからのバックポートなど。大きなバグ修正としては以前から存在した変数のオーバーフローの県の原因が判明・修正されている。
- Training error "Couldn't find a matching blob" - Google グループ
- Fixed integer overflow error · tesseract-ocr/tesseract@bc5dfc4
バージョン 4.0系
過去記事にも書いたようにディープラーニングによるOCRエンジン搭載。ニューラルネットワークを採用した関係で、新しい文字の追加やフォントの再学習手順が様変わりした。また、各言語用のデータについてもバリエーションが多様化している(後述)。
Ubuntu 18.04 LTSでbeta.1(GitHub側のタグはbeta.2) というバージョンが採用された。GitHubのリリースページではbeta.3とbeta.2が存在している(beta.3のほうが新しい……)。
Release 4.0.0-beta.2 · tesseract-ocr/tesseract · GitHub
いまのところ旧式の認識エンジンは残っているけどいわゆるcubeエンジンは除去された*1。
リリース向けの課題などの議論は以下。
RFC: Tesseract 4.0.0 – open tasks · Issue #1423 · tesseract-ocr/tesseract · GitHub
バージョン4.0系の注意点と新しい言語別データ
ocrpy由来のLSTMベースのニューラルネットワークによる認識エンジンが採用されている。
その関係でフォントの識別機能など、一部の機能はなくなっている。特に認識対象文字を指定・除外する機能は動作しない。
認識エンジンの変更に合わせて各言語別のデータも様変わりしている。詳細はWikiを参照。
ざっくりと紹介しておくと、
tesseract-ocr/tessdata
→旧式の認識エンジン用データを含むデータ(integerized? されたtessdata_best + 3.0x 用データ)tesseract-ocr/tessdata_fast: Fast integer versions of trained models
→新しい認識エンジン専用データ(速度重視、旧式のOCRエンジン用のデータを含まず)tesseract-ocr/tessdata_best: Best (most accurate) trained LSTM models.
→新しい認識エンジン専用データ(認識精度重視、旧式のOCRエンジン用のデータを含まず)tesseract-ocr/tessdata at 3.04.00
→3.05系用のデータ(githubリポジトリのタグで切り替え)
fastとbestの違いはニューラルネットワーク(LSTM)の学習時の重みの精度(integer/float)という話だったはず。
参照:fast vs. best · Issue #1404 · tesseract-ocr/tesseract
現状、基本的にHomebrew の--HEAD
オプションとかUbuntu or Debianでパッケージとして提供されているのはtessdata_fast
の方。
メインのtessdataリポジトリ直下のデータは旧式のOCRエンジン向けのデータを含んでいる。
バージョン4.0系のtesseractコマンドの、--oem 0
という旧式のOCRエンジンを利用するモードを使えるのはtessdata
リポジトリにあるデータを使う場合のみ。
書字系(script)別データについて
各リポジトリ配下にscript
というサブディレクトリがあり、書字系別?の学習データが提供されるようになった。日本語の場合は"Japanese.traineddata"。
詳細はtessdata_fastの(README.md](https://github.com/tesseract-ocr/tessdata_fast/blob/master/README.md)の説明を参照。
"Japanese.traineddata"の場合は日本語と英語の学習用テキストを混在した状態で学習させた代物ということらしい。
"Latin.traineddata"の場合はベトナム語を除くラテン文字系言語全部、とのこと。
書字系という用語については専門ではないので勘違いしているかも。
参考:書字系
日本語に関係するのは"jpn.traineddata"と"jpn_vert.traineddata"。文字の方向の判定に"osd.traineddata"(これはいまのところ旧バージョンと同じものを使う)。
"tesseract -l jpn"のように指定すると、縦書き用のjpn_vert
も読み込まれる。横書きだけの場合はtesseract -l jpn-jpn_vert
とするか、tessdataファイルに含まれるconfigを取り出して書き換える。
Linux系ディストリビューションではtesseract-ocr-XXXと、tesseract-ocr-script-XXXXのように言語別のデータがパッケージ化されている。
なお、tesseract
コマンド、libtesseract
ともにtessdataディレクトリ直下にあるファイルしか参照しないので使用する際はリンクを貼るか、ファイルの移動が必要。
Japanese.traineddataを使う場合の注意点
[2018/07/24 追記]
出力結果に余計な空白が含まれる問題の対処方法。
jpn.traineddata
で修正されている問題が反映されていないので-c
オプションでパラメータをセットする。
$ tesseract -l Japanese -c preserve_interword_spaces=1 sample.jpg stdout
LSTMベースの認識エンジンの学習について
[2018/09/04 追記]
新しい学習用データのリポジトリが公開されています。
[追記ここまで]
以前の画像とBoxファイルではなく、テキストデータから自動的にデータを生成して行単位で学習するように変更。
まだいろいろと変更が入っているのでWikiの最新情報を参照。
以前と違って一定の認識率に到達するまで学習を繰り返すか、一定の回数学習を繰り返すかを選ぶ方式になったので終了時間が予測できない。
詳細:TrainingTesseract 4.00 · tesseract-ocr/tesseract Wiki
また、学習の仕方も3通りに増えている。
- 完全新規作成(Training From Scratch)
- fine tune : 既存のデータの改善 or 文字の追加・削除
- Training Just a Few Layers : 新しい書体を学習させたいとき
学習ツール自体が不安定だったので試していないのでなんとも言えない。ただ、メインの開発者のRay Smith氏が学習に使用している学習用テキストとフォントのリストを公開していないので公式データと同じものを作成することはできない。
なお、"osd.traineddata"と"equ.traineddata"については以前から作成方法は公開されていない(いまのところ3.0x/4.xともに共通)。
再学習させるための必要な情報がすべて提供されているかは試していないので不明。
どういうことかというと、langdataリポジトリにあるファイルが更新されていない……。
従来式の画像とboxファイルからの学習
以前は文字単位でできない訳ではない、らしい。
GitHub - OCR-D/ocrd-train: Train tesseract 4 with make
マルチスレッド
4.x はデフォルトで4スレッド。
- 関連:Performance Improvement (./configure --disable-openmp has no effect) · Issue #1317 · tesseract-ocr/tesseract · GitHub
- 参考:Issues · tesseract-ocr/tesseract · GitHub
ABI 変更状況
https://abi-laboratory.pro/tracker/timeline/tesseract/abi-laboratory.pro
ときどきGoogle groupsで話題になる。
ここ最近の新しい動きなど
セマンティックバージョンニングに移行中。
参照:Switch to semantic versioning by egorpugin · Pull Request #593 · tesseract-ocr/tesseract · GitHub
関連するリポジトリが増えている。テスト用データが公開されたり、いつのまにかDockerイメージが提供されるようになっている。また、言語別のデータファイルをダウンロードするためのPythonスクリプトも登場した。
Docker
公式Wikiにリンクがあるというだけで開発チームが提供しているわけではないっぽい。
4.0 Docker Containers · tesseract-ocr/tesseract Wiki
テストデータ
tesseract-ocr/test: Repository for tesseract testing
リポジトリが分離されて、tesseract のメインリポジトリからsubmoduleとして参照されるように。
Tesseract tessdata downloader
Githubから効率よくtessdataデータファイルをダウンロードできる。
git clone
だと全言語一括で非常によろしくなかった(--depth=1
オプションを使えばマシになるとはいえ……)。
参考:git で shallow clone - Qiita
4.0系ベータのバイナリ
まだベータ版だということに注意。
公式開発チームとしてバイナリは配布していない。
Ubuntu
Ubuntu 18.04は4.00beta.1というパッケージが採用されている。またDebianの開発版はGitHubのパッケージを追いかけているっぽい。
Ubuntu 16.04
それなりに定期更新されている。
Debian ()
experimental 扱いのパッケージがある。
macOS
基本的にHomebrew で--HEAD
オプションを付ければ4.0系のベータ(というかGItHubの最新版)。
$ brew install tesseract --HEAD
macOS環境でソースからインストールする場合は下記を参考に(特にデバッグ用ツールが必要な場合)。
Windows
一応ビルド済みのバイナリは配布されている。ソースからのインストールは鬼門。そもそも、Microsoft謹製のOCRエンジンを使う方がいいのでは?
以下はMannheim Universityの図書館*2によるWindowsバイナリ。
あとはCygwinとか。あるいはVietOCRに付属のバイナリを抜き取るという方法もある。
そのほか
日本語に関連するissue
- Characters being reused for multiple "words" in vertical Japanese text in some situations with LSTM "best" models · Issue #1117 · tesseract-ocr/tesseract
- tesseract add similar characters in Japanese text (ambiguity management?) · Issue #1063 · tesseract-ocr/tesseract
日本語固有って感じでない。
デバッグ関連
以下、コメント欄にデバッグ用のログに関する話が出ている。
- LSTM: Words dropped during recognition · Issue #681 · tesseract-ocr/tesseract · GitHub
- Tesseract segmentation fault when using Arabic and English · Issue #1275 · tesseract-ocr/tesseract · GitHub
- text2image: some punctuation in vertical text isn't being rendered correctly · Issue #1284 · tesseract-ocr/tesseract
ログファイルにオプションを書いて、tesseract
コマンドの最後の引数に指定する。
まとめ
開発者ではない1ユーザーとしてはこんなもんでしょう。書きぶりが雑ですが。
ちゃんと比較していませんがバージョン4.0系は日本語も結構良いです。特に英数混在は改善しているはず*3。
まだベータ版ですがバグ報告しないと改善されないのがOSS。明らかにあおかしな挙動、うまく認識できないケースはうまくいかない画像とセットで報告するとベターです。
英語でメール書くのはめんどうだったり、画像の著作権とかいろいろありますが……。