昨夜の競馬新聞の画像データをPyocr+TesseractOCRを利用して文字に変換することを試みた。
結論から言うと、今回は独自学習せず、出来合いのjpn.traineddataを利用したが結果はあまりよくなかった。
とはいえ、この延長で競馬新聞で利用している文字の学習やさらなる高解像度化などにより精度を上げられる可能性もあるので、一応記事にしておく。
環境構築
環境は、Windows10、Python3.6.8です。
この手の記事はQiitaにあるのだが、半日程度は悩んだ。
まず、簡単にいうとOCRの装置がいるわけではなく、
① TesseractOCRという画像読込ソフトを使うと、画像⇒文字列変換を実施する
② Pyocrを使うと、①のTessaractOCRを読み込んでPython内で利用できる
ということである。
ということで、参考のとおりTesseractOCRからインストールします。
【参考】
・Tesseract OCRの始め方
TesseractOCRのインストール
①UB-Mannheim/tesseractから、
tesseract-ocr-w64-setup-v5.0.0-alpha.20190623 (64 bit) resp.
をダウンロードします
②tesseract-ocr-w64-setup-v5.0.0-alpha.20190623.exe
をダブルクリックしてインストールします
③PATHを通すか、以下のようにそのインストールされたディレクトリで以下を実行して確認します
(keras-gpu) C:\Users\user\AppData\Local\Tesseract-OCR>tesseract -v
tesseract v5.0.0-alpha.20190623
leptonica-1.78.0
...
④学習済jpn.traineddataをtesseract-ocr/tesseract/Data-Filesからダウンロード(Data Files for Version 4.00 (November 29, 2016)を使いました)して、TesseractOCRのC:\Users\user\AppData\Local\Tesseract-OCR\tessdata
に格納する
Pyocrのインストール
こちらは通常のpipでインストールできました。
(keras-gpu) C:\Users\user\ObjectiveNuro>pip install pyocr
Collecting pyocr
Downloading https://files.pythonhosted.org/packages/86/17/5fa0edc8da817a7da0198f03319850cb36cf2f20a38b6c7616fcb36211ef/pyocr-0.7.2.tar.gz (65kB)
|████████████████████████████████| 71kB 1.5MB/s
Requirement already satisfied: Pillow in
...
Successfully installed pyocr-0.7.2
コードは以下のとおり
参考のコードを利用させていただいて、以下のとおりで実施しました。
【参考】
・PythonでOCR
from PIL import Image
import sys
import pyocr
import pyocr.builders
import csv
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()))
with open('rect.txt', 'w', newline='\n', encoding="utf-8") as f:
for i in range(1,84,1):
txt = tool.image_to_string(
Image.open("./data/8_1_roi_"+str(i)+".jpg"),
lang="jpn",
builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print( txt )
f.write(txt+'\n')
標準出力例はおまけのとおりですが、rect.txtはメモ帳で見ているからかもだけど、
f.write(txt+'\n')だと改行が入りませんでした。
そして、f.write(txt+'\n')だと以下のとおり入りますが、改行はできませんでした。
また、見るとわかりますが、変換精度が悪すぎます。
※jpn.traineddataは何種類かあるので、変更するとよくなる可能性もありますが、実際には再学習するか画像の解像度を上げる努力が必要なようです
角 居 効 彦 ( 柔 束 )\n畜 : ゴ ブ リ ッ ツ フ ィ ナ ー レ\n( 母 の 父 : デ ィ ー ブ プ イ ン が バ ク ト )\n父 : ル ー ラ ー シ ッ プ\n(② 岡 人 気 ) |\nま . さ\n川 田 封 雅\n仕 ⑤/ 思 器\n⑤⑧.0KG\nル ベーw
デ ー
ャ ー
まとめ
・Pyocr+TesseractOCRを利用して競馬新聞の画像データを活字変換した
・カタカナ以外は、精度はよくない
・綺麗に変換できているものもあるので、画像解像度を上げたり、学習しなおして精度を上げたいと思う
・数字の変換が総じて〇数字になっているので、別の手法にする方がいいかもしれない
【参考】
・Pythonで日本語OCRを行うときのメモ
おまけ
(keras-gpu) C:\Users\user\AppData\Local\Tesseract-OCR>python pyocr_example.py
Will use tool 'Tesseract (sh)'
角 居 効 彦 ( 柔 束 )
畜 : ゴ ブ リ ッ ツ フ ィ ナ ー レ
( 母 の 父 : デ ィ ー ブ プ イ ン が バ ク ト )
父 : ル ー ラ ー シ ッ プ
(② 岡 人 気 ) |
ま . さ
川 田 封 雅
仕 ⑤/ 思 器
⑤⑧.0KG
ル ベーw
デ ー
ャ ー
_・ー )~ー
良
大 貨 杯
⑳①⑨ 代 ③ う 月 ③① 己
川 [ 田 封 雅
⑳D0 芝
② 荷
ア ル ア イ ン
(D.0)
ナ
ク
ク
ク
⑭ 磁 ⑥ 蕩
プ ト ま ペ w
ご Tf イ ノ ト ス ト
④ ③⑤ ち .④
⑤ ち ⑦.0Kd
ょ ・ 口 ① .
っ 0 ぉ k
阪 被
匿 弓 言
有 馬 記 念
⑳①⑧ 年 ⑫ 月 ②③ 日 中 山
川 [ 田 封 雅
②⑤D0 芝
拐 輝
ら 着
ブ ラ ス ト ワ ン
ピ ー ズ (D.⑥)
|
L
L
L
t も 磁 ⑭ 畑
② 艸 人 気
③F ③⑦.⑤
⑤⑦.0Kkd
② ナ ・③ フ ② .
SQekd
G l
⑳①⑧ 年 ⑪ 月 ②⑤ 日 東 向
シ ャ ル ン C
川 田 将 雅
②④D0 芝
イ (0.③)
② 着
民
ア ー モ ン ド ア
①
称 昨
L
⑭ 碁 ⑧ 界
④ す 哉 人 気
③F ③④.⑦
ら ⑦.0Kd
ナ ェ フ ロ . ロ
っ 0④kd
匿 弓 刀
天 君 贄 ( 秋 )
⑳①⑧ 年 ①0 月 ②⑧ 日 木
③ 着
川 田 封 雄
⑳OD 口 芝
民
レ イ エ オ ロ
( 0D.②)
ー
も 荊
⑫ 磁 ① 畑
ら 孝 人 気
③F ③④.⑦
⑤ ぢ .OKd
し ち ⑦.
④Gqb k