2013/01/31

年賀はがき当たりチェックアプリとSVM(2)

はがき当たりチェックアプリプロジェクトも開始から1週間経ちました。
手作業で確認したほうが早いのですが、まぁ趣味の一部なのでその辺は気にしないことにしましょう。


OpenCVのサンプルコードに、digits.pyというSVMを使って手書き数字を認識するコードがあります。これのデータセットは、20x20ピクセルの画像を5000枚並べたものです。

はがきの番号は手書きとは違って明朝体風の印刷フォントなので、線の太さが一定ではありません。サンプルをそのまま使った場合の認識率はさほどよくありませんでした。

はがきの番号のフォント名がわかれば紙にたくさん印刷してデータセットを簡単に作れるのですが、ググってもフォント名はわかりませんでした。
机の中を漁ったところ、去年の年賀状があったのでその番号だけを切り取って板に貼りつけて、データセットをたくさん作れるようにしました。


あとはデジカメで撮影し、OpenCVで文字っぽいものを自動で切り出し、あとは0から9までの10個のフォルダに人力で仕分けしました。数字の分布が均一では無いため、全ての数字が500枚以上になるまでこの地味な作業が続きました。

そしてサンプルのデータセットと同じように20x20ピクセルに縮小したものを5000枚並べた画像を作りました。これでSVMをトレーニングすると、なかなかいい精度の識別器が出来上がりました。


識別機はできたものの、どうやって特徴量を決めているのかな〜とPythonのソースコードを見たところ、HoGという特徴量を使っているとのこと。
HoGは Histograms of Oriented Gradientsの略で、画像の特定セルの勾配をヒストグラムにするものだそうで。人や車など、大まかな形状を探すものに向いているようです。

参考元(中部大学):

Pythonのチュートリアルでは、20x20の画像を10x10の4つに分けて、 勾配を16に分けてヒストグラムを作っているようです。10x10セル一つで16次元なので、4つで64次元。Huモーメントだと7次元なので、こっちのほうがクラス分けには良さそうですね。
サポートベクターを求めるのにある程度時間がかかりますが、一度サポートベクターを求めてしまえば、あとはファイルに保存したものを読みこめばいいので、PCでSVMの学習をおこなって、Androidに学習ファイルだけを渡せば良さそうです。

次は6桁の数字を判定する部分を作って、今年来た年賀状が当たっているかをチェックしてみたいと思います。


ではまた。

0 件のコメント:

コメントを投稿