Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2015-07-09

ChainerのNINで自分の画像セットを深層学習させて認識させる 08:20

 Caffeに関してはいいテキストがあるのに、chainerはまだ出たばかりなので圧倒的に情報が少ない。

 僕も日頃からchainerにはお世話になっているので、なんとか貢献したい。


 というわけで、とりあえずCaffeでは定番となっている以下のようなタスクをやってみたメモ

 ちなみにNVIDIA CUDA GPU必須(GTX680でひとまず検証済み)。Ubuntu14.04で動作確認

Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog

http://techblog.yahoo.co.jp/programming/caffe-intro/


 要するに、画像データセットをとってきて、学習させるところまではみんなやるのよ。

 たとえばHi-Kingさんとか

PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1) - 人工言語処理入門

http://hi-king.hatenablog.com/entry/2015/06/11/021144


  で、これは素晴らしいんだけど、学習してテストしてエラーレートが下がっていって・・・っていうのは解るんだけど、実用的に使うには「で、結局、この画像はなんだと思うワケ?」と問い詰めないとならない。その問い詰め方についてはどこにも書いてない。研究者ならそれでいいのかもしれないけどさー。


 オレのオレによるオレのための一般物体認識はどうすりゃいいの?人工知能をどうやって調教するの?


 という疑問が拭えませんので、ここらへんを効率的にやるスクリプトをぽちぽち書いてみたというわけで候。


 たとえばCaltech 101のように、フォルダの中にカテゴリ(クラス)ごとに分かれたサブフォルダがあって、そこにそれぞれのクラスに対応した画像が入ってる、なんていうパターンを考える。


 とりあえずデータセットをつくるために作ったスクリプトをgithub(https://github.com/shi3z/chainer_imagenet_tools/)に置いた。

 ちなみにpythonは書き慣れてないのでコードは汚い。許して。

$ git clone https://github.com/shi3z/chainer_imagenet_tools.git
$ cd chainer_imagenet_tools

 それからCaltech 101をダウンロードして展開してみる。

$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar xzvf 101_ObjectCategories.tar.gz

 するとこんな感じのフォルダに分かれていろんな画像が収納されている。

http://i.gyazo.com/711169672e2943588a80d3afbe6d08c8.png


 よし、準備OK

 ここでさっきcloneしたスクリプトを使う。

$ python make_train_data.py 101_ObjectCategories

 んで、これがうまく行くとtrain.txtとtest.txt、label.txtという三種の神器が出来上がる。

 あとはcompute_mean.pyしてmean.npyを生成したりというのはHi-Kingさんのエントリの通り。

$ python ~/chainer/examples/imagenet/compute_mean.py train.txt

 ただし、トレーニングするときはあとでnin.pyをそのまま使うのでちょっと変形させtrain_imagenet.pyを使う。

 nin.pyはforwardに加えて推測だけを行うpredictというメソッドを追加している。chainerのモデルデータはオブジェクトの単純なダンプなので、これを使って学習させなくてはならない。


$ python train_imagenet.py  -g 0 -E 20000 train.txt test.txt 2>&1 | tee log

 学習が始まる。

 頃合いを見て別のターミナルを開き、学習成果を確かめてみよう。

 手元に適当な画像を持ってきて、それを認識させてみる。

 認識用に画像をリサイズするといい

 リサイズ用のスクリプトも書いた。

$ python resize.py ramen.jpg
$ python inspection.py _ramen.png

 すると認識した結果が表示される。

http://i.gyazo.com/ef07a9632bed678860507167aa5102b7.png

 まだこれは学習がぜんぜん進んでないので、ラーメンを地図と解釈してしまってるが、学習が進むと上手く解釈してくれるのではないだろうか。


 けっこうメモリ (特にVRAM)を食うので、AWSのg2サーバーあたりだと学習しながら同時に認識させるとメモリーオーバーフローするかも。手元のGTX680ではそうなった。


 このスクリプトは少し改造するだけでカメラ画像に映ったものをリアルタイムに解釈するものにできる。

 ゴリラ、とか判定されたら殺意が沸くかも知れないが


 しかしディープラーニングやろうとなるとPythonのコードを書いたり読んだりしないとならない。

 Python、ついにやらなきゃならんかあ。


 Pythonの文法を全く学ばずに書こうとしたので、いろいろわからなくて苦戦したが、この本を読んだら最低限の文法がコンパクトにまとまっていて理解できた。


基礎から始めるPython

基礎から始めるPython


 Kindleだし、安いし、オススメ。

 Pythonは他の言語に比べて独自のデータ構造や独特な記法が多いので文法はしっかり抑えておかないとだめだなあ。