Monthly Archives: 3月 2014

kaggleのDigit Recognizerに挑戦してみた

数字の認識に挑戦してみたので、たいしたことはやってないけどそのノウハウをまとめる。

詳細は以下のリンクにて
http://www.kaggle.com/c/digit-recognizer

利用したデータはtrain.csvで上記リンク先の”Get the Data”を辿るとみつかる。
train.csvには画像データ42000万毎分のデータがはいっており、始めの行に

label,pixel0,pixel1,pixel2,pixel3,pixel4,…,pixel782,pixel783

と書いてある。つまり、2行目以降の行ごとに1つ分の画像データが入っていて、その画像は28x28pixelのサイズだから全784pixelであることを示す。
一番最初のlabelには画像に書かれている数字が示しされている。以下のデータはある1行を実際に抜き出してきたものだが、一番初めの1はこの画像データが示している数字を表し、後の784つの数字は各pixelの画像データを表す。0ばかり並んでいるが、中略のところにちゃんと上限255で0じゃない数字も並んでいる。

1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,…,0,0,0

train.csvには42000画像分のデータが入っているため、始めの各列の説明を示す行と合わせて42001行のデータとなっている。

まず自分が行ったのは、28×28の画像データからマージン部分を排除し、20×20の画像にリサイズする作業。

original

実際に上の画像を見てみるとわかるが、上下左右にマージンが存在する。マージンがあると画像内で数字が上下左右のどこかに偏る可能性があるので、それをなくす効果を期待した。
得られた画像が以下のもの。

sub

今回は16x20pixelの画像になったが、データによってマージンが異なる。つまり、マージンを除去すると画像ごとにデータ量が違うものになってしまう。これは後で認識する際に不便なので、20x20pixelにリサイズした。実際の画像が以下のもの。

original20x20

ちゃんと正方形の画像になっているのがわかると思う。この作業にはデータ量を揃える以外にもう一つ期待していることがある。それはサイズの統一化。42000枚の画像があるが、28x28pixelという狭いところに数字が1つ書かれているといっても恐らく書かれている数字の大きさに微妙なばらつきがあると思われる。マージンを排除して20x20pixelにリサイズすることで全ての数字のサイズを揃えている。

また、最後にデータごとに平均値で引いた後、標準偏差で割ることで分散を1に統一し、normalizeする。

今までの流れをソースコードにすると以下の通り。