はるみちゃんのてっくぶろぐ

はるみちゃんのブログだよ。主に技術系の記事を書くよ。

tesseractでOCR〜数字だけでも〜

前回全然日本語や数字認識ができなかったtesseract、せめて数字だけでも認識できひんか?と思って再チャレンジ。
前回はあまりに工夫がなさすぎた。

今回実験に使うセルはこれ。
f:id:deeptoneworks:20160916041755p:plain

pyocrのbuilderを変えてみる

どうやら、数字だけの認識に対応したbuilderがあったらしいのでそれを使う。

(before)

txt = tool.image_to_string(
    Image.open(‘./img_file_path.png’),
    lang="jpn+eng",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)

(after)

#一応2つとも試す
txt = tool.image_to_string(
    Image.open(‘./img_file_path.png’),
    lang="jpn+eng",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
    )
print(txt)
txt = tool.image_to_string(
    Image.open(‘./img_file_path.png’),
    lang="jpn+eng",
    builder=pyocr.tesseract.DigitBuilder()
    )
print(txt)

結果
あかん!どっちも何もでえへん!!

数字の部分だけを切り取る

多分、隅っこに数字があるからあかんのや!! せや!!いい感じに切り取ったろ!!

image = cv2.imread(‘./image.png’)
image = image[10:,120:] 

f:id:deeptoneworks:20160916050627p:plain

結果
(テキスト)鵬
(数字)何も出ない

あかんやん!

数字の部分を拡大する

いい感じに数字だけ抜き取れたけど、やっぱり画像が小さすぎるんや!
拡大したろ!!

image = cv2.resize(image, (200,200))

f:id:deeptoneworks:20160916050846p:plain

(結果)
(テキスト)38
(数字)何も出ない

おおおおおお!!!!うまくいっとる!
こんなぼやけた数字でもうまくいくんやなあ・・。でもDigitBuilderあかんやん!まあええか。

他の数字でも実験

38が偶然うまくいっただけかもしれん。他の数字でも試してみるで。
画像は貼るのだるいから結果だけ書いとくわ。

正解 結果
5 -
252 252
27 -
230 230
257 257
285 285
1 -
98 -
6 -
93 -
99 -
2 -
102 102

・・・あかんやん!!
3桁の数字は良好やな!問題は1桁と2桁や!!
っていうか38はやっぱ偶然やったんか!!!!

画像をもっとはっきりさせる

やっぱ拡大してボヤけてるんがまずいんちゃうか? 次は「5」の画像でテストするで。

f:id:deeptoneworks:20160916053148p:plain

ちなみに先の実験に使った5の画像はこれや。ぼやけすぎやな。何がなにかわからん。

はっきりさせてみるで。閾値を定めて2値化や!

image = cv2.threshold(image,180,255,cv2.THRESH_BINARY)[1] 

f:id:deeptoneworks:20160916053729p:plain

なんか微妙やな・・でもこれが限界やったわ。

(結果)
5

おおお!うまくいっとる!さて、先と同じように他のデータでも実験してみるで。

正解 結果
5 5
252
27 -
230 -
257 0
285 -
1 -
98 -
6 -
93 -
99 -
2 -
102 102

悪化しとるやん!!!! 2値化した画像を1つずつ見ていくと、なんか2つの数字がくっついたりしとった!!
でもチューニングも限界なんや・・・。

ちなみに

image = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,6)

とかでいい感じに先鋭化して2値化しようとしたけどこれもダメやった・・。

結論

多分、1個1個チューニングしていったら全部判別はできるんやろうな・・。
そんなんやったら全部自分でラベリングするわ!!!

あと自分のチューニング方法も悪いんやろな・・。
正直俺でも5か6かわからんわ!って感じやしな。
ボヤけた画像をシャープにする方法、もっと他にあるはずや。
DeepLearningで画像を高画質にするやつとかあったやろ?俺にはよくわからんわ・・・。

mnistとかを元に自分で分類器作るか・・?でもmnistの数字は綺麗すぎるし、だめそうやなあ・・。
だから、自分でボヤけた数字データセットを作って分類器つくるんかな。

方針としては以下のどっちかかな。

1)ボヤけた画像をDeepLearningにより高画質化(どうすんねん)
2)ボヤけた画像を教師データとして分類器を作成(データセットつくるのだっるいなあ・・)

でもその前に試してみたいやつがあるんや、それは次回やるで。