日本人にだけ読めないという Electroharmonix というフォントが話題なので、どうして読めないのか?というのを OCR を使って解説します…と言いますか、理由は日本はカタカナを知っているけど、欧米人はカタカナが解らないから字形を見てアルファベットにしか見えない(という似た感じの文字を探す)というだけなんですけど、そのあたりを OCR を使って動作確認をしてみようという話。
日本人にだけ読めないフォント「Electroharmonix」が面白いと話題に! | netgeek
http://netgeek.biz/archives/53486
ちなみに、Electroharmonix フォントは 1985年にできたのでフォント的には古いものです。なので、あちこちのゲームやポスターに使ってあるみたいです。
Tesseract-OCR
OpenCV 3.0 に入りましたが、もともとは Google Code にあります。tesseract-ocr – An OCR Engine that was developed at HP Labs between 1985 and 1995… and now at Google. – Google Project Hosting 1995年という結構古いものですが、アルファベットと数字だけなど字形を限って使えば認識率は高くなります。ざっと確認すると、Microsoft OCR よりも認識率が高かったので、なんだろうな、という感じなんですが。
最新のコードは Github に移っています。tesseract-ocr
Tesseract-OCR の学習データを作る
Tesseract-OCRの学習 – はだしの元さん
http://hadashi-gensan.hatenablog.com/entry/2014/01/15/135316
を参考にすると、OCR に学習データが作れます。結構手順がややこしいので後できちんとまとめますが、英語版(eng)と日本語版(jpn)の2つを作りました。
英語版の文字セットは、アルファベットと数字のみで構成
日本語版の文字セットは、アルファベットに加えて、カタカナを入れます。
これをもとに学習データを作成して、
- アルファベットしか理解しない 英語 OCR
- アルファベットとカタカナを理解する日本語OCR
ができます。
そこで、例の Electroharmonix フォントで作った文字を与えてやって、どのように認識するのか?を調べればよいわけです。
アルファベットを OCR 認識させる
最初に「MASUDA TOMOAKI」のアルファベットを認識させてみます。
認識対象のフォントが Broadway のため、若干ずれていますが、まあまあアルファベットとして認識されてますよね。
同じものを日本語OCRで認識させると、「A」の箇所が「ム」に誤認されています。英語OCRは「ム」という文字を知らないので、そのままアルファベットに割り当てますが、日本語OCRの場合はカタカナを知っているので「A」に似た「ム」の文字に割り当てます。
例のフォントを OCR 認識させる
今度は Electroharmonix フォントを使った認識させてみます。
思ったほど、正確には認識できていませんがw、まあ、無理矢理アルファベットと数字に割り当てて読み解こうとしています。文字数が異なるのは、隣あう文字をひとつの文字にしたり、逆にふたつの文字として誤認しているからです。このあたりは学習データのバリエーションを増やすとか、フォントの間を開けるとかで避けられる問題です。
まあ、なんとなく英語圏の人はこんな感じで認識しているんじゃないかな、という想像ができますね。
今度はカタカナを知っている日本語OCRで試してみましょう。
やたらに四角がありますが、「ロ」(ろ)です。Oの部分がロに見えているという訳です。先の英語OCRがアルファベットに割り当てているのと違って、日本語OCRは主にカタカナに割り当てていますよね。もともと、Electroharmonix フォントがカタカナを意識しているので、そちらに引っ張られて、日本人の場合はもともとの読み方ができないわけです。
単純なカタカナならば?
逆にカタカナだけだったどうだろうか?というと、
英語圏の人には、数字とアルファベットの組み合わせにしか読めないけど、
カタカナを知っている日本人には、普通に読めますね、という具合です。
結論…ってほどではないけど
そんな訳で、Tesseract-OCR を使って、日本人だけが読めない理由(実験的にはアルファベット圏の人にも読めませんがw)が実証できたと思います。
具体的なコードは後からまとめましょう。
このあたりを応用して、k近傍法の IkaLog も試してみたいと思う…のですが、スプラトゥーンは持ってないし、Wii U は持ってないし…というわけで、Youtube あたりの動画か認識させればよいかと思案中。