2014年12月9日火曜日

CaffeのImageNetモデルを使用した分類の説明を訳してみた

Masaki Saito氏が、Caffeのチュートリアルに関する資料を公開してくれたが、理解できないことが多数あったので、本家のドキュメントを訳してみた。
専門家でないので、訳のおかしなところがあるのでご了承を

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 件のコメント:

コメントを投稿