Closed yrarchi closed 4 years ago
簡単に検索すると、Pythonから扱えるOCRとしては以下が多くヒットした
後者は、GCPで設定が必要だったこと、一定量を超えると有料(超えなそうではあったが)だったことより、前者を使ってレシートを読み取ることを試してみる。
$tesseract eurotext.png eurotext_txt
Tesseract Open Source OCR Engine v4.1.1 with Leptonica
ほぼ正確に認識できていた
$tesseract --list-langs
List of available languages (3):
eng
osd
snum
日本語は入っていないので、別途追加する必要がある
https://tesseract-ocr.github.io/tessdoc/Data-Files.html#updated-data-files-for-version-400-september-15-2017 に言語のファイルについて説明あり
/usr/local/Cellar/tesseract/4.1.1/share/tessdata/
にhttps://github.com/tesseract-ocr/tessdata_fast/blob/master/jpn.traineddata を追加した
言語を日本語に指定して実行してみる
$tesseract test_jpn.png test_jpn_txt -l jpn
Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Warning: Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 150
解像度の警告が出ているけど、かなり正確に文字認識できていた
https://gitlab.gnome.org/World/OpenPaperwork/pyocr#image-to-text に例があるので、それを試してみて実行できることを確認した
result = tool.image_to_string(
Image.open(input_file),
lang=lang,
builder=pyocr.builders.TextBuilder()
)
こんな感じで実行できる
TextBuilder() 普通に全体を文字列として表示される
WordBoxBuilder() 文字列とその位置を取り出せる
print(result[30].content, result[30].position)
# フト ((265, 1051), (372, 1102))
LineBoxBuilder() 行ごとに文字列とその位置を取り出せる
print(line_and_word_boxes[10].word_boxes) # [<pyocr.builders.Box object at 0x1074dff10>, <pyocr.builders.Box object at 0x1074dff90>, <pyocr.builders.Box object at 0x1074dff50>, <pyocr.builders.Box object at 0x1074e8190>, <pyocr.builders.Box object at 0x1074e81d0>, <pyocr.builders.Box object at 0x1074e82d0>, <pyocr.builders.Box object at 0x1074e8110>, <pyocr.builders.Box object at 0x1074e8210>]
print(line_and_word_boxes[10].content) # BP や わら か 仕込 み 5 98※
print(line_and_word_boxes[10].position) # ((146, 1417), (1064, 1492))
word_boxesはさらに行の中から文字列を取り出せる
print(line_and_word_boxes[10].word_boxes[0].content) # BP
print(line_and_word_boxes[10].word_boxes[0].position) # ((146, 1429), (243, 1480))
print(line_and_word_boxes[10].word_boxes[0].confidence) # 92
最後のconfidence は判定の確信度?
https://gitlab.gnome.org/World/OpenPaperwork/pyocr に以下の記載あり
Each word box object has an attribute 'confidence' giving the confidence score provided by the OCR tool. Confidence score depends entirely on the OCR tool.
DigitBuilder() うまく読み取れなかった 不明(未調査)
とりあえずOCRを行える状態にはできたので、具体的な作業はhttps://github.com/yrarchi/household_accounts/issues/5 で行っていく
レシートを目で見て手打ちするのをやめたい。