数値認識 with python-tesseract

PIL(Python Image Library)の導入の続き



さて、前回のエントリで画像を読み込んだり、簡単な加工をすることは出来るようになりました!
今回は、私が目的とする画像から数値(と簡単な演算子)を抽出する方法についてです〜。


ターゲット画像はこちら。
このJPEG画像から、数値を認識します〜。



で、認識に使うのはこちら!
tesseractってのはGoogleで開発されてるC#製の文字認識エンジンだそうです。
それをpythonから使えるようにするラッパークラスがpython-tesseract。


python-tesseract


様々な環境用に導入方法が記入されてますが、
私はmac osx+brewでやりたいので、以下を参照。
osx10.8用らしいですが、私の10.7環境でも大丈夫でした。
(10.7用のwikiはmacport使う方法だったので。。。)


How to compile python-tesseract (for Mac Mountain Lion )


設定方法に従って、以下を実施。
swigってのはC/C++で書かれたプログラムやライブラリを
Pythonをはじめ各種言語に接続するためのツールだそうです。
leptonicaは画像処理、画像解析操作用のライブラリとのこと。
tesseractはさっき書いた通りですね。
opencvsubversionは・・・書くまでもないですよね。笑。
axelは全然よく分かりませんが、C#風のイベントハンドリングをするためのライブラリだそうな。
あまりこの辺は深く追わずに導入していきます。

# brew install wget axel swig leptonica tesseract opencv subversion


そしていきなりここで引っかかりました> <;
subversionのmakeがいつまでたっても終わらない・・・。


調べたところ、似たような状況が起きてるようですね。
とりあえず強制終了して、再実施したら今度は成功しました。
リンク先では再実施した後もちょっと問題あったみたいですが、
もともとsubversionを導入していなかった私の環境では問題ありませんでした。


brew install svnが終わらない


で、次のステップ。ここもガイド通りにやります。
とりあえずtesseractは導入出来たので、コマンドでテストしてみます。
sudoは多分普通はいらないです。
numbers.jpgはさっきのJPGファイルね。

# sudo tesseract numbers.jpg numbers
# vi numbers.txt
Password:
Tesseract Open Source OCR Engine v3.01 with Leptonica
# cat numbers.txt
@1234
56789
01234
56789


うまく行ってますね!
あとはこれをPythonから呼び出せるようにするだけです。
ここもマニュアル通りに・・・。

# wget http://python-tesseract.googlecode.com/files/python-tesseract.0.7.4.homebrew.macosx-10.8-x86_64.tar.gz
# sudo tar zxvf python-tesseract.0.7.4.homebrew.macosx-10.8-x86_64.tar.gz -C /


以下のサンプルコードをそのまま使います。
スクリプト名はpython-tesseract-test.pyで。

import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)

mImgFile = "test.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result


そして実行!

# python python-tesseract-test.py
Traceback (most recent call last):
File "python-tesseract-test.py", line 1, in
import tesseract
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tesseract.py", line 26, in
_tesseract = swig_import_helper()
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tesseract.py", line 22, in swig_import_helper
_mod = imp.load_module('_tesseract', fp, pathname, description)
ImportError: dlopen(/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/_tesseract.so, 2): Library not loaded: /usr/local/lib/liblept.2.dylib
Referenced from: /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/_tesseract.so
Reason: image not found


そして私は、こっから超絶悪戦苦闘しました。
liblept.2.dylibがロード出来ないって言われてる・・・。
探してみると、leptonicaの導入でliblept.3.dylibは入ってるみたいなんですが、
liblept.2.dylibはそもそもない。。。


このメッセージに騙されてたんですが、ふとsudoで実行したら、
単純にpython-tesseract-test.pyの1行目のtesseractなんて知らないよと言われてるだけっぽい。
ええええええ。だったら話は全然単純じゃないですか・・・。
ってかよくよく考えたらtesseract単体で動いてるんだから、libleptに問題ある訳ないですよね。


ってことでpython-tesseractの導入が怪しい。
ガイドにもう1つの方法として書かれているsvnパターンを試してみる。

# sudo svn checkout http://python-tesseract.googlecode.com/svn/trunk/ python-tesseract
# cd python-tesseract
# sudo python setup.py clean
# sudo python setup.py build
# sudo python setup.py install


そして再実行。

# python python-tesseract-test.py
result(ProcessPagesBuffer)= 01234
56789
01234
56789


出来た!