3

Tesseract API と並行して Python を学習しようとしています。私の最終的な目標は、Tesseract API を使用してドキュメントを読み取り、基本的なエラー チェックを行う方法を学ぶことです。開始するのに適していると思われるいくつかの例を見つけましたが、動作は異なりますが、同等であるように思われる2つのコードの違いを理解するのに苦労しています。これらは両方ともhttps://pypi.python.org/pypi/tesserocrからわずかに変更されました。

最初の例では、次の出力が生成されます。

$ time ./GetComponentImagesExample2.py|tail -2
symbol MISSISSIPPI,conf: 88.3686599731


real    0m14.227s
user    0m13.534s
sys 0m0.397s

これは正確で、14 秒で完了します。残りの出力を確認すると、かなり良い結果が得られます。おそらく、99% 以上の精度から SetVariable コマンドをいくつか実行する必要があります。

$ ./GetComponentImagesExample2.py|wc -l
    1289

結果を手動で確認すると、すべてのテキストを取得しているように見えます。

#!/usr/bin/python
from PIL import Image
Image.MAX_IMAGE_PIXELS=1000000000
from tesserocr import PyTessBaseAPI, RIL, iterate_level

image = Image.open('/Users/chrysrobyn/tess-install/tesseract/scan_2_new.tif')
with PyTessBaseAPI() as api:
    api.SetImage(image)
    api.Recognize()
    api.SetVariable("save_blob_choices","T")
    ri=api.GetIterator()
    level=RIL.WORD
    boxes = api.GetComponentImages(RIL.WORD, True)
    print 'Found {} textline image components.'.format(len(boxes))
    for r in iterate_level(ri, level):
        symbol = r.GetUTF8Text(level)
        conf = r.Confidence(level)
        if symbol:
            print u'symbol {},conf: {}\n'.format(symbol,conf).encode('utf-8')

2 番目の例では、この出力が生成されます。

$ time ./GetComponentImagesExample4.py|tail -4
symbol MISSISS IPPI
,conf: 85


real    0m17.524s
user    0m16.600s
sys 0m0.427s

これは精度が低く (単語内に余分なスペースが検出される)、遅くなります (17.5 秒かかります)。

$ ./GetComponentImagesExample4.py|wc -l
     223

これには大量のテキストがひどく欠けており、なぜ一部が欠けているのかわかりません。

#!/usr/bin/python
from PIL import Image
Image.MAX_IMAGE_PIXELS=1000000000
from tesserocr import PyTessBaseAPI, RIL

image = Image.open('/Users/chrysrobyn/tess-install/tesseract/scan_2_new.tif')
with PyTessBaseAPI() as api:
    api.SetImage(image)
    api.Recognize()
    api.SetVariable("save_blob_choices","T")
    boxes = api.GetComponentImages(RIL.WORD, True)
    print 'Found {} textword image components.'.format(len(boxes))
    for i, (im, box, _, _) in enumerate(boxes):
        api.SetRectangle(box['x'], box['y'], box['w'], box['h'])
        ocrResult = api.GetUTF8Text()
        conf = api.MeanTextConf()
        if ocrResult:
            print u'symbol {},conf: {}\n'.format(ocrResult,conf).encode('utf-8')
#        print (u"Box[{0}]: x={x}, y={y}, w={w}, h={h}, "
#               "confidence: {1}, text: {2}").format(i, conf, ocrResult, **box).encode('utf-8')

私の最終目標は、ドキュメント内のテキストがどこにあるかを理解することに依存しているため、2 番目の例のような境界ボックスが必要です。私が知る限り、 iterate_level は見つかったテキストの座標を公開していないため、GetComponentImages が必要ですが、出力は同等ではありません。

これらのコードの動作の速度と精度が異なるのはなぜですか? GetComponentImages を GetIterator と一致させることはできますか?

4

1 に答える 1