導入
Tesseract は「対象の言語」と「レイアウトの想定」を指定すると精度が上がります。特に日本語を読むには、日本語の学習データを指定する必要があります。
説明
import pytesseract
from PIL import Image
img = Image.open("receipt.png")
# lang: 認識する言語。日本語は "jpn"、英語は "eng"、併用は "jpn+eng"
# --psm: ページ分割モード(レイアウトの想定)
# --oem: エンジンモード(1 = LSTM ニューラルネット)
config = "--oem 1 --psm 6"
text = pytesseract.image_to_string(img, lang="jpn+eng", config=config)
print(text)
lang="jpn"… 日本語データを使います。事前に日本語データ(jpn.traineddata)の導入が必要です(apt install tesseract-ocr-jpnなど)。--psm(Page Segmentation Mode)… レイアウトの想定。代表的な値:--psm 6… 「1つの均一なテキストブロック」。レシートや段落向けの無難な既定。--psm 7… 「1行だけ」。1行の見出しやラベル向け。--psm 11… 「バラバラの文字を拾えるだけ拾う」。まばらな文字向け。
--oem 1… LSTM(ディープラーニング)エンジンを使う指定。近年の Tesseract の主力です。
「読ませたい対象のレイアウトに合う psm を選ぶ」ことが、地味ですが効きます。1行のラベルを --psm 6 で読ませてうまくいかないときは --psm 7 を試す、といった具合です。
演習
このレッスンは読み物です。「1枚のレシート全体」と「商品名1行だけ」で、選ぶべき --psm が違うことを意識しましょう。日本語を読むには lang に何を指定するか("jpn")も覚えておいてください。