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する。

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

install OpenCV2.4.8 in ubuntu13.10

$ apt-get install libqt4-dev
$ apt-get install libgtk2.0-dev
$ apt-get install pkg-config
$ apt-get install cmake
$ apt-get install python-dev
$ apt-get install python-numpy python-scipy python-matplotlib
$ wget
$ unzip OpenCV2.4.8.zip
$ mkdir build
$ cd build
$ cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_GTK=ON -DWITH_FFMPEG=ON INSTALL_PYTHON_EXAMPLES=ON
$ make -j4
$ sudo make install
$ sudo ldconfig

cppファイルで opencv2/opencv.hppをincludeして使う。
コンパイルは以下のように行う。

$ g++ -o foo foo.cpp `pkg-config –cflags –libs opencv`

install ffmpeg2.1.3 in ubuntu13.10

ubuntu13.10にffmpeg2.1.3にインストールした時のログ

$ sudo apt-get install yasm
$ sudo apt-get install libfaac-dev libtheora-dev

x264のインストール

$ git clone –depth 1 git://git.videolan.org/x264
$ cd x264
$ ./configure –enable-shared –enable-pic
$ make -j8
$ sudo make install

ffmpegのインストール

$ wget http://www.ffmpeg.org/releases/ffmpeg-2.1.3.tar.bz2
$ tar jxvf ffmpeg-2.1.3.tar.bz2
$ cd ffmpeg-2.1.3
$ ./configure –enable-gpl –enable-libfaac –enable-libtheora –enable-libx264 –enable-nonfree –enable-shared
$ make -j8
$ sudo make install

ffmpegが共有ライブラリを認識してない

$ ldd ffmpeg
linux-vdso.so.1 => (0x00007fff567ea000)
libavdevice.so.55 => not found
libavfilter.so.3 => not found
libavformat.so.55 => not found
libavcodec.so.55 => not found
libpostproc.so.52 => not found
libswresample.so.0 => not found
libswscale.so.2 => not found
libavutil.so.52 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f28f09fa000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f28f07dd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f28f0415000)
/lib64/ld-linux-x86-64.so.2 (0x00007f28f0d1c000)

idconfigコマンドで認識

$ sudo ldconfig

以上

How to get SD card working in ubuntu13.10

ubuntu13.10でSDカードを認識させるためにしたことのメモ

Error mounting /dev/mmcblk0p1 at /media/takashi/7AFF-4F36: Command-line `mount -t “exfat” -o “uhelper=udisks2,nodev,nosuid” “/dev/mmcblk0p1” “/media/takashi/7AFF-4F36″‘ exited with non-zero exit status 32: mount: unknown filesystem type ‘exfat’

ubuntuでAndroid端末の接続設定

ubuntuでAndroidの実機接続で手間取ったのでメモ。

ThinkPad x230でブルースクリーン

ThinkPad x230でブルースクリーンが頻発して出るようになった。

/res/rawからファイルを読む

Android開発でプロジェクトの/res/rawにファイルを入れておいてそれを絶対パスで利用する方法。

SH-09Dでテザリング

DocomoのSH-09Dを使ってテザリングをしようとすると一手間かかったのでメモ

3TBのHDDが2TBしか認識しない

746.52GBが未割り当てと「ディスクの管理」に出ていたのでパーティションを作ろうと右クリックすると「新しいシンボルボリューム」のところとかがグレーになってて選択できない。

SH-09Dがサポートしている解像度メモ

SH-09Dのサポートしている画像の解像度についてのメモ
getSupportedPictureSizes()がカメラで撮影できる画像の解像度。
getSupportedPreviewSizes()がプレビューのための画像の解像度。
それぞれ異なるので注意が必要。