【OCR】Raspberry PiでOCR[Tesseract-OCR・pyocr]を試してみた

はじめに

こんにちは、がんがんです。
最近ラズパイを用いていろいろ遊んでいます。ラズパイカメラを用いて物体検出を行っているのですが、OCRもやってみようとふと思いました。
そこで、ラズパイでOCRを行う方法について調査していきました。

目的

環境

Tesseract-OCRのインストール

まずはインストールを行います。ついでにパッケージも最新版にしておきます。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install tesseract-ocr tesseract-ocr-jpn

pyocrのインストール

次に、python用のライブラリであるpyocrをインストールします。

$ pip3 install pyocr

動作の確認はこんな感じです。エラーが出なければ大丈夫です。

$ python3
>>>import pyocr
>>>pyocr.get_available_tools()

実験してみる

実際に実験してみます。実験用の画像は本備忘録のタイトル画面です。

f:id:gangannikki:20190729015711p:plain
実験に使用した画像

文字の認識

まずは画像から文字を読み取り、printで出力するというものです。OCRとしては比較的簡単な動作ですね。コードは以下の通りです。

コード
import pyocr as ocr
import pyocr.builders
from PIL import Image

def main():
	img_path = "../画像/ocr_test.png"

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

	tool = tools[0]
	res = tool.image_to_string(Image.open(img_path), lang="jpn",
							builder=pyocr.builders.TextBuilder(tesseract_layout=6))
	print(res)

if __name__ == '__main__':
	main()
実験結果

実行結果はこんな感じです。思っていたよりは読み取れているのかな?って印象です。

$ python3 python_ocr.py 
【c。raー USB アクセラレ一夕】 c。raー USB アクセラレ
一夕のデモを改良し、リアルタイム顛檎出を行う 囁
物体検出 R瑯鯱帆 P` 鵬gp L曲mmg[深ロ学習] 馴m Gmg槍 mーM7迦
~ はじぬに
~ 目的
~ 奏考
~ デモ内薯の確譚と動纏
~ 実験ー 検出鰭果にバウンティンダボックスを表示させる
〟 c搬血{剛"鳳wからの憂更点
〟 実行精果
~ 実験2 リアル夕ィ礦検出を行ラ
~ まとめ

文字をボックスで囲う

次は単語の位置を特定し、ボックスで囲っていくというものです。コードは以下のとおりです。

コード
import pyocr as ocr
import pyocr.builders
from PIL import Image, ImageDraw

def main():
#	img_path = "../画像/ocr_test.png"
	img = Image.open("../画像/ocr_test.png")

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

	tool = tools[0]
	res = tool.image_to_string(img, lang="jpn",
							builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6))
	
	#  画像内に矩形を描画
	draw = ImageDraw.Draw(img)
	for box in res:
		print(box)
		draw.rectangle(box.position, outline=( 255, 0, 0))
	
	img.save("../画像/ocr_test_output2.png")

if __name__ == '__main__':
	main()
実行結果

実行結果と出力画像は以下のとおりです。出力結果は長いので一部省略しています。出力テキストの精度は先程とあまり変わりませんが、文字をきちんと矩形できているのはすごいです。

f:id:gangannikki:20190729025216p:plain
矩形の描画結果

$ python3 python_ocr_box.py 
【c。raー
((18, 14), (91, 38))
USB
((101, 18), (154, 36))
アクセラレ一夕】
((163, 14), (328, 38))
c。raー
((334, 17), (398, 36))
USB
((408, 18), (460, 36))
アクセラレ
((470, 15), (579, 37))
一夕のデモを改良し、リアルタイム顛檎出を行う

(中略)

((18, 306), (22, 310))
実験2
((34, 300), (69, 313))
リアル夕ィ礦検出を行ラ
((84, 300), (232, 313))
~
((18, 331), (22, 335))
まとめ
((34, 326), (69, 337))

パラメータの検証について(参考記事)

今回はtesseract_layout=6として実験していますが、このパラメータについてはこちらで詳しくまとめられていました。
今後もっとOCRについて扱う場合は参考にしていきます。
tanaken-log.blogspot.com

まとめ

今回はPythonにおけるOCR「pyocr」をRaspberry Pi上で試してみました。
次はカメラの映像中から文字を認識するようなプログラムを作っていきたいです。