※ これは 2018/4/8,16 に個人ブログへ投稿した内容をまとめて転記したものです。
Google が出資しているという文字認識 API の iOS 用ラッパー、 Tesseract OCR iOS を使って文字認識をさせてみた備忘録です。
環境: macOS HighSierra, MacBook Pro 2016, XCode9.3
準備
本体のリポジトリはここ。ただし、 CocoaPods から読ませるので、直接 Clone しない。
CocoaPods が入ってない場合は、まず CocoaPods をインストール。
終わったら下記の記事を参考にインストールしていく。
Xcode 7.0 + Swift2 でTesseract-OCR-iOSを使う(追記あり) - 今日も微速転進
動かしてみる
テストコードは公式 Wiki の方を使用した。シミュレータで動かす分にはこちらのほうがシンプルで良い。
上の記事でも言っているとおり、 BridgingHeader はいらないので惑わされないように1
Tesseract OCR iOS の中身は Tesseract3.03 らしく、最新2の学習データ (tessdata) は使えない。
英語版 (eng.tessdata) は 3.04 そのままでも動くが、日本語版 (jpn.tessdata) は 3.04 を使うとエラーが出る。
read_params_file: parameter not found: allow_blob_division
これを解決するために、下記に従って学習データ内のパラメータを変更するのだが、このときビルドに使うソースは3.04を使うこと。
4.00 だと加工後の tessdata を読み込んでくれない。
それから、 ./configure
にパラメータをつけると私の環境では失敗してしまったので、パラメータをなくしたら上手くいった。
これはこの記事を読みながら事前に
brew link icu4c --force
しておいたからかも。
./autogen.sh
./configure
make
sudo make install
make training
sudo make training-install
なお、一度 4.00 をインストールしてしまったときは、 make したディレクトリで
sudo make uninstall
sudo make training-uninstall
したらアンインストールできた…気がする。
日本語を認識させてみる
日本語を認識させて結果の情報を取得してみました。
ソース
Swift 初心者なので、 API リファレンスを見ながら、 Xcode に言われるがまま書いたソースはこちら。
結果
あえてちょっと斜めにしてみましたが、いい感じに認識していますね!
技術的なメモ
認識結果とその表示
let box = block.boundingBox(atImageOf: actualImageRect.size)
Tesseract では元画像のサイズを 1×1 としたときの相対位置で対象 (文字) の座標を認識しているようです。
なので、デバイスの画面に収まるように画像を自動レイアウトした場合は、レイアウト後のサイズを取得し、それを atImageOf
に指定して変換してもらう必要があります。
レイアウト後の画像の実サイズを取得する Extension、UIImageView.ContentClippingRect
は下記より。
How to find an aspect fit image’s size inside an image view
Extensionって最高ですね…!
文字のまとまり
let blocks = tesseract.recognizedBlocks(by: G8PageIteratorLevel.symbol)
G8PageIteratorLevel
で認識結果のまとまりの大きさを指定できます。
意味深な定数名が付いていますが、もちろん日本語の形態素解析をして云々なんてしていないので、一通り試してみました。
block: ブロック。段落を複数認識したら、そのまとまりということかな?
word: 語。やはり英語前提でスペース区切りで認識されていそう。