しゃちの備忘録

これからC++を始める人によるC++の備忘録です(今のところ)

Python3系でtesseractを使ってOCRをやってみる

前回の続きです. 今回はPythonでtesseractを使い,OCRをしてみるところまで挑みたいと思います. OCR(工学文字認識)そのものについては前回書いたので省略します. teru0rc4.hatenablog.com

tesseract

tesseractのインストール

tesseractとはGoogleで開発されているOCRエンジンです. homebrewを使いインストールします(homebrewについては過去に記事書いているのでご参照下さい)

$ brew install tesseract

f:id:teru0rc4:20170721165955p:plain みょろみょろログが出て,インストール完了です. 実は最初の状態だと英数字にしか対応していません. ので,次節にて日本語対応させたいと思います.

その前に,現在のtesseractのバージョンと,対応言語の確認をして起きたいと思います. バージョンの確認は

$  tesseract -v

から行います.

そして現在tesseractのOCRに対応している言語は次のように確認することができます.

$ tesseract --list-langs

ちなみに,OCRをする際に使う辞書ですが以下のディレクトリに格納されていることが確認できます. 人によっては違う可能性はあると思います(未検証). 今後はディレクト/usr/local/share/tessdata/にあるという設定でお話ししたいと思います. もし違う場合は読み替えていただけると幸いです

$ ls /usr/local/share/tessdata/

f:id:teru0rc4:20170721170135p:plain

辞書の追加

上で示したディレクト/usr/local/share/tessdata/に日本語用辞書/usr/local/share/tessdata/を追加し,日本語にも対応するようにします.

https://github.com/tesseract-ocr/tessdataから,自分にtesseractに対応したバージョンの日本語用データ jpn.traineddataを,/usr/local/share/tessdata/にダウンロードします. 上に貼ったリンクは2016年7月21日現在3.05を指しています.今後は変わる可能性があるので気をつけてください. バージョンが3.04であるならば,先ほどの下部に「3.04はこちら」的なリンクがあるのでそちらを参照ください.

上のGitHubから,jpn.traineddataというファイルをダウンロードし,/usr/local/share/tessdata/ドラッグ&ドロップなりで格納してもいいし, コマンドから一発でダウンロード格納もできます.(自分の環境での読み替えには注意して下さい)

$ curl -L -o /usr/local/share/tessdata/jpn.traineddata 'https://github.com/tesseract-ocr/tessdata/raw/master/jpn.traineddata'

f:id:teru0rc4:20170721231011p:plain ちゃんと追加できると,tesseract --list-langsをした時にjpnが追加されると思います. この方法で他の言語の追加もできます.

辞書追加時のエラーについて

ここで私の環境で日本語辞書を追加しようとした時に起きたエラーについて. 上記の方法で辞書を追加し,追加した辞書に対応する言語を使おうとすると, 大量のエラーを吐きました.(無限ループっぽい?)

原因を調査してもクリティカルなものは出てこなかったのですが, 過去に似た症例は存在していて(3.03から3.04に上がった時), 設定項目が変更されているのでその部分の対応でエラーを吐いているらしいです.(詳細は不明) 方法としては,現在配布されている3.05用辞書を修正するか,性能は下がるけど急辞書を使用するかすればいいようです.

ので,今回はtesseract3.05で,3.04用の辞書を使っています. 以下のコマンドを打つか,ダウンロードして直接格納して上げてください.

$ curl -L -o /usr/local/share/tessdata/jpn.traineddata 'https://github.com/tesseract-ocr/tessdata/raw/3.04.00/jpn.traineddata'

辞書の修正についてはそのうち機会があれば.

コマンドライン上での実行

tesseractはコマンドライン上で使うこともできます.

まずは文字が入っている適当な画像を準備します. 今回は次の画像をtest.pngとしました.(ワード自体に意味はないです)

f:id:teru0rc4:20170802213250p:plain

この画像を置いたディレクトリで以下のコマンドを入力して見てください.

$ tesseract test.png result -l jpn

tesseractは先ほどインストールしたtesseractを使うためのコマンドです. 第一引数でOCR対象の画像を指定します. 今回は先ほどの画像sample.pngを指定しています. resultというのは認識結果をどんな名前のテキストファイルで保存するかを指定しています.今回はresult.txtが生成されます -l jpnは辞書の名前です.今回は日本語の辞書を指定しています

上のコマンドを実行し,OCRを行なった結果がこちらです.

本 日 は晴天な り

不自然な半角スペースが入ってますが,これが認識結果ままです. こんな感じにささっとOCRができました.

PythonOCRをする(pyocr)

私は主にPythonであれこれすることが多いので,PythonOCRをする環境のメモも書いておきます.

pyocrのインストール

Pythonでtessetacを動かすためのラッパーライブラリをインストールします.

$ pip3 install pyocr

インストールはこれだけです.

実際のコード例

github.com

pyocr開発者様のGithubに非常に丁寧にのってますのでそれを拝借して解説します.

from PIL import Image
import sys

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools() # OCRツールの有無の確認
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]
print("Will use tool '%s'" % (tool.get_name())) # 使用するOCRツールの名前が出ます,変えたい場合は一個前の参照先を変えること

langs = tool.get_available_languages() # 使用できる言語の確認
print("Available languages: %s" % ", ".join(langs))

lang = langs[0]
print("Will use lang '%s'" % (lang)) # 使用する言語について

これは,pyocrを通して,tesseractなどが使用できることを確認するだけのプログラムです. 私の環境で実行したところ,以下のような結果が出力されました.

Will use tool 'Tesseract (sh)'
Available languages: eng, jpn, osd
Will use lang 'eng'

次にコマンドラインでやったような,画像のテキスト化をやるPythonプログラムです.

from PIL import Image
import sys

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]

txt = tool.image_to_string( # ここでOCRの対象や言語,オプションを指定する
    Image.open('test02.png'),
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
print(txt)

12行目までは,tesseractの確認とそんなに変わりません. 大きく違うのは,tool.image_to_stringの部分です. 引数として画像(実行するディレクトリからの相対パスでもいいし,絶対パスでも大丈夫なようです),翻訳の言語,pyocr.builders.TextBuilder()で示されるOCRの際のオプションを指定することで,OCRの実行ができます.

実行すると引数として渡した画像のOCR結果を出力してくれます. 結果は変数txtに保存されているのでいろんな応用もできそうです.