Tesseract-OCR-iOSと言語データ(jpn.traineddata)
スポンサーリンク
[2015/08/25 20:37] タイトルを修正しました。
懲りずにtesseractネタです。まだまだ続きます。
今回はiOSアプリでtesseract-ocr を使うためのラッパーライブラリ、Tesseract-OCR-iOSについて。
導入(for Swift)
GitHubにあるテンプレートプロジェクトを使うのも一つの方法ですが、CocoaPodsを利用して導入します。
もう8月下旬ですが、Xcode 6.3、Tesseract-OCR-iOSは4.0*1を前提にしてます。
事前準備として対象言語の言語データをダウンロードしておく必要があります(後述)。
- Xcodeで新規プロジェクト作成
- Xcodeを終了する
- ターミナルで作成したプロジェクトの存在するディレクトリへ
- Podfileを作成する(下記参照)
- ターミナルで
pod install
を実行 - ”プロジェクト名".xcworkspace が作成されるので、Xcodeで開く
- 言語データ(language data)を"tessdata"フォルダごとXcodeのファイルナビゲータへドラッグ(Create Folder Reference)
Podfile はこんな感じで。use_frameworks!
と入れておけばBridgingHeaderは不要です。
platform :ios, '8.0' use_frameworks! pod 'TesseractOCRiOS', '~> 4.0.0'
参考:Installation · gali8/Tesseract-OCR-iOS Wiki · GitHub
注意点
- Xcode を確実に終了しておくこと
- tessdata フォルダはsymbolic group ではなく、 Referenced Folderである必要がある
上記リンク先のようにフォルダのアイコンが青色になっていればOK。
var tesseract:G8Tesseract = G8Tesseract(language:"eng+ita");
という箇所を、
var tesseract:G8Tesseract = G8Tesseract(language:"jpn");
にすれば日本語のOCRができるはず。
文字の方向を自動判別させたいなら、
tesseract.pageSegmentationMode = G8PageSegmentationMode.AutoOSD
のようにpageSegmentationMode
を設定します。tesseract-ocr-3.01.osd.tar.gz
縦書き文書の読み取りを行わない場合は、以下のようにすれば段組の有無を含めてよきに計らってくれるようです。
tesseract.pageSegmentationMode = G8PageSegmentationMode.Auto
縦書き文書(段組なし)であれば、
tesseract.pageSegmentationMode = G8PageSegmentationMode.SingleBlockVertText
あとはXcodeの入力補完機能で確認してください。
言語データについて
現在のTesseract-OCR-iOS v4.0は本家tesseract-ocrの3.03がベースです(本家の最新バージョンは3.04.1)。本来ならバージョン3.03用に作成された言語別のデータを利用するのが望ましいですが、3.03用のデータはリリースされていないようなので、3.02用のデータを流用するか、3.04用のデータを修正して使用します。3.04用のデータを修正して使う方が日本語に関しては認識率は向上します。
なお、設定パラメータが増えている関係で、3.04向けのデータをそのまま使うとエラーで落ちます。
ver. 3.02 用のデータを使う
[2016/08/01 追記]
Google Codeのサービス終了及び移行期間の終了により、下記のリンク先からは入手できなくなっています。tesseract-ocr alternative downloadから該当ファイルを入手するか、後述の手順でGitHubで配布されているデータを改造してください。
最低でもtesseract-ocr-3.02.eng.tar.gzという英語用のファイルが必要です。文字の方向を判別させたいなら tesseract-ocr-3.01.osd.tar.gzも追加で。
tesseract-ocr alternativeの方だと以下のファイルです。
Google Codeのサービス終了に関してはリンク先を参照。
ver. 3.04用のデータを使う(GitHubで配布されているファイル)
ケースバイケースかと思いますが、より日本語の認識精度を向上させたいのであれば、GitHub にあるtesseract-ocr 3.04用の言語データを一部改変するのが有効です。単語辞書の強化とparams-modelなるファイルが追加されているためか、スキャナで読み込んだ画像で試した範囲では改善しています。
tesseract-ocr/tessdata · GitHub
必要なのはjpn.traineddata のみです。GitHub で配布されているjpn.traineddataとそのまま使用すると下記のエラーでアプリが一発で落ちます。
read_params_file: parameter not found: allow_blob_division
設定項目が追加されていることが原因です。なので、jpn.traineddataファイルから一旦、jpn.configというファイルを抜き取り、修正して差し替えます。
この場合、tesseract-ocr 付属のcombine_tessdata
が必要です。
カレントディレクトリの、tessdata配下にjpn.traineddataファイルが存在するものとします。環境に合わせてパスを修正してください。
$ combine_tessdata -e tessdata/jpn.traineddata jpn.config
エディタでjpn.config を開き、46行目をコメントアウトします。
# allow_blob_division F
修正した設定ファイルで元のファイルを置き換えます。
$ combine_tessdata -o tessdata/jpn.traineddata jpn.config
これで上記のエラーは回避できるはず。
日本語に関しては、概ね3.04用の言語データの方が認識率が良いですが、jpn.unicharambigsというファイルに若干問題があります。少なくともアルファベットの"l"や数字の"1"を長音(ー)に変換してしまうようなので、サクッと修正します(過去のエントリにも書いていますが)。
まずはファイルを抜き取ります。
$ combine_tessdata -e tessdata/jpn.traineddata jpn.unicharambigs
20-26行目を修正。右端の"1"を”2”に修正するだけ。他にもきになるところがあれば修正。タブ区切りのフォーマットで、第1列と第3列はそれぞれ置換前、置換後の文字数です。第2列が置換前、第4列が置換後の文字に対応します。第5列の数字が"1"なら必ず置換し、"2"ならば単語辞書に存在するかをチェックして判断、です。第5列の値は"3"も同じような意味だと思いますが、違いは分かりません*2。
jpn.unicharambigs 20-26行目
1 l 1 ー 2 1 | 1 ー 2 1 I 1 ー 2 1 1 1 ー 2 1 | 1 ー 2 1 O 1 。 2 1 ° 1 。 2
修正前のオリジナルファイル:langdata/jpn.unicharambigs at master · tesseract-ocr/langdata · GitHub
[2015/08/27 追記]
jpn.unicharambigsの52行目も修正が必要です。アルファベットの小文字の"o"が句点に変換されていまいます。例えば"google"という文字列が、"g。。gle" に変換されてしまいます。これは良くないので、第5列の値を"1" から"2"に変更します。
jpn.unicharambigs 52行目
1 o 1 。 2
追記ここまで
書き戻します。
$ combine_tessdata -o tessdata/jpn.traineddata jpn.unicharambigs
jpn.traineddata のソース一式はtesseract-ocr/langdata · GitHubにあります。
下記のエントリに理解できた範囲で書いてます。
今日はここまで。