専門家でないので、訳のおかしなところがあるのでご了承を
ImageNetによる分類
Caffeは、python/caffe/pycaffe.pyのcaffe.Netにより、python用のインタフェースを提供している。簡単に既成の分類ができるように、caffe.Classifierクラスと、classify.pyスクリプトを提供している。Python and MATLAB向けのラッパーを提供している。Python ラッパーは多くの特徴を有しており、ここで説明する。MATLAB向けは、matlab/caffe/matcaffe_demo.mを参考に注意
ソースコードのコメントに、触れられていないが、ソースのコメントは重要である。
In [1]:
説明なし
In [2]:
ネットワークの読み込みは簡単。caffe.Classifierがすべて面倒を見る
入力の前処理用のパラメータ構成
平均配列(mean)を与えることにより平均値の減算を行う
入力チャネルの入れ替え(channel_swap)は、RGBの並びを、ImageNetのBGR並びにする
スケール変換(raw_scale)は、入力値の[0:1]スケールをImageNet モデルの[0,255]に変更する
In [3]:
テストを行うなうので、フェーズをテストに設定する。最初は、計算をCPUで行う。
In [4]:
Out[4]:
Caffeの読み込みを利用し、サンプル画像を見てみる。
In [5]:
デフォルトでは、入力画像の、中心と4隅を切り出し、また、それぞれ反転画像を使用し、10回予測を行い、平均を計算する。
予測は1000次元で、希薄であることがわかる。予測クラスID281は、Tabby catである。
もし、 ../data/ilsvrc12/get_ilsvrc_aux.shを使用して、imagenetのデータを取得した場合は、我々のモデルは、 ../data/ilsvrc12/synset_words.txtに記されている、synsetのIDを使用している。予測スコアの最大値が示してるものを見ると、猫、キツネ、および他の可愛い哺乳類である。おかしくない結果ではないか
In [6]:
oversamplingをやめて中心の切り取り画像で分類してみよう。これは、1つの入力を示している。もし、モデル定義のprototxtを見てみると、networkのバッチサイズは10であることがわかる。pythonラッパが、バッチの処理を行う。
In [7]:
分類にかかる時間を見ることはできないのか。今回、Intel i5 CPUを使用しており、パフォーマンスの違いを見てみよう。
1回の処理 355msec
若干遅い気がするが、これには、切り出し、pythonインタフェース、10回の計算が含まれている。もう少し予測を速くしたいのであれば、C++で記述し、パイプライン処理を行うとよい。プロトタイプには、これくらいの速度があれば良い
In [8]:
前処理により、1枚の画像で分類してみる。
1回の処理 210msec
In [9]:
GPUを使用した場合はどうか、設定は簡単
In [10]:
Out[10]:
結果が同じか見てみよう。すべて同じである。
In [11]:
GTX 770 GPUを使用した同じマシンで、GPUの処理時間を見てみよう
Full pipeline timing.
1回の処理 174msec
Forward pass timing.
1回の処理 34.2msec
十分速いだろうが、期待した速度ではないかもしれない。Pythonデモで4倍の速度向上を得ている。GPUのコードは、実際とても速いが、データの転送、フォーマット変換などのオーバヘッドに数倍時間がかかっている。
GPUの処理能力を活かすには、
・バッチを大きくする、python呼び出しや、データ転送のオーバヘッドを小さくする
・subprocessに分割し、パイプライン処理を行う
・データセットが大きい場合には、面倒だがC++を使用する
最後に
これは、Pyhonである。十分に使いやすい。boost::pythonのラッパーであり、pycaffe.pyのpython/caffeクラスにメインのインタフェースのソースが書かれている。また、classifier.pyに、分類用のラッパーがある。
あなた自身のカスタマイズを行うことができるので、改良を行い、我々にpull requestを送って欲しい。
0 件のコメント:
コメントを投稿