「画像の自動分類プログラムってどうするんですか!?」
「ああ、それはこのページとこのページとこのページを見て。あ、それとこのコード変えないといけないから」
「えぇ…?(困惑」
毎度困られるのが忍びないので、初心者の方に向けて簡単にプログラムをまとめました。
英訳版はこちらです。
下準備
ubuntu 14.04以降
python
OpenCV 2.4.10
chainer 1.3.2,1.5.0で動作確認
GeForce Titan X
ソース
使い方
1. 画像の準備
とにかく動かしてみたい場合は、画像の準備をする必要はありません。
(サンプル画像があらかじめ準備されています)
"Picture"というフォルダがデフォルトで存在しています。
"Picture"は複数のフォルダをもち、各フォルダは対応するクラスの画像ファイルを持ちます。
自分で集めた画像を分類する場合は、この"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 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"を作成します。
青線はトレーニングデータに対するエラー率、緑線はテストデータに対するエラー率です。
"iteration"は「何回プログラムのパラメータを更新したか」を意味します。
デフォルトでは、各iterationで16枚の画像を学習しています。
で、コレどんなモデル使ってるワケ?
OxfordNet(VGGNet)をベースにしたillustration2vecを使っています。
え、学習して終わりなの? 分類は? (2016/01/14追記)
画像を分類するサンプルプログラム"check.py"を準備しました。
"callvgg.py"が終了したあとに"check.py"を呼び出して下さい。
$ python check.py testPicture
"check.py"は"Picture"と同じ形式でフォルダと画像ファイルが入ったフォルダを引数とします。
ただし、実際の画像ファイルは学習に用いた"Picture"のものと異なるものを準備して下さい。
(今回は"testPicture"を例とします)
呼び出すと「画像ファイルのパス、分類結果、クラスフォルダと分類結果が一致してるかどうか」を一行ずつ表示します。
これは"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)