ダンプリストをOCR!

今も細々と開発中のダンプリスト入力ツール!

pocketgriffon.hatenablog.comダンプリストも、基本的には手入力が好きな私。

OCRで文字認識をさせてみても、その間違いを探してどうせ256バイト全部見るくらいだったら、最初から手で打ち込んだ方が早いじゃん…と思ってしまってる。

 

2017年に一度だけOCRに挑戦してみたが、この時は4%くらいの間違いで済んでいた。このくらいの間違い率だったら使ってみても良いかな…と思っていたが、この当時使っていたタブレットのカメラが高性能だったのか、iPhoneに変えてからはだいぶ間違いが多い。

 

あの時は既存のツールを使うだけの方法だったけど、今回は認識率を上げるために自分で努力してみる事にした!

 

どんなツールがある?

今までOCRのツールに何があるのかなんて気にした事もなかった…。

真っ先に出てきたのが、Google DriveによるOCRだった。

へー、知らんかった!そんな機能あるのね(^^)

これでそれなりの文字列に変換されたら、もうコレでいーんじゃね?(^-^)

……うーん、想像してたのとだいーぶ違う(T-T)

順番とか揃えたらそれっぽく出てるんだろうか??
並べ直してみようと思ったが、この並び替えを毎回手作業でやるの?と思ったら気が萎えてしまった(^^;

ほかを探す流れに……。

 

OCRで検索するとPythonがやたら出てくる。機械学習とか出てくるけれど、正直良くわかってない(^^;; とりあえず文字へ変換できればいいんだけど…くらいのイメージで探す。

 

OCRの作業自体はMacで行うので、Macで動くツールが良い。

そうして探していると、どうやらtesseractというツールがあるらしい。

この名前も初めて聞く(^^;;

よし、当面はtesseractを使ってOCRにチャレンジしてみるよ!

 

まずは試す!

この手の事は、過去の歴史がたくさんあるだろうから調べていくと正解?に近いものは出てくるだろうけれど、それだと仕組みやらなにやらを理解しないまま終わってしまいそう。

無駄とは思いつつも、自分なりの方法で試してみる(^-^)

 

まずは元となるダンプリストの写真を用意する。

なんとなく白黒がはっきりした方が文字として認識しやすいんだろうな…という勝手な解釈により、ある閾値で白黒を分けるプログラムを組んでみる。

この辺りは、過去にjpegを扱うプログラムを何度も組んでいたため、簡単に作れた。

自分jpegライブラリがあると便利だよ!(^^)

tesseract -l eng --psm 6 -c tessedit_char_whitelist="0123456789ABCDEFSumd:+O " out.jpg out

 

コマンドラインはこんな感じで設定している。

画像に含まれている文字は英語のみ(-l eng)、横書きの文字(--psm 6)、この画像に含まれている文字の種類(tessedit_char_whitelist)という感じだ。

 

ホワイトリストの最後にアルファベットのO(オー)が入っているのは、ダンプリストによっては数字の0(ゼロ)が飾り付きと無しの場合があるから。O(オー)としてご認識されたものを、あとのツールで0(ゼロ)に変換しようという魂胆だ!(^^)

 

tesseractのフォントをPC-9801に!

 

理屈で言えば文字自体が似ていれば、さらに認識率が上がるはずだ!

じゃあ…という事で、tesseractにPC-9801フォントを学習させてみる事にした。

ネットでいろんな情報を探してみたところ、分かりやすい例を見つけられた!

danglingfarpointer.hatenablog.com

↑ここに書かれている手順で、tessaractに学習させてみる。…学習というよりは、文字認識用のデータを用意するイメージかも知れない。

 

-l eng としていたところは jpn などの指定も出来るのだが、このオプションで文字学習データセットを用意するイメージだ。

私はdumpリスト専用という意味で、dmpというフォントセットを用意した。

PC-9801用のフォントがちゃんとBOX判定されているのが分かる(^^)

しかし結果は散々で、0(ゼロ)がすべて9に認識されてしまった(T-T)
うーん…これは結構厳しいぞ!

 

仕方ないので、PC-9801のフォントを改造して、ダンプリストに寄せたフォントを作った!

お、これでだいぶ認識率が上がった気がする!

 

1文字ずつ認識してみる

tesseractのモード(psm)に「この画像には1文字だけ含まれている」という指定がある。複数の文字じゃなくて1文字だけだからねーとあらかじめ教える事で、認識率をあげようって事だと思う。これを使ったらもっともっと正解率が上がるんじゃね??

 

今まで一度も使ったことのないOpenCV(+Python)を利用して、画像の抽出に挑戦だ!

…と気合を入れてみたけれど、世の中にチャレンジされていた方が多かったので、基本部分を参照にさせてもらってサクっと作ってみた!

むしろPythonが久しぶりすぎて大変だった(^^;;

おおおお……めちゃくちゃ正確に分別できてる!

これを各エリアごとにtesseractに送り込めば良いわけだな……(^^)

それにしても、PythonOpenCVを利用したプログラムが簡単に書けるのは便利だ!!

さて、1文字ずつ抜き出して処理するんだけども……どんな順番で出てくるの?(@_@;

左から、通し番号、X座標、Y座標、横幅、縦長、認識した文字。

データの並びを見てみると、どうやら右下から左側へ向けて処理が走ってるっぽい。

Python側で処理順番を逆にすればいいのかな…と思ったけど、どうもそこまで簡単な話ではなさそうな雰囲気。

出力された座標情報に基づいて、左上から出力するツールをサクッと作成。

あれ……???認識率落ちた??(T-T)

 

この後、フォントを変更したりサイズを変えてみたりするけれども、認識率が上がらない。

フォントを変更すると確実に認識する文字が変わるので効果はあるっぽいけれども、それでもどどーんと上がりませぬ…。うむむ…。

 

機械学習とかしていけばもしかしたら??とは思うけれども…(^^;;;

 

あと同じ工学社の雑誌でもダンプリストのフォントが大幅に違っていたりして、その都度調整をしていかないと認識率が上がっていかない事も分かってきた。

奥が深いぞ、OCR!!(T-T)

 

おわりに

とりあえず現状ではこんな感じ!

ブログにまとめておかないとあっという間に忘れそうだったので急いで書いてみた!

書いてみたけど参考になる事は無かったかも…汗

 

もっと良い方法が分かったら再チャレンジ案件ですな、これは!(^^)

ではまた次回!(^-^)ノ