情報を補足するような質問を書きましたが、暫定での解決策を書きます。
修正1)
質問欄の2点を反映させます。
- Q1 とりあえず百人一首のトイプロブレムが解ければOK
- Q2 基本は真上だけれども180°回転も可能なら対応したい
文字認識の精度をあげるにはどうしたらよいでしょうか?
文字の認識面)
恐らく、百人一首のフォントが通常のフォント(明朝・ゴシック)から離れている(行書寄り?)なことが一因だと思います。OCRで攻めるのであれば、百人一首の文字は全てひらがななので、ひらがなで自前データセットを作るのもありだと思います。
画像の前処理)
元の画像は人間が読むには十分正面の画像ですが、もう少し下準備をしてOCRに放り込んだ方が認識精度が上がりそうな気がします。具体的には、解析対象がカードですので、緑色の枠線で認識させて、領域を抽出、写っている画像を射影変換して台形を長方形に修正させる、です。
物体認識によるカード位置の推定手法もありかと思いますが、枠の内側の内容は100種類あるので、これをOCRの下準備で使うのは(それだけ特徴があればそのまま100種類の画像として認識できそうですので)もったいないですね。
模様として教師あり機械学習?(機械学習は素人でよくわかっていませんが)を行って分類する
1) 物体認識
これが上記の「物体認識によるカード位置の推定手法」にあたります。たぶんAKAZEなどのアルゴリズムを使うことになると思いますが、文字や図形の角やでっぱり、曲がり具合のようなもの特徴を表す点として認識する方法です。回転や拡大縮小があったとしても、それぞれの対応する点は同じように回転や拡大縮小しながら(イメージ的には起点となる一点を中心に一直線に)つながるよね、という原理を使います。その一対一でつながる誤差が一番小さいものが推定するカードの内容となります。が、この物体認識は写真のような濃淡の勾配があるようなものに対して相当うまく働く(恐らく膨大な数の特徴点を抽出できる)はずですが、文字のような濃淡の極端なもの、線に近いもの、ではうまく行かなさそうな気もします。
深層学習を使って物体認識(セマンティックセグメンテーションだとかインスタンスセグメンテーションと呼びます)することもできますが、それができるのであれば直接100クラスの画像認識問題にした方が筋が良さそうですね…
2) 画像認識
画像を物体認識ではなく、特定のカードと限定して認識させようとすると、100種類あるカードの模様(文字)を機会が認識できる解像度まで上げないといけません。すると、現実的な(機械が認識できる)解像度で処理させようとするとハードが追い付かない(計算が遅い?)が起きそうな気がします。特に深層学習の場合がそうです。できなくはないと思いますが、もっとスマートなやり方(例えばOCR)がありそうな気がします。
文字列としての認識精度)
OCRで解決しようとした場合、仮に独自データセットを作ったとしても「しるもしらぬもあふさかのせき」が「しろもしらめもあふきかのせさ」として認識されることもあるかと思います。こういった場合には、文字列全体の一致度をデータベースの中身と比較させると精度が挙げられそうですね。
上下反転してもいける?)
やり方は3種類あると思います。
- OCRする際に、画像をそのままのものと反転させたものを突っ込み、最後の文章としての認識具合をチェック:恐らく正攻法
- カード左下領域の情報を使う(左下にある四角部分をマーカーに使う):汎用性低
- 画像として認識させる:お勧めしません(先の画像認識の下りの部分を参照ください)が、深層学習で対応するのであれば、データ増強の際に画像をゴリゴリ回転させたり反転させたりすることで対応できます。
照明の照りこみが激しい?)
鏡面反射分が多いと画像処理(緑色領域の抽出、OCR精度)で不利になります。照りこみが減るような工夫(すりガラスのような濁ったものを証明の前に挟む、直接照らさずに、白い紙のようなものに一度反射させて間接照明にする、のような工夫をすることでだいぶ良くなると思います。
もし私がやるのであれば、
- 色情報を使ってカード領域を抽出
1.1 色情報での抽出がうまく行かない場合は、まずカードを物体認識で荒く抽出させた上で、限定した領域に対して色情報を使ってカード領域を抽出)
-
抽出した領域を射影変換して長方形に修正
-
OCRで文字認識(可能であれば独自データセットを作成)
3.1 画像が上下反転する可能性があるのであれば、画像を上下反転(180°回転)させて3-5の処理を実施
-
文字を繋げて文章化
-
認識した文章と、データベース上の文章の一致度を調べる(文字の誤認識対策です)
-
一番一致度の高い句を返す
とやります。