Help us understand the problem. What is going on with this article?

Tesseract+PyOCRで簡易OCRを試してみる

More than 1 year has passed since last update.

今回は「Tesseract OCR」と「PyOCR」を使用して、OCR(光学的文字認識)を試してみました。

Tesseract OCRとは

https://github.com/tesseract-ocr/tesseract

「Tesseract OCR」はGoogle、HPが開発したオープンソースOCRエンジン。
Unicode(UTF-8)をサポートしており、100以上の言語を「そのまま」認識できます。

PyOCRとは

https://gitlab.gnome.org/World/OpenPaperwork/pyocr

「PyOCR」はPython用のOCRツールラッパー。
PythonプログラムからさまざまなOCRツールを使用できます。
現在サポートされているOCRツールは以下の3種類。

  • Libtesseract
  • Tesseract
  • Cuneiform

環境構築

※実行環境はMacOSです。

1. Tesseract OCR

①Tesseractのインストール
 Homebrewの場合brew install tesseractで終了です。
②学習データの準備
 https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
 上記リンクから訓練データをDLし、以下に格納します。
 /usr/local/Cellar/tesseract/[tesseractのバージョン]/share/tessdata
 バージョン4.0.0からは速度重視の「tessdata_fast」精度重視の「tessdata_best」が選べます。
 本記事では通常の訓練データ「tessdata」を使用します。

※他環境の場合は以下を参照してください。
 https://github.com/tesseract-ocr/tesseract/wiki

2. PyOCR

①PyOCRのインストール
 以下のコマンドを実行するだけです。
 sudo pip3 install pyocr

以上で環境構築は終了です。簡単ですね。

実行してみる

こちらのサンプルを実行します。(※少しいじっています。)

example.py
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]
print("Will use tool '%s'" % (tool.get_name()))

txt = tool.image_to_string(
    Image.open("[ファイル名]"),
    lang="jpn",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print( txt )

①Wikipedia

wiki.png

実行結果
出 典 : フ リ ー 百 科 事 典 『 ウ ィ キ ペ デ ィ ア (Wikipedia) 』
OCR
・ 光 学 文 字 認 識 (Optical Character Recognition) の 略 称 。
・ 光 学 式 文 字 読 取 装 置 (Optical Character Reader) の 略 称 。
・ オ イ ル 循 環 率 (Oil Circulation Ratio) の 略 称 。
・ 過 電 流 継 電 器 (Over Current Relay) の 略 称 。
こ の ペ ー ジ は 曖 昧 さ 回 避 の た め の ペ ー ジ で す 。 一 つ の 語 句 が 複 数 の 意 味 ・ 職 能 を 有 す る 場 合 の 水 先 案 内 の た め に 、 異 な る 用 法 を 一 覧 に し て あ り ま す 。 お 探 し の 用 語 に 一 番 近 い 記 事 を
選 ん で 下 さ い 。 こ の ペ ー ジ ヘ リ ン ク し て い る ペ ー ジ を 見 つ け た ら 、 リ ン ク を 適 切 な 項 目 に 張 り 替 え て 下 さ い 。
カ テ ゴ リ : 暖 昧 さ 回 避

タイトルの「OCR」は読み取れませんでしたがほぼ完璧ですね。

②Yahooニュース

yahoo2.png

実行結果
ニ ュ ー ス | 細 津 _ エ ン タ メ レ ス ポ ー
①⑧ 時 ⑥ 分 更 新
・ 細 野 氏 の 処 遇 岸 田 氏 が 不 快 感 國 四 謬 璽以′ 和
・ 小 ④ 死 亡 第 三 者 委 を 設 置 へ 団 E ⑤ ョ ~ 。
・③① 日 は 広 く 雨 予 報 都 心 で 雪 か 団 G ド 】
・ 広 河 隆 一 氏 か ら 性 袖 害 新 告 発 國 ` き て ま す 」
・ パ チ ン コ 依 存 ⑤ 社 が 対 策 表 明 団 (TE 雷睾豊冑4時鵠分配信
・ ピ ー ス ポ ー ト 豪 華 造 船 が 頓 挫 ⑪
・ VG 井 ノ 原 提 案 ア プ リ が 話 題 団
・ 亡 き 有 賀 さ つ き さ ん 父 の 後 悔 國
も っ と 見 る ト ピ ッ ク ス 一 覧

数字が◯で囲まれてます。(仕様っぽいですが)
また、カメラの絵文字なども文字と誤認識されています。

③写真から読み取る

inmilktea.jpg

実行結果
ョ の ス キ ト
辻 点 花 付
紅 余 化 伝
RO 〇 YAL 〟
M ま EL K T イ EA
0 :鯱翼 ① ダ
ロ イ ヤ ル ミ ル ク デ ー 一 ー
繁 勇 表 示 (①00ml 当 た り ノ
① げ ー③⑥kcaL た ん ば く < 質 0Gg、 胆 賀
為 航 化 物 ⑥.⑥⑧ 食 報 柑 き 見 0
② ` 沈 殿 し た り 固 ま っ た り す る `
⑳ 謬 あ り ま せ ん 。g r 声 け て く だ さ い 映 種 城 捨 畜
S 格 a
`幟鱒鱒州 ′~
A ①

流石に精度は落ちたでしょうか…
わかりにくいので、画像のどこを文字として認識しているかを確認してみます。

おまけ(WordBox)

単語と認識されたエリアをボックスで返してくれるので、OpenCVで矩形を描画します。
コードは以下の記事を参考にさせていただきました。
Pythonで日本語OCRを行うときのメモ

example.py
import pyocr
import pyocr.builders
import cv2
from PIL import Image
import sys

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("[ファイル名]"),
                           lang="jpn",
                           builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6))

out = cv2.imread("[ファイル名]")
for d in res:
    print(d.content)
    print(d.position)
    cv2.rectangle(out_resize, d.position[0], d.position[1], (0, 0, 255), 2)

cv2.imshow("img",out)
cv2.waitKey(0)
cv2.destroyAllWindows()

outinmilktea.jpg
模様や文字列を一つの文字として誤認識してしまっているようです。


このように、Tesseract OCR(の訓練データ)は文字の傾きや歪みに弱いです。
模様などの誤認識も多いため実用にあたっては色々と制限をかける必要がありそうですね。
ただオープンソースとしては破格の精度なので、是非試してみてくださいね!

参考リンク

Pythonで日本語OCRを行うときのメモ
【PyOCR】画像から日本語の文字データを抽出する

i-enter
「効果」をつねに提供します。スマホアプリ開発No.1の実績。最新のIoTに対応した開発も行います。
https://www.i-enter.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした