Does it taste good?

「そんなことも知らないの?」って言わないでほしい。

Tesseract-OCRとPyOCRで遊ぼう_2019秋

きっかけ

  • 画像ソースしかないコードをテキスト(ってか.Rや.sql)で取得したかったけれども、全文打ち込むのが面倒だった

tesseract概要

punhundon-lifeshift.com

  • 画像から文字起こしする技術を光学文字認識(Optical Character Recognition)という。略してOCR
  • OCRを実施できるソフトウェアに、Googleが開発元の「テッセラクト(tesseract)」というものがある。「tesseract-OCR」とも呼ばれる。
  • tesseract-OCRオープンソース
  • tesseract-OCRPythonで使えるようにするためのライブラリが「pyocr」

インストール

MacなのでHomebrewで入れる。

github.com

依存パッケージ①

brew install automake autoconf libtool
brew install pkgconfig
brew install icu4c
brew install leptonica
brew install gcc

ちなみに、

In order to prevent conflicts with Apple's own libtool we have prepended a "g"
so, you have instead: glibtool and glibtoolize.

と出たので、

brew install glibtool glibtoolize

とやったけど、そんなのないよって言われた。。

依存パッケージ②

brew install pango

本体

このあたりを参考にしつつ、

git clone https://github.com/tesseract-ocr/tesseract/
cd tesseract
./autogen.sh
./configure
make
sudo make install  # if desired
sudo ldconfig
make training # if installed with training dependencies

あとpyocr

sudo pip install pyocr

で入った。

辞書

日本語の辞書はここ。

github.com

本体インストール時に入っていなかったら

/usr/local/Cellar/tesseract/4.1.0/share/tessdata

に入れておく。*1

実践

まずはコマンドラインから

Pythonで日本語OCRを行うときのメモを参考に「笑顔が一番!れにちゃん」の画像を用意して、

tesseract ocr_test.png out -l jpn

と実行すると結果が以下(※外部テキストout.txtに出力される)

笑 顔 が 一 番 ! れ に ち ゃ ん

tessteractのバージョンが上がったからか、Qiitaのときよりも精度上がってる気がする。

Python

Pythonで日本語OCRを行うときのメモTesseract+PyOCRで簡易OCRを試してみるを参考に。

引数で画像ファイルと使用言語指定できるようにした。

import pyocr
import pyocr.builders
import argparse
from PIL import Image

parser = argparse.ArgumentParser(description='tesseract ocr test')
parser.add_argument('image', help='image path')
parser.add_argument('lang', help='choose language')
args = parser.parse_args()

tools = pyocr.get_available_tools()

if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]

res = tool.image_to_string(Image.open(args.image),
                           lang=args.lang,
                           builder=pyocr.builders.TextBuilder(tesseract_layout=6))

print(res)

これをexample_2.pyとし、*2

$ python example_2.py ocr_test.png jpn
笑 顔 が 一 番 ! れ に ち ゃ ん

他にも色々試してみたけれども、なかなか英語中心に使える感じ。

終わりに

この手の話はPythonだろうなと思ったけど、やっぱりRでもできるんですよね! 近くRでもやってみたい。

qiita.com

*1:4.1.0のところはそのとき入れたバージョンの数字でお願いします

*2:ナンバリングされているのはオリジナルが1だからで特に意味はないです