LoginSignup
18
20

More than 5 years have passed since last update.

サクっとディープラーニングくん (初心者のためのchainer非公式サンプルコード)

Last updated at Posted at 2015-12-03

「画像の自動分類プログラムってどうするんですか!?」
「ああ、それはこのページとこのページとこのページを見て。あ、それとこのコード変えないといけないから」
「えぇ…?(困惑」

毎度困られるのが忍びないので、初心者の方に向けて簡単にプログラムをまとめました。
英訳版はこちらです。

下準備

ubuntu 14.04以降
python
 OpenCV 2.4.10
 chainer 1.3.2,1.5.0で動作確認
GeForce Titan X

ソース

github

使い方

1. 画像の準備

とにかく動かしてみたい場合は、画像の準備をする必要はありません。
(サンプル画像があらかじめ準備されています)

"Picture"というフォルダがデフォルトで存在しています。
"Picture"は複数のフォルダをもち、各フォルダは対応するクラスの画像ファイルを持ちます。

階層.png

自分で集めた画像を分類する場合は、この"Picture"を新たに設定する必要があります。

"車"と"バイク"を分類したい場合
1. "Picture"内の既存のフォルダと画像ファイルをすべて削除する。
2. "Picture"内に"car"というフォルダを作成し、"car"内に車の画像ファイルを入れる。
3. "Picture"内に"bike"というフォルダを作成し、"bike"内にバイクの画像ファイルを入れる。

フォルダ名や画像ファイル名は自由ですが、フォルダ名や画像ファイル名はアルファベットもしくは数字からなるものにしてください。
" "(半角スペース)やその他記号を用いる場合、動作は保証されません。

"Picture"内の全ての画像ファイルのうち、9/10がトレーニングデータとして使われ、1/10がテストデータとして使われます。

2. "callvgg.py"の呼び出し

$ python callvgg.py 0

引数はGPU番号です。
GPUは下記のコマンドで確認できます。

$ nvidia-smi

gpu.png

自分の環境では、GPU No.0を使いたい場合、引数を3にします。
(3-[引数]=[GPU No.])
ディープラーニングはとても重い計算になるので、プロセスのないものを使ってあげて下さい。

デフォルトではepoch 100で計算が終わります。
各epochは"Picture"内の全てのトレーニングデータを使います。
100 epochは「全てのトレーニングデータをそれぞれ100回ずつ学習に使った」という意味になります。

3. "callgraph.py"の呼び出し

$ python callgraph.py

"callvgg.py"が終わったあと"callgraph.py"を呼び出してください。
"callgraph.py"は学習中のエラー率の推移グラフ"graph.png"を作成します。

graph.png

青線はトレーニングデータに対するエラー率、緑線はテストデータに対するエラー率です。

"iteration"は「何回プログラムのパラメータを更新したか」を意味します。
デフォルトでは、各iterationで16枚の画像を学習しています。

で、コレどんなモデル使ってるワケ?

OxfordNet(VGGNet)をベースにしたillustration2vecを使っています。

え、学習して終わりなの? 分類は? (2016/01/14追記)

画像を分類するサンプルプログラム"check.py"を準備しました。
"callvgg.py"が終了したあとに"check.py"を呼び出して下さい。

$ python check.py testPicture

"check.py"は"Picture"と同じ形式でフォルダと画像ファイルが入ったフォルダを引数とします。
ただし、実際の画像ファイルは学習に用いた"Picture"のものと異なるものを準備して下さい。
(今回は"testPicture"を例とします)

correct.png

呼び出すと「画像ファイルのパス、分類結果、クラスフォルダと分類結果が一致してるかどうか」を一行ずつ表示します。
これは"tee"コマンドで任意のファイルに保存できます。

$ python check.py testPicture | tee checklog

また、分類精度をcorrect、not correctとして最後に表示します。

学習回数を調整して(10分割)交差検証したいんだけど… (2016/02/18追記)

$ python callvgg.py 0 -E 10

引数-Eでepoch数を指定することが出来ます。
この場合、10 epochで学習を終了します。

$ python callvgg.py 0 -t 9

同様に引数-tに0から9までの値を渡すことで、テストデータと学習データの組み合わせを10パターンから指定することが出来ます。(デフォルトは0です)

実際に使われたテストデータのパスとラベルはtest.txt、学習データのパスとラベルはtrain.txtに格納されます。

参考文献

ChainerのNINで自分の画像セットを深層学習させて認識させる
PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)
chainer-imagenet-vgg
illustration2vec
OxfordNet(VGGNet)

18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20