#導入
##この記事について
いくつかのサイトを見ながらimagenetをなんとか動かすことができたのでその内容を残すために執筆。chainerのサンプルを動かしたというサイトはたくさんあるが、バージョンの違いやコードの違いで詰まったりしてしまうこともありそうなので、実際に動かした環境とその時に使った文献(記事)をまとめる。
##対象
mnistのサンプルをやった人。初心者(僕も初心者なので)
##参考にしたサイト
chainer(v1.14.0)で画像分類をはじめるための覚書
ChainerのNINで自分の画像セットを深層学習させて認識させる
ChainerでcPickle.UnpicklingError
#手順
##環境構築
今回の内容は全てMacOS上で行った。python3でやりたかったけれど、上のサイトが2.xを使っていたみたいなのでAnaconda 2.1.0 (python2.7.13)を使った。pyenvでanaconda2.1.0をインストールして環境を構築した。chainerのバージョンはchainer==1.20.0.1を使った。
##まず初めに
一つ目の記事で公開されているgitからツール群をお借りする。
git clone https://github.com/shi3z/chainer_imagenet_tools.git
二つ目の記事の通りにコードを書き直す。この二つを先にやってしまうと楽。
##画像の用意、教師データとテストデータ
画像は好きなデータセットを使える。[ディレクトリ名/分類クラス名/実ファイル]となっていればなんでも使えるはず。まず最初にすることは、データセットから分類教師データ&テストデータを作る。二つ目の記事の方が用意してくれているプログラムをgit cloneしてそれを使う。
を実行してデータセットを用意。二つ目の記事の方が用意してくれているコードを使って
python make_train_data.py 101_ObjectCategories
することにより画像データを集めたimagesディレクトリと、train.txt, test.txt, label.txtの3ファイルが出力される。中身をみると、train、testは画像へのパスとそれが属する分類クラスの番号が記述されている。
##画像のリサイズ
画像はバラバラなので今回のニューラルネットワークのインプット次元まで下げる必要がある。このために記事で用意してくれているのがcrop.pyである。cropimagesに生成した画像が保存される。ここで、前述したtrain.txt、test.txtには画像へのパスが記述されているが、今回使う画像はcropimagesなので、エディタなどを使って images -> cropimages に置換する。
##学習フェイズ
ここでchainerの[examples/imagenet/]に存在するcompute_mean.pyを使い、meanファイルを生成する。
python compute_mean.py train.txt
にてmeanファイルを生成する。また後者の記事を参考にプログラムを書き換える。ここで書き換えている内容だが、ざっくり言うとモデルの保存にpickelを使っているのをserializerに変えたりする。この辺はchainerのドキュメントをみて勉強するとよさそう。nin.pyには実際のニューラルネットワークのクラスが記述されている。ここをカスタマイズすることで自分の定義したニューラルネットワークを使って学習ができる。
ここまできても、そのままではcPickel関連でエラーが出る人もいるはず。そこでChainerでcPickle.UnpicklingErrorを参照して68~70行目あたりのmeanファイルを読み込む部分を
mean_image = np.load(args.mean) #meanファイルの読み込み
に書き換える。これでようやく実行できるはず。
python train_imagenet.py -E 10 train.txt test.txt 2>&1 | tee log
この実行によってmodelファイルが出力される。(学習後のニューラルネットワークをダンプしたもの)
##画像分類の実行
冒頭で載せた記事では出力されたmodelを使って、テストデータ外のデータを使って分類がうまく行くかを実験している。手順としてはテストする画像のリサイズ、分類である。
画像は記事にのっているオートバイの画像をそのまま使うとして
wget http://www.trago.co.uk/ekmps/shops/tragoshop/images/wk-650i-motorbike-35kw-restricted-version-for-a2-license-available-white-blue-35677-p.jpg
mv wk-650i-motorbike-35kw-restricted-version-for-a2-license-available-white-blue-35677-p.jpg bike.jpg
mkdir resized
あとは実行するだけ
python resize.py bike.jpg
python inspection.py resized/bike.jpg
画面に結果がでるはず。
#感想
資料がたくさん出回っているのでサンプルを動かして簡単に機械学習が楽しめる。python2.xではなくpython3で動かしたかったのが残念。今後の記事では画像からの顔の切り出しとそれを用いた人物分類をしてみたい。
chainerのサンプルコードはファイル数も多く見えたりするが、学習に使ったのはtrain_imagenet.pyやnin.pyのみであとは教師データを作ったりテストしたりするコードなのでこれらのコードを中心に読めば理解がしやすいかと思う。